J'ai essayé de diffuser des fichiers MP3 via http en utilisant la classe MediaPlayer d'Android. La documentation me suggèrerait que cela devrait être aussi simple que:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URL_OF_FILE);
mp.prepare();
mp.start();
Cependant, je reçois ce qui suit à plusieurs reprises. J'ai aussi essayé différentes URL. S'il vous plaît ne me dites pas que le streaming ne fonctionne pas sur les mp3.
E/PlayerDriver( 31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
W/PlayerDriver( 31): PVMFInfoErrorHandlingComplete
E/MediaPlayer( 198): error (1, -4)
E/MediaPlayer( 198): start called in state 0
E/MediaPlayer( 198): error (-38, 0)
E/MediaPlayer( 198): Error (1,-4)
E/MediaPlayer( 198): Error (-38,0)
Toute aide très appréciée, merci S
lecteur multimédia simple avec exemple de diffusion. Pour la partie xml, vous avez besoin d’un bouton avec l’identifiant button1 et de deux images dans votre dossier pouvant être dessiné, portant les noms button_pause et button_play. N'oubliez pas d’ajouter l’autorisation Internet dans votre manifeste.
public class MainActivity extends Activity {
private Button btn;
/**
* help to toggle between play and pause.
*/
private boolean playPause;
private MediaPlayer mediaPlayer;
/**
* remain false till media is not completed, inside OnCompletionListener make it true.
*/
private boolean intialStage = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.button1);
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
btn.setOnClickListener(pausePlay);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private OnClickListener pausePlay = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
if (!playPause) {
btn.setBackgroundResource(R.drawable.button_pause);
if (intialStage)
new Player()
.execute("http://www.virginmegastore.me/Library/Music/CD_001214/Tracks/Track1.mp3");
else {
if (!mediaPlayer.isPlaying())
mediaPlayer.start();
}
playPause = true;
} else {
btn.setBackgroundResource(R.drawable.button_play);
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
playPause = false;
}
}
};
/**
* preparing mediaplayer will take sometime to buffer the content so prepare it inside the background thread and starting it on UI thread.
* @author piyush
*
*/
class Player extends AsyncTask<String, Void, Boolean> {
private ProgressDialog progress;
@Override
protected Boolean doInBackground(String... params) {
// TODO Auto-generated method stub
Boolean prepared;
try {
mediaPlayer.setDataSource(params[0]);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
intialStage = true;
playPause=false;
btn.setBackgroundResource(R.drawable.button_play);
mediaPlayer.stop();
mediaPlayer.reset();
}
});
mediaPlayer.prepare();
prepared = true;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
Log.d("IllegarArgument", e.getMessage());
prepared = false;
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
prepared = false;
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
prepared = false;
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
prepared = false;
e.printStackTrace();
}
return prepared;
}
@Override
protected void onPostExecute(Boolean result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (progress.isShowing()) {
progress.cancel();
}
Log.d("Prepared", "//" + result);
mediaPlayer.start();
intialStage = false;
}
public Player() {
progress = new ProgressDialog(MainActivity.this);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
this.progress.setMessage("Buffering...");
this.progress.show();
}
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if (mediaPlayer != null) {
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}
}
Android MediaPlayer ne prend pas en charge la lecture en continu de fichiers MP3 jusqu'à la version 2.2. Dans les anciennes versions du système d'exploitation, il semble que seul le 3GP soit diffusé en mode natif. Vous pouvez essayer le code pocketjourney, bien qu'il soit vieux (il y a une nouvelle version ici ) et que j'ai eu du mal à le rendre collant - il bégayerait dès qu'il remplirait le tampon.
L'application NPR News pour Android est une source ouverte. Elle utilise un serveur proxy local pour gérer la lecture en continu de fichiers MP3 dans les versions du système d'exploitation antérieures à 2.2. Vous pouvez voir le code correspondant aux lignes 199-216 (r94) ici: http://code.google.com/p/npr-Android-app/source/browse/Npr/src/org/npr/Android/news/PlaybackService.java?r=7cf2352b5c3f0cbcdc18c8c8cdc18a5a8a7a
Et voici la classe StreamProxy: http://code.google.com/p/npr-Android-app/source/browse/Npr/src/org/npr/Android/news/StreamProxy. java? r = e4984187f45c39a54ea6c88f71197762dbe10e72
L'application NPR reçoit également toujours "l'erreur (-38, 0)" parfois lors de la diffusion. Cela peut être un problème de threading ou un problème de changement de réseau. Vérifiez le suivi des problèmes pour les mises à jour .
Je suppose que vous essayez de jouer un fichier .pls directement ou quelque chose de similaire.
essayez ceci:
1: le code
mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3"));
mediaPlayer.start();
2: le fichier .pls
Cet URL provient de la BBC à titre d'exemple. C’était un fichier .pls que, sur Linux, j’ai téléchargé avec
wget http://foo.bar/file.pls
et puis j'ai ouvert avec vim (utilisez votre éditeur favori;) et j'ai vu les vraies URL à l'intérieur de ce fichier. Malheureusement, tous les fichiers .pl ne sont pas en clair.
J'ai lu que la 1.6 ne prendrait pas en charge le streaming mp3 sur http, mais je viens de tester le code obove avec Android 1.6 et 2.2 et je n'ai aucun problème.
bonne chance!
Utilisation
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaplayer.prepareAsync();
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.start();
}
});
J'ai eu la même erreur que vous et il s'est avéré qu'il n'y avait aucun problème avec le code. Le problème était que le serveur Web envoyait le mauvais en-tête Content-Type.
Essayez Wireshark ou quelque chose de similaire pour voir quel type de contenu le serveur Web envoie.
Regarder mes projets:
Aucun appel mp.start avec un OnPreparedListener pour éviter l'état zéro dans le journal.