Hay miles de millones de foros e hilos sobre cómo deshacerse de una latencia de 5 segundos cuando se usa un Pi junto con una PI-Cam como cámara de vigilancia. Muchos tutoriales muestran cómo usar vlc para codificar y transmitir las imágenes usando el protocolo RTP que resulta en un retraso de ~ 5 segundos.
Según yo, la razón es que raspivid está codificando el flujo a H264, mientras que VLC tiene que decodificarlo nuevamente y volver a codificarlo en cualquier RTP. La línea de comando se ve así:
raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
La primera parte le dice a Raspivid que transmita video a la salida estándar:
raspivid -w 640 -h 480 -o - -t 0
La parte después de la tubería, le dice a VLC que lo recoja y lo decodifique usando h264:
cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264
¡Esta muxing y demuxing es una gran cantidad de recursos!
Encontré las fuentes de raspicam en github, y creo que se puede hacer algo en el método encoder_buffer_callback (actualmente en la línea 848) para omitir la codificación. Sin embargo, no soy bueno en c, y no estoy familiarizado con la codificación de video, así que no tengo idea de por dónde empezar.
En Github puedo ver 330 tenedores, pero no parecen ser específicamente para raspicam (más bien para todo el proyecto de usuario). Me perdí tratando de encontrar una bifurcación que eliminara la codificación o implementara algo más simple como mjpeg.
¿Podría alguien con conocimientos de códec c y video ayudarnos a mí y a los otros millones de usuarios a deshacernos de la latencia? Probablemente la solución ya esté disponible en uno de esos tenedores, pero he pasado horas buscándola sin suerte.
pd No estoy buscando una solución de navegador , pero finalmente quiero transmitirla a Synology, preferiblemente usando la transmisión mjpeg (pero no a través de una página web, sino una transmisión estándar mjpeg que viene integrada en la mayoría de las cámaras IP comerciales). El primer paso es deshacerse de h264.
fuente
Respuestas:
Probablemente eso no sea lo que desea de las respuestas, pero no recomiendo la transmisión VLC en absoluto ...
Para un proyecto escolar, probé algunas opciones de transmisión (¡también en RPi!):
Usando VLC y MJPEG (y algunos otros menos conocidos), tuve latencia entre 3 y 5 segundos. ¡
Usando GStreamer, SIN LATENCIA y con una mejor resolución (y muchas más opciones)!
Si está interesado, puede consultarlo aquí .
Y si lo usará, aquí está mi canalización:
fuente
Algunas personas han estado trabajando duro en esto desde que hice esta pregunta por primera vez, y para este momento hay algunas opciones (extraño que nadie haya respondido a esta pregunta todavía). He probado RaspberrIPCam y he tenido éxito, sin embargo, parece que los paquetes rtsp tenían un TTL extremadamente corto o algo así. Tener el Pi conectado directamente a un enrutador al lado de mi PC funcionaría perfectamente. Pero tan pronto como instalé la cámara donde la quería, e intenté acceder a la transmisión con dos enrutadores, no apareció ninguna imagen. Verifiqué el código fuente y encontré el TTL configurado al máximo. Nunca lo descubrí por completo.
Actualmente recomendaría RaspberryIPCamera que tiene una interfaz de usuario agradable (ver capturas de pantalla ) e incluso hay una imagen de tarjeta SD preparada para ello. He probado la tarjeta SD, pero volví a realizar una instalación manual como se describe aquí con gran éxito (mi configuración actual). Las instrucciones para conectarlo a una Synology DiskStation también están disponibles y funcionan perfectamente en mi sistema. El problema con la imagen de la tarjeta SD fue que no pude expandir el sistema de archivos en toda la extensión de la tarjeta SD (también quiero ejecutar otras cosas para controlar algunos relés a través de los pines GPIO).
La solución anterior utiliza componentes del proyecto UV4L. La documentación del proyecto UV4L en esta página también menciona:
Sin embargo, todavía no lo he probado (ya que no quiero estropear mi configuración actual).
fuente