programacion - manual de android en pdf
TransmisiĆ³n de audio desde una URL en Android usando MediaPlayer? (7)
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
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 .
Buscando mis proyectos:
- 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!
- 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.
No se puede llamar a mp.start con OnPreparedListener para evitar el estado cero en el registro.
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<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;
}
}
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!
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.
Utilizar
mediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaplayer.prepareAsync();
mediaplayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaplayer.start();
}
});