[Jderobot-dev] RTSP y MJPEG sin delay en Android

Oscar Garcia oscar.robotica en linaresdigital.com
Dom Mar 31 21:48:27 CEST 2013


El 28/03/13 14:57, Roberto Calvo escribió:
> El problema es que si programas en nativo en Android utiliando el 
> componente VideoView que permite reproducir streaming RTSP, siempre 
> siempre siempre tiene un delay de 10seg, independientemente de los 
> paquetes, red y conexión. Está ya más que documentado este bug 
> (feature para otros) en Android, pero de momento sigue así. Está claro 
> la ventaja de UDP contra TCP en este tipo de aplicaciones, pero el 
> delay de 10seg en Android utilizando VideoView está hardcodeado y es 
> una faena.


Tienes toda la razón, no todas las aplicaciones permiten modificar el 
tamaño del "prebuffer", incluso algunas lo permiten pero aún así luego 
tienen un búffer interno previo a la reproducción que no se puede salvar 
(y muchas veces es inherente al algoritmo de decodificación). Como dije 
anteriormente, prácticamente todo es problema del cliente, muy pocas 
veces suele ser problema del servidor, aunque hay implementaciones de 
servidor que no dan salida de datos hasta que no se ha codificado una 
secuencia completa (fotograma completo, o fotograma "I", y estimaciones 
temporales, o fotogramas "B" y "P"), sobre todo por el problema de 
reordenación que conlleva los fotogramas "B". Una implementación MJPEG 
es como si todos los fotogramas fueran fotogramas "I".



> La implementación que has hecho de MJPEG en android es estándar? Es 
> decir, da igual si lo enganchamos a un cameraserver o a una webcam que 
> exporte video usando MJPEG ¿funciona?


Como has podido ver en el vídeo, el móvil Android hace de "servidor" y 
no de cliente. Es simplemente un servidor HTTP basado en NIO que permite 
enviar mediante streaming los fotogramas de la preview de la cámara 
Android. El cliente puede ser cualquier navegador web que soporte 
streaming MJPEG (como chrome, firefox, safari, etc) o un cliente 
específico como VLC, Quicktime, etc.

Es decir, no se puede enganchar a un cameraserver o a una webcam que 
exporte vídeo usando MJPEG porque precisamente la función de mi 
aplicación es esa, hacer de servidor y exportar el vídeo.



> Sería ideal que cameraserver exportara imágenes o vídeo de una manera 
> estándar para poder utilizar los clientes que quisieramos. Hay veces 
> donde JDEROBOT no podemos integrarlo donde quisieramos (por ejemplo en 
> una webcam IP) y entonces los clientes no se puede utilizar. Yo lo vi 
> claro con mi PFC del Máster, donde si no estaba JDEROBOT por medio, no 
> podía visualizar ningúna webcam.


Realmente lo hace así, lo hace con una interfaz bien definida. Bueno, 
pero por dentro permite usar una variedad de codificación de fotogramas 
(RGB, YUV, combinación de los anteriores con diferentes anchos de bit 
por pixel, etc), pero yo no lo vería como algo "no estándar", si no un 
abanico diferente de posibilidades de codificar cada fotograma.

Jderobot puede obtener imágenes desde una cámara IP, sólo necesita un 
cliente HTTP intermedio que realice el trabajo de la descarga de 
fotogramas usando transporte HTTP, podría llamarse "cameraserverhttp" 
por ejemplo, y convertirlo a un formato de fotograma compatible. 
Actuaría como representante (proxy) de la cámara IP real y se podría 
ejecutar en la misma máquina que tuviera cameraview o en una máquina 
diferente.

Habría dos formas de implementarlo, que tras una petición realice una 
conexión HTTP al servidor y se descargue únicamente un fotograma, o que 
mantenga esa conexión obteniendo fotogramas continuamente y atienda las 
peticiones conforme les vayan llegando con el siguiente fotograma del 
streaming (mejoraría la latencia al eliminar los tiempos de 
establecimiento de conexión, etc).

Un tercer escalón a salvar es que la interfaz camera no soporta 
fotogramas en JPEG, habría que convertirlos a RGB u otro formato 
similar. Yo tuve ese problema en cameraserver para Android, en el que 
terminé por implementar en JDErobot la lectura de fotogramas codificados 
en NV21 para evitar hacer esa transformación en un móvil que suele tener 
menos capacidad de cómputo que un ordenador portátil o de sobremesa 
(aunque últimamente las cosas se van equiparando, pero en móviles con un 
precio que no está al alcance de cualquiera).

Un saludo y espero que hayáis disfrutado de la semana santa :)


More information about the Jde-developers mailing list