android - Error de MediaPlayer(1,-1004) también conocido como MEDIA_ERROR_IO que intenta transmitir música en Samsung S3
streaming android-mediaplayer (4)
NOTA: no estoy trabajando en la empresa en la que trabajé cuando publiqué esta pregunta, por lo tanto, a pesar de que podrían surgir algunas respuestas geniales, no las estaré probando ya que no tengo una razón para hacerlo (aparte de promocionando a la comunidad, lo que podría causar que lo haga algún día) .
Sin embargo, si otros miembros de la comunidad promueven alguna respuesta al problema, puedo optar por seleccionarlo como la respuesta correcta al problema experimentado tantos años después de que originalmente publiqué la pregunta.
Mientras tanto, espero que algunas de las respuestas puedan ayudar a algunos de ustedes que también experimentan este problema. Yay para desbordamiento de pila!
Nuestra aplicación tiene que transmitir música desde una fuente en línea (no estoy en libertad de divulgar esa fuente).
¿Por qué se tarda más de 2 minutos en iniciar la transmisión en el S3?
He podido averiguar que el objeto Media Player entra en el estado de error debido a MEDIA_ERROR_UNKOWN - excelente. No me ayuda mucho. Entonces, al manejar esto en onError con un OnErrorListener, reinicio el objeto Media Player y luego llamo a startPlaying, que se encarga del resto, configurando la fuente de datos, etc.
Miembros:
private ProgressBar playSeekBar;
private ImageView ivPlay;
private ImageView ivPause;
private ImageView ivBuffer;
private MediaPlayer mPlayer;
private ImageView ivInfo;
private AudioManager audio;
Inicializar el reproductor multimedia (y el visualizador, que no es el problema para el propósito de esta pregunta)
private void initialMediaPlayerAndVisualizer() {
Log.d(TAG, "Initial Media Player and Visualizer");
playSeekBar = (ProgressBar) findViewById(R.id.progressBar1);
playSeekBar.setMax(100);
playSeekBar.setVisibility(View.GONE);
mPlayer = new MediaPlayer();
Log.d(TAG, "Create onErrorListener");
MediaPlayer.OnErrorListener errorListener = new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d(TAG, "OnError - Error code: "+what+" Extra code: "+extra);
switch(what){
case -1004:
Log.d("Streaming Media", "MEDIA_ERROR_IO");
break;
case -1007:
Log.d("Streaming Media", "MEDIA_ERROR_MALFORMED");
break;
case 200:
Log.d("Streaming Media", "MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK");
break;
case 100:
Log.d("Streaming Media", "MEDIA_ERROR_SERVER_DIED");
break;
case -110:
Log.d("Streaming Media", "MEDIA_ERROR_TIMED_OUT");
break;
case 1:
Log.d("Streaming Media", "MEDIA_ERROR_UNKNOWN");
break;
case -1010:
Log.d("Streaming Media", "MEDIA_ERROR_UNSUPPORTED");
break;
}
switch(extra){
case 800:
Log.d("Streaming Media", "MEDIA_INFO_BAD_INTERLEAVING");
break;
case 702:
Log.d("Streaming Media", "MEDIA_INFO_BUFFERING_END");
break;
case 701:
Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
break;
case 802:
Log.d("Streaming Media", "MEDIA_INFO_METADATA_UPDATE");
break;
case 801:
Log.d("Streaming Media", "MEDIA_INFO_NOT_SEEKABLE");
break;
case 1:
Log.d("Streaming Media", "MEDIA_INFO_UNKNOWN");
break;
case 3:
Log.d("Streaming Media", "MEDIA_INFO_VIDEO_RENDERING_START");
break;
case 700 :
Log.d("Streaming Media", "MEDIA_INFO_VIDEO_TRACK_LAGGING");
break;
}
Log.d("Streaming Media", "Reset media player");
mPlayer.reset();
// We need to link the visualizer view to the media player so that it displays something
mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);
//Send the visualizerContainer to the Renderer
visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
mVisualizerManager.addRenderer(visualizerRenderer);
try {
startPlaying();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
};
Log.d(TAG, "Set error listener on Media Player object");
mPlayer.setOnErrorListener(errorListener);
// We need to link the visualizer view to the media player so that it displays something
mVisualizerManager = new VisualizerManager(context); //(VisualizerView) findViewById(R.id.visualizerView);
//Send the visualizerContainer to the Renderer
visualizerRenderer = new VisualizerRenderer(arrayVisualizer);
mVisualizerManager.addRenderer(visualizerRenderer);
try {
startPlaying();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Empieza a jugar
private void startPlaying () throws IllegalStateException, IOException, UnsupportedOperationException
{
if(mPlayer != null){
ivPause.setVisibility(View.INVISIBLE);
ivPlay.setVisibility(View.INVISIBLE);
ivBuffer.setVisibility(View.VISIBLE);
mVisualizerManager.link(mPlayer);
mPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
playSeekBar.setSecondaryProgress(percent);
Log.i("Buffering", "" + percent);
}
});
try {
mPlayer.setDataSource(theSource);
} catch (IllegalArgumentException e) {
Log.d(TAG, "Illegal Argument Exception: "+e);
e.printStackTrace();
} catch (IllegalStateException e) {
Log.d(TAG, "Illegal State Exception: "+e);
e.printStackTrace();
} catch (IOException e) {
Log.d(TAG, "IO Exception: "+e);
e.printStackTrace();
}
mPlayer.prepareAsync();
mPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
ivBuffer.setVisibility(View.INVISIBLE);
bars.setVisibility(View.INVISIBLE);
visualizerContainer.setVisibility(View.VISIBLE);
ivInfo.setImageResource(R.drawable.img_radio_info_online);
ivPause.setVisibility(View.VISIBLE);
ivPlay.setVisibility(View.INVISIBLE);
//Mute the video if the phone is muted.
if ((audio.getRingerMode() == AudioManager.RINGER_MODE_SILENT) || (audio.getRingerMode() == AudioManager.RINGER_MODE_VIBRATE)) {
mp.setVolume(0, 0);
Toast toast = Toast.makeText(context, R.string.device_muted, Toast.LENGTH_LONG);
toast.show();
}
mPlayer.start();
}
});
}else{
Log.d(TAG, "Media player is null.");
initialMediaPlayerAndVisualizer();
}
}
Dejar de jugar:
private void stopPlaying()
{
bars.setVisibility(View.VISIBLE);
visualizerContainer.setVisibility(View.INVISIBLE);
ivInfo.setImageResource(R.drawable.img_radio_info_offline);
ivPlay.setVisibility(View.VISIBLE);
ivPause.setVisibility(View.INVISIBLE);
mPlayer.stop();
mVisualizerManager.release();
mPlayer.release();
mPlayer = null;
}
Un poco de troncos:
05-21 16:26:23.600: I/Buffering(3921): 0
05-21 16:26:23.600: I/MediaPlayer(3921): Info (703,156)
05-21 16:26:23.600: I/MediaPlayer(3921): Info (701,0)
05-21 16:26:23.610: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.715: V/MediaPlayer(3921): message received msg=100, ext1=1, ext2=-110
05-21 16:26:23.715: E/MediaPlayer(3921): error (1, -110)
05-21 16:26:23.715: V/MediaPlayer(3921): callback application
05-21 16:26:23.715: V/MediaPlayer(3921): back from callback
05-21 16:26:23.725: D/VisualizerRenderer(3921): Render columns
05-21 16:26:23.725: E/MediaPlayer(3921): Error (1,-110)
05-21 16:26:23.725: D/MAIN(3921): OnError - Error code: 1 Extra code: -110
05-21 16:26:23.725: D/Streaming Media(3921): MEDIA_ERROR_UNKNOWN
05-21 16:26:23.725: D/Streaming Media(3921): Reset media player
05-21 16:26:23.725: V/MediaPlayer-JNI(3921): reset
05-21 16:26:23.725: V/MediaPlayer(3921): reset
05-21 16:26:23.730: D/VisualizerRenderer(3921): Divisions: 9
05-21 16:26:23.730: D/VisualizerManager(3921): Added te renderer
05-21 16:26:23.730: V/MediaPlayer-JNI(3921): get_session_id()
05-21 16:26:23.735: D/VisualizerManager(3921): Media player and visualizer linked
05-21 16:26:23.735: D/VisualizerManager(3921): Set capture listener
05-21 16:26:23.735: D/VisualizerManager(3921): Set on visualizer complete listener
05-21 16:26:23.740: V/MediaPlayer(3921): setVideoSurfaceTexture
05-21 16:26:23.740: V/MediaPlayer(3921): prepareAsync
05-21 16:26:25.285: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.285: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.285: V/MediaPlayer(3921): callback application
05-21 16:26:25.285: V/MediaPlayer(3921): back from callback
05-21 16:26:25.330: I/Buffering(3921): 0
05-21 16:26:25.390: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.390: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.390: V/MediaPlayer(3921): callback application
05-21 16:26:25.390: V/MediaPlayer(3921): back from callback
05-21 16:26:25.425: I/Buffering(3921): 0
05-21 16:26:25.490: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:25.490: V/MediaPlayer(3921): buffering 0
05-21 16:26:25.490: V/MediaPlayer(3921): callback application
05-21 16:26:25.490: V/MediaPlayer(3921): back from callback
...
05-21 16:26:52.585: I/Buffering(3921): 0
05-21 16:26:53.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:53.570: V/MediaPlayer(3921): buffering 0
05-21 16:26:53.570: V/MediaPlayer(3921): callback application
05-21 16:26:53.570: V/MediaPlayer(3921): back from callback
05-21 16:26:53.585: I/Buffering(3921): 0
05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:54.570: V/MediaPlayer(3921): buffering 0
05-21 16:26:54.570: V/MediaPlayer(3921): callback application
05-21 16:26:54.570: V/MediaPlayer(3921): back from callback
05-21 16:26:54.570: V/MediaPlayer(3921): message received msg=200, ext1=702, ext2=0
05-21 16:26:54.570: W/MediaPlayer(3921): info/warning (702, 0)
05-21 16:26:54.570: V/MediaPlayer(3921): callback application
05-21 16:26:54.570: V/MediaPlayer(3921): back from callback
05-21 16:26:54.590: I/Buffering(3921): 0
05-21 16:26:54.590: I/MediaPlayer(3921): Info (702,0)
05-21 16:26:55.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:55.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:55.575: V/MediaPlayer(3921): callback application
05-21 16:26:55.575: V/MediaPlayer(3921): back from callback
05-21 16:26:55.575: I/Buffering(3921): 0
05-21 16:26:56.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:56.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:56.575: V/MediaPlayer(3921): callback application
05-21 16:26:56.575: V/MediaPlayer(3921): back from callback
05-21 16:26:56.585: I/Buffering(3921): 0
05-21 16:26:57.575: V/MediaPlayer(3921): message received msg=3, ext1=0, ext2=0
05-21 16:26:57.575: V/MediaPlayer(3921): buffering 0
05-21 16:26:57.575: V/MediaPlayer(3921): callback application
05-21 16:26:57.575: V/MediaPlayer(3921): back from callback
05-21 16:26:57.600: I/Buffering(3921): 0
05-21 16:26:57.930: V/MediaPlayer-JNI(3921): stop
05-21 16:26:57.930: V/MediaPlayer(3921): stop
05-21 16:26:57.930: D/VisualizerManager(3921): Released the visualizer
05-21 16:26:57.930: V/MediaPlayer-JNI(3921): release
05-21 16:26:57.930: V/MediaPlayer(3921): setListener
05-21 16:26:57.930: V/MediaPlayer(3921): disconnect
05-21 16:26:57.935: V/MediaPlayer(3921): destructor
05-21 16:26:57.935: V/MediaPlayer(3921): disconnect
La respuesta a esta pregunta resultó ser un problema en el firmware de Android instalado en los dispositivos Samsung S III con Android 4.1.2.
Parecía haber sido algo relacionado con la fuente del flujo, porque algunas fuentes finalmente se reproducían en el dispositivo, pero la que necesitábamos nunca se reproducía.
Si puede obtener su transmisión de otra fuente, debería funcionar.
Entonces, si está desarrollando una aplicación para una empresa / propósito específico y tiene algún control sobre la fuente de la transmisión, o puede comunicarse con las personas que tienen el control de la fuente de la transmisión, haga que cambien la fuente de la transmisión a algo. Eso funcionará en un Samsung S III con Android 4.1.2.
Aparte de eso, todo lo que resolverá esto es una actualización de firmware.
Para todos los que luchan con este problema, aquí está la solución:
Android MediaPlayer tarda mucho tiempo en prepararse y almacenarse en búfer
EDITAR: La solución anterior no está muy completa porque a veces es posible escuchar el "tartamudeo" del jugador cuando se detiene y se reanuda.
Una respuesta 100% java que es ligeramente más elegante implica usar una instancia de MediaCodec para convertir el mp3 en datos PCM para alimentar una instancia de AudioTrack.
He publicado el código fuente completo y la explicación aquí: http://www.piterwilson.com/blog/2014/03/15/mediacodec-mediaextractor-and-audiotrack-to-the-rescue/
Resolví este problema usando la biblioteca
compile ''com.devbrackets.android:exomedia:3.0.1''
Una solución definitiva para obtener algunos -1004 en teléfonos Samsung más antiguos:
En mi caso, estoy usando un Samsung Galaxy Pocket y tenía un archivo mp3 en nuestro CDN, que no funcionaba, es decir,
Sin embargo, al descargar el archivo en el teléfono, se reproduce en el reproductor nativo. Sin embargo, no en mi aplicación y no en los navegadores. Resulta que el servicio de reproductor de medios necesitaba una extensión de archivo para indicar el tipo de medio y no podía detectarse automáticamente basándose en encabezados de archivos.
Lo resolví dando a la ubicación del archivo una extensión real.
Solución
- Dale al archivo una extensión donde esté alojado (como se muestra arriba) o
- Programáticamente, descargue el archivo manualmente, dele la extensión correcta en la tarjeta sd y luego juegue desde la tarjeta sd como la fuente.