Android MediaPlayer se está preparando demasiado tiempo
Hola, estoy usando MediaPlayer para reproducir un flujo regular de ShoutCast. El código es sencillo con prepareAsync () y un controlador para iniciar la reproducción. Mientras que funciona perfectamente con algunos flujos como DI.FM o ETN.FM (http://u10.di.fm:80/di_progressive), con otros (http://mp3.wpsu.org:8000/) ganó ' T pasa el estado de preparación. No se llama a otros oyentes.
//Uri streamUri = Uri.parse("http://u10.di.fm:80/di_progressive"); /* works */ Uri streamUri = Uri.parse("http://mp3.wpsu.org:8000/"); /* stuck on prepare state */ MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setOnPreparedListener(new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { mp.start(); } }); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(this.getBaseContext(), streamUri); mediaPlayer.prepareAsync();
Cualquier comentario es apreciado!
- ¿Cómo desarrollar un reproductor de video que recibe transmisión de video en la difusión wi-fi / multidifusión?
- Cómo reproducir el archivo de audio Mp3 desde el servidor
- SetVideoSurfaceTexture ha fallado: -22 en mediaplayer
- Android Audio SeekBar
- SurfaceView en blanco al reproducir vídeo usinng mediaplayer
- Impedir mi aplicación de audio con NuPlayer en Android Lollipop 5.x?
- Android Mediaplayer: problema de setDataSource para el archivo de medios descargado
- ¿Cómo implementar un reinicio de MediaPlayer en errores en Android?
- Adición de efectos de audio personalizados al reproductor de audio de Android
- Cómo rotar video * .mp4 en SurfaceView?
- Android - ¿Cómo puedo permitir que una instancia de MediaPlayer se reproduzca a la vez?
- Android MediaPlayer: onErrorListener y onCompletionListener trabajando ab-normalmente
- Borrar el marco de video de la vista de superficie en video completado
Creo que hay algunos problemas de compatibilidad con el servidor final. Esto es bastante extraño ya que el emulador maneja ok en mi caso – no sólo en mi Froyo Galaxy S, a pesar de que es la misma versión de la API.
Podría ser un problema de códec, http streaming cuestión, no lo sé. Pero todos los servidores que fallan tienden a ser los antiguos, con "Copyright 1998 – 2004" en la parte inferior … No es exactamente reciente o hasta la fecha se podría pensar.
Una solución potencial (que no he probado aún) sería utilizar StreamProxy , lo que también haría que tu código sea compatible con 2.1 y posiblemente versiones anteriores también. A costa de trabajo extra, código extra, y sin duda errores adicionales …
En caso de que no lo sepas, hay otro informe de error de reproductor para 2.2 que también puede ser relevante: El audio de streaming básico funciona en 2.1 pero no en 2.2
Estoy frente a un problema cuando MP "cuelga" en la preparación de estado demasiado tiempo (secuencia) y estoy tratando de detenerlo utilizando reset (). Esto hace que MP se bloquee y, por lo tanto, se congela toda la aplicación. Parece que no hay manera de detener a MP en la preparación del estado. Estoy pensando en usar prepare () envuelto en hilo en lugar de prepareAsync (). Entonces podré matar ese hilo. Por ahora lo hice de la siguiente manera:
private void actionCancel(){ try { mp.setDataSource(new String()); } catch (Exception e) { e.printStackTrace(); android.util.Log.d(TAG,"actionCancel(): mp.setDataSource() exception"); mp.reset(); } }
Y funciona 4me.
Además tengo un contador siguiente:
@Override public void onBufferingUpdate(final MediaPlayer mp, final int percent) { if (!mp.isPlaying()){ // android.util.Log.d(TAG,"onBufferingUpdate(): onBufferingUpdateCount = "+onBufferingUpdateCount); if (onBufferingUpdateCount>MAX_BUFFERING_UPDATES_AT_PREPARING_STATE) restartMP(); onBufferingUpdateCount++; return; } }
Descubrí que este oyente siempre se activa en la preparación del estado. Así que si se dispara más de 10 veces y MP todavía no está jugando sólo estoy reiniciándolo:
private void restartMP(){ if (mp!=null) if (mpState==MediaPlayerState.Preparing) actionCancel(); else mp.reset(); else mp = new MediaPlayer(); mpState = MediaPlayerState.Idle; onBufferingUpdateCount=0; //isRequestCancelled=false; requestTrackInfoStartedAt=0; requestPlay(); }
Note MediaPlayerState es mi enum personalizado que tiene "Preparar" el valor. También mpState es una propiedad / campo de clase que contiene el estado actual de MediaPlayerState. Antes de comenzar prepareAsync () im setting mpState to MediaPlayerState.Preparing después de que termine im fijándolo a MediaPlayerState.Started u otro valor correspondiente.
- ¿Debería mi lógica de negocio estar en el fragmento o en la actividad anterior?
- El flash de la cámara Nexus 4 no se dispara cuando el modo de enfoque está ajustado en imagen continua