[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