J'ai essayé de diffuser des mp3 sur http en utilisant la classe MediaPlayer intégrée à Android. La documentation me suggère 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 également essayé différentes URL. 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
android
mp3
android-mediaplayer
audio-streaming
Pandalover
la source
la source
Réponses:
Lecteur multimédia simple avec exemple de streaming.Pour la partie xml, vous avez besoin d'un bouton avec id button1 et de deux images dans votre dossier dessinable avec le nom button_pause et button_play et 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; } }
la source
Android MediaPlayer ne prend pas en charge le streaming de MP3 de manière native jusqu'à la version 2.2. Dans les anciennes versions du système d'exploitation, il semble que le flux 3GP ne soit diffusé qu'en mode natif. Vous pouvez essayer le code pocketjourney, bien qu'il soit ancien (il y a une nouvelle version ici ) et j'ai eu du mal à le rendre collant - il bégayait chaque fois qu'il remplissait le tampon.
L'application NPR News pour Android est open source et utilise un serveur proxy local pour gérer le streaming MP3 dans les versions du système d'exploitation antérieures à la 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=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3
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 parfois «l'erreur (-38, 0)» lors de la diffusion. Cela peut être un problème de thread ou un problème de changement de réseau. Vérifiez le suivi des problèmes pour les mises à jour .
la source
Je suppose que vous essayez de jouer un .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
Cette URL est de la BBC à titre d'exemple. C'était un fichier .pls que j'ai téléchargé sous Linux avec
wget http://foo.bar/file.pls
puis j'ai ouvert avec vim (utilisez votre éditeur préféré;) et j'ai vu les vraies URL à l'intérieur de ce fichier. Malheureusement, tous les .pls ne sont pas du texte brut comme ça.
J'ai lu que 1.6 ne prendrait pas en charge le streaming mp3 sur http, mais, je viens de tester le code ci-dessus avec Android 1.6 et 2.2 et je n'ai eu aucun problème.
bonne chance!
la source
Utilisation
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaplayer.prepareAsync(); mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaplayer.start(); } });
la source
J'ai eu la même erreur que vous et il s'est avéré qu'il n'y avait rien de mal 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.
la source
À la recherche de mes projets:
la source
Aucun appel mp.start avec un OnPreparedListener pour éviter l'état zéro dans le journal.
la source