android streaming android-mediaplayer samsung-mobile

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,

http://domain/path/audiofile

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.

http://domain/path/audiofile.mp3

Solución

  1. Dale al archivo una extensión donde esté alojado (como se muestra arriba) o
  2. 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.