Estoy reproduciendo una transmisión RTSP en vivo desde VLC en una PC a la clase MediaPlayer de Android (ambas en la misma red local). Funciona sin problemas y sin errores: el problema es que el video decodificado en pantalla tiene entre 5 y 7 segundos de retraso.Descodificación de transmisión RTSP en vivo: gran retraso de video usando MediaPlayer en Android
De depuración y devoluciones de llamada, puedo ver que los datos en vivo están llegando en el dispositivo < 1s después de iniciar mMediaPlayer.prepareAsync()
. Aquí es cuando la clase MediaPlayer comienza a determinar qué formato tiene la secuencia con qué dimensiones, etc. Luego, justo antes de que se muestre el video en la pantalla (entre 5 y 7 segundos más tarde), se llama al onPrepared()
donde llamo al mMediaPlayer.start()
. Parece que start()
reproduce el video que se capturó originalmente desde el inicio de la etapa de preparación.
He intentado seekTo(5000)
antes y después de start()
, pero no tiene ningún efecto en el desfase.
Para una aplicación de videollamadas en vivo, el retraso de configuración de unos pocos segundos está perfectamente bien, pero este video lag una vez que se presenta es inaccesible para mí.
public void surfaceCreated(SurfaceHolder holder)
{
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnVideoSizeChangedListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setDataSource("rtsp://192.168.1.4:5544/test");
mMediaPlayer.setDisplay(holder);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.prepareAsync();
...
public void onPrepared(MediaPlayer mediaplayer)
{
mMediaPlayer.start();
...
Alguna idea de cómo puedo reducir este retraso, o buscar hasta el final de lo que está amortiguada por MediaPlayer? Mi dispositivo es 3.1, minSdkVersion es 2.2.
EDIT:
he encontrado algunas altas y bajas marcas de agua en AwesomePlayer.cpp (2s y 8s). Como una prueba rápida, he pirateado el libstagefright.so para hacer estos 0.1s y 1s. Sin embargo, esto no tuvo efecto en el retraso. Mi búsqueda continúa ...
El NDK v7 ahora tiene acceso a las API de transmisión de medios de bajo nivel OpenMax AL para cuando la fuente es un TS MPEG en 4.0. ¿Alguien ha tenido alguna experiencia con esto? ¿Ha mejorado el retraso del video? Leí en los documentos: "Como OpenMAX AL es una C API nativa, los subprocesos que no son de Dalvik que llaman OpenMAX AL no tienen sobrecarga relacionada con Dalvik, como pausas de recolección de basura. Sin embargo, no hay beneficio de rendimiento adicional para el uso de OpenMAX AL aparte de esto. En particular, el uso de OpenMAX AL no produce una baja latencia de audio o video ... "Oh, bueno. – barkside
¿Le importaría darle una actualización sobre el progreso que ha hecho en esto? – Matt
Al final usé GStreamer (ahora tienen soporte para Android) que te da mucho más control sobre estas cosas ... un poco de colapso que conozco ... – barkside