Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android 4.0.4 MediaPlayer prepara el problema usando urls RTSP

Estoy experimentando un problema extraño con una aplicación de streaming de video en la que estoy trabajando. La transmisión de vídeo / audio funciona bien en todos mis dispositivos de prueba. Sin embargo, aparentemente en cualquier dispositivo 4.0+, cuando se utiliza una URL RTSP, prepare () devuelve al instante (esto causa un problema proporcionando retroalimentación adecuada a los usuarios mientras un video se está cargando e interfiere con algunos otros sistemas que tengo instalados).

A continuación se muestra el bloque de código en el que inicializo y configuro mi MediaPlayer, pero mantengo algunas cosas en mente:

  • Mi método initPlayer se llama desde un AsyncTask.
  • El vídeo no funciona correctamente, pero preparar volver instantáneamente crea una falta de retroalimentación para el usuario durante una carga de vídeo.
  • No se producen errores de ningún tipo durante todo el proceso
  • Start () se llama en el MediaPlayer a través del método onPrepared en mi OnPreparedListener, que obviamente se convierte en un problema cuando prepare () devuelve antes de que esté realmente listo para ser reproducido.
  • Los flujos HTTP parecen funcionar bien y en cada dispositivo de prueba inferior a 4.0 el problema no se produce.

He estado tratando de arreglar esto por una cantidad ridícula de tiempo, y no he podido encontrar a nadie más que se ha topado con este problema. Cualquier idea sería muy apreciada.

public void initPlayer() { //We first need to make sure the MediaPlayer isn't null if(mMediaPlayer==null){ mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnPreparedListener(mediaPlayerPreparedListener); mMediaPlayer.setOnCompletionListener(mediaPlayerCompletionListener); mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); } //If a video/stream has been chosen while another is already playing else if(mMediaPlayer.isPlaying()){ mMediaPlayer.reset(); } //Video is not in full screen mode second = false; try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //onPreparedListener private OnPreparedListener mediaPlayerPreparedListener = new OnPreparedListener(){ public void onPrepared(MediaPlayer mp) { mp.start(); vidPb.setVisibility(View.INVISIBLE); } }; 

  • Dibujar superposición (HUD) en Android VideoView?
  • Conecte el androide al LAN local vía el teléfono (sobre wifi O vía la conexión del USB)
  • Transmisión de vídeo en directo desde una cámara IP inalámbrica a un móvil Android
  • Decodificación del flujo de RTSP en directo: gran retraso de vídeo con MediaPlayer en Android
  • Solución de streaming UDP o RTP para android
  • Transmisión de vídeo mediante RTSP: Android
  • Obligar a Android a utilizar RTSP / AVP / TCP intercalado
  • Decodificación Raw H264 corriente en android?
  • One Solution collect form web for “Android 4.0.4 MediaPlayer prepara el problema usando urls RTSP”

    Utilice mp.prepareAsync() ya que es mejor para streaming de medios. Utilice prepare() bloques prepare() hasta que MediaPlayer esté listo para la reproducción o se produzca una excepción IllegalStateException. Además, en android 4 (ICS), el bloqueo en cualquier subproceso de interfaz de usuario es aún más estricto y puede hacer que aparezca un cuadro de diálogo ANR (actividad no responde).

    Un último pensamiento, tratar de evitar el uso de e.printStackTrace(); En las aplicaciones de Android. En su lugar, utilice el Log.e("TAG_STRING", e.getMessage(), e); Para imprimir errores en el sistema de registro de android que puede acceder desde logcat .

    En general, debe verse algo como esto:

      try { mMediaPlayer.setDataSource(videoString); holder = mPreview.getHolder(); mMediaPlayer.setDisplay(holder); mMediaPlayer.prepareAsync(); } catch (IllegalArgumentException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (SecurityException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (IllegalStateException e) { Log.e("TAG_STRING", e.getMessage(), e); } catch (IOException e) { Log.e("TAG_STRING", e.getMessage(), e); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.