Error MediaPlayer (1, -1004) aka MEDIA_ERROR_IO tratando de transmitir música en Samsung S3

NOTA: No estoy trabajando en la empresa donde trabajé cuando publiqué esta pregunta, por lo tanto, aunque puedan llegar algunas respuestas excelentes, en realidad no las probaré, ya que no tengo una razón para (aparte de promoviendo a la comunidad, lo que podría hacer que lo haga un día) .

Sin embargo, si muchos otros miembros de la comunidad promueven alguna respuesta al problema, podría optar por seleccionarla como la respuesta correcta para el problema experimentado tantos años después de haber publicado originalmente la pregunta.

Mientras tanto, espero que algunas de las respuestas puedan ayudar a algunos de ustedes a experimentar este problema. ¡Yay por el desbordamiento de la stack!


Nuestra aplicación tiene que transmitir música de una fuente en línea (no estoy en libertad de divulgar esa fuente).

¿Por qué tardan más de 2 minutos en comenzar a transmitir en el S3?

Pude ver que el objeto del Reproductor multimedia entra en el estado Error debido a MEDIA_ERROR_UNKOWN : excelente. No me ayuda mucho Así que al manejar esto en onError con un OnErrorListener, reinicié el objeto del Reproductor de Medios y luego llamé a la función de puesta en marcha, que hace el rest – 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 a los efectos 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(); } } 

Comienza 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; } 

Pequeños registros:

 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 dispositivos Samsung S III con Android 4.1.2.

Parecía haber sido algo relacionado con la fuente de la transmisión, porque algunas fonts finalmente se reproducían en el dispositivo, pero la que necesitábamos nunca se reproducía.

Si puedes obtener tu transmisión desde otra fuente, debería funcionar.

Por lo tanto, si está desarrollando una aplicación para una empresa / propósito específico y tiene cierto control sobre la fuente de la transmisión, o puede comunicarse con personas que controlan 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 lleva mucho tiempo preparar y almacenar

EDITAR: La solución anterior no es muy completa porque a veces es posible escuchar al jugador “tartamudear” cuando hace una pausa y reanuda.

Una respuesta 100% Java que es un poco más elegante implica el uso de una instancia de MediaCodec para convertir el mp3 en datos PCM para alimentar a 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 al usar la biblioteca
comstackr ‘com.devbrackets.android:exomedia:3.0.1’

Una solución definitiva para obtener -1004 en teléfonos Samsung anteriores:

En mi caso, estoy usando un Samsung Galaxy Pocket y tenía un archivo mp3 en nuestro CDN, que no funcionaba, es decir,

http: // dominio / ruta / audiofile

Sin embargo, al descargar el archivo al teléfono, se reproduce en el reproductor nativo. No en mi aplicación y no en los navegadores, sin embargo. Resulta que el servicio de reproductor de medios necesitaba una extensión de archivo para indicar el tipo de medio y no podía detectar automáticamente en base a los encabezados de los archivos.

Lo resolví dando a la ubicación del archivo una extensión real.

http: //domain/path/audiofile.mp3

Solución

  1. O bien, otorgue al archivo una extensión donde está alojado (como se indicó anteriormente) o
  2. Progtwigdo, descarga el archivo manualmente, dale la extensión correcta en la tarjeta SD y luego juega desde la tarjeta SD como fuente.