Transmisión de audio desde una URL en Android usando MediaPlayer?

He intentado transmitir mp3 por HTTP con la clase MediaPlayer de Android. La documentación me sugiere que esto debería ser tan fácil como:

MediaPlayer mp = new MediaPlayer(); mp.setDataSource(URL_OF_FILE); mp.prepare(); mp.start(); 

Sin embargo, estoy recibiendo lo siguiente varias veces. He intentado diferentes URL también. Por favor, no me digas que la transmisión no funciona en 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) 

Cualquier ayuda muy apreciada, gracias S

Reproductor multimedia simple con un ejemplo de transmisión. Para la parte xml necesita un botón con el botón id1 y dos imágenes en su carpeta dibujable con el nombre button_pause y button_play y no olvide agregar el permiso de internet en su manifiesto.

 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 { 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 no es compatible con la transmisión de MP3 de forma nativa hasta 2.2. En versiones anteriores del sistema operativo, parece solo transmitir 3GP de forma nativa. Puedes probar el código de bolsillo, aunque es viejo (hay una nueva versión aquí ) y tuve problemas para hacerlo pegajoso, ya que tartamudeaba cada vez que recargaba el búfer.

La aplicación NPR News para Android es de código abierto y utiliza un servidor proxy local para manejar la transmisión de MP3 en versiones del sistema operativo anteriores a la 2.2. Puede ver el código relevante en las líneas 199-216 (r94) aquí: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/ PlaybackService.java?r=7cf2352b5c3c0fbcdc18a5a8c67d836577e7e8e3

Y esta es la clase StreamProxy: http://code.google.com/p/npr-android-app/source/browse/Npr/src/org/npr/android/news/StreamProxy.java?r=e4984187f45c39a54ea6c88f71197762dbe10e72

La aplicación NPR también sigue recibiendo el “error (-38, 0)” a veces durante la transmisión. Esto puede ser un problema de subprocesamiento o un problema de cambio de red. Compruebe el rastreador de problemas para las actualizaciones .

Supongo que estás intentando jugar un .pls directamente o algo similar.

probar esto:

1: el código

 mediaPlayer = MediaPlayer.create(this, Uri.parse("http://vprbbc.streamguys.net:80/vprbbc24.mp3")); mediaPlayer.start(); 

2: el archivo .pls

Esta URL es de BBC solo como un ejemplo. Era un archivo .pls que en Linux descargué con

 wget http://foo.bar/file.pls 

y luego abrí con vim (use su editor favorito;) y he visto las URL reales dentro de este archivo. Lamentablemente, no todos los .pls son texto simple como ese.

He leído que 1.6 no es compatible con la transmisión de mp3 a través de http, pero acabo de probar el código obove con Android 1.6 y 2.2 y no tuve ningún problema.

¡buena suerte!

Utilizar

  mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaplayer.prepareAsync(); mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mediaplayer.start(); } }); 

Tuve el mismo error que tú y resultó que no había nada de malo en el código. El problema era que el servidor web estaba enviando un encabezado de tipo de contenido incorrecto.

Pruebe wireshark o algo similar para ver qué tipo de contenido está enviando el servidor web.

No se puede llamar a mp.start con OnPreparedListener para evitar el estado cero en el registro.

Buscando mis proyectos:

  1. https://github.com/master255/ImmortalPlayer http / FTP support, Un hilo para leer, enviar y guardar en la memoria caché de datos. La forma más simple y el trabajo más rápido. Lógica compleja: ¡la mejor manera!
  2. https://github.com/master255/VideoViewCache Videoview simple con caché. Dos hilos para jugar y guardar datos. Mala lógica, pero si lo necesita, use esto.