Android 2.2 MediaPlayer fonctionne bien avec une URL SHOUTcast mais pas avec une autre
Veuillez voir le code que j'utilise pour le streaming stream shoutcast, il fonctionne avec une URL, mais PAS avec l'autre.
Celui-ci fonctionne:
Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");
Mais pas avec celui-ci:
Uri myUri = Uri.parse("http://someOtherURL");
SimpleMusicStream.java
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class SimpleMusicStream extends Activity implements
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener {
private String TAG = getClass().getSimpleName();
private MediaPlayer mp = null;
private Button play;
private Button pause;
private Button stop;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
play.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
play();
}
});
pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
pause();
}
});
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
stop();
}
});
}
private void play() {
Uri myUri = Uri.parse("http://fr3.ah.fm:9000/");
try {
if (mp == null) {
this.mp = new MediaPlayer();
} else {
mp.stop();
mp.reset();
}
mp.setDataSource(this, myUri); //Go to Initialized state
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(this);
mp.setOnBufferingUpdateListener(this);
mp.setOnErrorListener(this);
mp.prepareAsync();
Log.d(TAG, "LoadClip Done");
} catch (Throwable t) {
Log.d(TAG, t.toString());
}
}
@Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Stream is prepared");
mp.start();
}
private void pause() {
mp.pause();
}
private void stop() {
mp.stop();
}
@Override
public void onDestroy() {
super.onDestroy();
stop();
}
public void onCompletion(MediaPlayer mp) {
stop();
}
public boolean onError(MediaPlayer mp, int what, int extra) {
StringBuilder sb = new StringBuilder();
sb.append("Media Player Error: ");
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
sb.append("Not Valid for Progressive Playback");
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
sb.append("Server Died");
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
sb.append("Unknown");
break;
default:
sb.append(" Non standard (");
sb.append(what);
sb.append(")");
}
sb.append(" (" + what + ") ");
sb.append(extra);
Log.e(TAG, sb.toString());
return true;
}
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
}
}
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:text="Play"
android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button
android:text="Pause"
android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button
android:text="Stop"
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
Le Journal de chat montre des erreurs:
NuHTTPDataSource(33): Server did not give us the content length!
Media Player Error: Unknown (1) -2147483648
Media Player Error: Unknown (1) -1002
Quelqu'un peut-il m'aider à résoudre ce problème?
EDIT:
Juste pour partager avec vous les gens, que notre code actuel fonctionne avec Android 2.1 & les versions mineures, mais fonctionne pas avec Android 2.2 ou supérieur.
Grâce
source d'informationauteur Yaqub Ahmad
Vous devez vous connecter pour publier un commentaire.
Shoutcast mp3 en streaming à partir d'Android 2.2 partir est pris en charge nativement .
Ci-dessous 2.2 le système d'exploitation Android ne peut pas jouer shoutcast flux nativement sans l'aide d'un proxy sur le jet fin ou un cours d'eau classe de proxy sur l'appareil pour capturer le flux et le transmettre à l'audioplayer comme NPR.
audio/aacp streaming n'est pas pris en charge directement . Pour cela, vous pouvez utiliser ffmpeg, opencore ou faad2 bibliothèque pour les décoder en PCM et jouer en utilisant audiotrack .Référence
problème est l'encodage audio/aacp
Problème est que aacp n'est pas rendu par Android Media Player correctement. Vous devrez essayer d'autres codec ou écrire votre propre décodeur.
Mediaplayer
prend en charge uniquement les ces formats comme donné dans l'android developer documents.Certains cours d'eau peut être satisfaisant,mais certains ne seront pas d'
Il y a un Freeware Audio Avancé (AAC) Décodeur pour Android. Vous pouvez l'utiliser pour obtenir de l'aide et de l'Orientation ou de l'utilisation Multijoueur classe à la lecture de l'audio aac. Il y a un exemple d'application et de la bibliothèque en elle pour vous aider à comprendre. J'ai utilisé cette bibliothèque à jouer Shoutcast en ligne. J'ai joué les deux AAC et MP3 à l'aide de Multijoueur classe fournis dans la bibliothèque
Espère que cette aide
Enfin, je me suis simple flux shoutcast app.
Essayez cette. Il suffit de changer les url de streaming en StreamService.java.