2012-09-21 28 views
8

Tengo un problema extraño con una aplicación de transmisión de video en la que estoy trabajando. La transmisión real de video/audio funciona bien en todos mis dispositivos de prueba. Sin embargo, en cualquier dispositivo 4.0+, al usar un URL RTSP, prepare() regresa al instante (esto causa un problema al proporcionar retroalimentación adecuada a los usuarios mientras se carga un video e interfiere con algunos otros sistemas que tengo instalados).Android 4.0.4 MediaPlayer prepara el problema usando las URL RTSP

A continuación se muestra el bloque de código en el que inicializar y configurar mi MediaPlayer, pero tener algunas cosas en cuenta:

  • método Mi initPlayer se llama desde una AsyncTask.
  • El video finalmente se reproduce correctamente, pero prepararse para volver al instante crea una falta de retroalimentación para el usuario durante una carga de video.
  • No hay errores de cualquier tipo se producen durante todo el proceso
  • start() se llama en el MediaPlayer a través del método onPrepared en mi OnPreparedListener, lo que obviamente se convierte en un problema cuando se prepare() devuelve antes de que esté lista para ser jugado .
  • Las transmisiones HTTP parecen funcionar bien, y en todos los dispositivos de prueba por debajo de 4.0 el problema no ocurre.

que han estado tratando de solucionar este problema por una cantidad ridícula de tiempo, y no han sido capaces de encontrar cualquier otra persona que se encontró 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); 
     } 
    }; 
+0

estoy frente a la misma cuestión en este momento. ¿Has resuelto el problema? en caso afirmativo, responda su propia pregunta con la solución. esperando...!!! –

+1

¿Alguna solución? –

+0

Desafortunadamente, nunca encontré una solución, aunque dejé de trabajar en este proyecto hace bastante tiempo. – bread

Respuesta

0

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

Una última idea, trate de evitar el uso de e.printStackTrace(); en aplicaciones de Android. En su lugar, use Log.e("TAG_STRING", e.getMessage(), e); para imprimir errores en el sistema de registro de Android al que puede acceder desde logcat.

Con todo, lo que debería es como la siguiente:

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); 
    } 
+1

Gracias petey. Estoy llamando a preparar desde un AsyncTask, por lo que no está bloqueando el hilo de UI. Independientemente, he intentado usar prepareAsync() también con los mismos resultados. – bread

Cuestiones relacionadas