¿Cómo puedo hacer que Raspivid omita la codificación h264? (deshacerse del video de transmisión de latencia de 5 segundos)

11

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.

Louis Somers
fuente
Esa es una investigación muy exhaustiva. El uso de MJPEG está fuera de discusión porque (en el momento en que lo estaba buscando) el codificador JPEG incorporado no tenía biblioteca y el software era basura. ¡Logré obtener aproximadamente 1s de retraso usando nginx-rtmp (paquete FLV), compilación personalizada, en HD! El pi usó alrededor del 30% de CPU, pero VLC tuvo problemas para decodificarlo debido a que faltaban los marcos de tiempo y debido a su FLV :( También mi software de CCTV usó VLC sink y 1 flujo de 720p usó 40% de CPU cuando finalmente lo puse a funcionar, pero estaba muy inestable.
Piotr Kula
@ppumkin No creo que MJPEG esté fuera de discusión. Una vez que se haya eliminado H264, podemos codificar lo que queramos sin tener la sobrecarga de decodificar y volver a codificar. En realidad, tener H264 es todo un lujo. Solo nosotros deberíamos poder apagarlo. Es como un lujoso trono acolchado y con trozos de diamantes en una cámara de inodoro apretada, por lo que nada más cabe en la habitación (excepto un poco de espacio para la cabeza donde podemos saltar un poco) ... cuando abres la puerta, tienes que subir sobre un reposabrazos alto, y cuando te sientas no hay espacio para tus piernas ...
Louis Somers
Sí, entiendo lo que quieres decir. He pasado días tratando de obtener MJPEG en una calidad decente para mi servidor IP CCTV. Muchas cosas han cambiado, pero la codificación y conexión directa de hardware por JPEG a una secuencia no existe, ya que la API no está disponible. La única forma que conozco es el software y la mejor solución que encontré fue nginx-rtmp JPEG sink. HLS para iPhone funciona realmente bien, pero tiene un retraso de 5 a 10 segundos :(
Piotr Kula
1
Puede intentar plantear esto como una pregunta sobre el proyecto Github para el software de la cámara. Probablemente obtendrá una explicación de por qué es difícil de hacer, pero si otros consideran que es una característica útil, alguien podría implementarla.
TomG
demux no es lo mismo que decodificar ... mira esto
Flash Thunder

Respuestas:

5

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!):

  • VLC
  • MJPEG
  • GStreamer

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:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT
Val
fuente
1
Sí, ya he probado Gstreamer y funciona muy bien cuando se transmite a una PC más o menos, pero no funciona bien con software de terceros como Synology DiskStation. Parece que GStreamer simplemente reutiliza el flujo h264 y envuelve un protocolo de transmisión a su alrededor sin decodificarlo, lo cual es una gran solución, pero desafortunadamente para una pequeña cantidad de casos de uso. Si quisiera ver la transmisión en un dispositivo Android, tendría que desarrollar mi propia aplicación. MJPEG es mucho más compatible, y estoy seguro de que Raspivid puede modificarse para omitir la codificación innecesaria y dejar eso en VLC más o menos. Gracias por el consejo de todos modos
Louis Somers
1
También tengo un Synology pero no probé GStreamer (creo que el mío no es lo suficientemente potente). Por cierto, sobre Android, ¡también puedes usar GStreamer en él! Lo estoy usando para mi proyecto y está funcionando bien :)!
Val
Problema con gstreamer: no incluye el intervalo de tiempo en los datos del marco y no se puede usar como sumidero (incluso con la opción agregada) Hace 6 meses cuando estaba buscando hacer un circuito cerrado de televisión saome ... pero nunca funcionó de manera confiable :(
Piotr Kula
@Val verdadero, hay un SDK para Android, ¡pero no hay muchos jugadores listos para usar en Play Store que admitan canales como gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234! gdpdepay! rtph264depay! avdec_h264! videoconvert! sincronización de autovideosink = falso. Para iOS hay aún menos disponible. Synology es un gran centro que admite la mayoría de los dispositivos convencionales, puede hacer detección de movimiento, grabación y notificaciones, todo listo para usar (y sin quitar tarjetas SD).
Louis Somers
¿Sigues usando esto así? Existe el nuevo controlador U4VL, pero aún los mismos problemas de retraso con la transmisión h264 a VLC
Piotr Kula
0

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:

Entre otras cosas, ofrece una interfaz web desde la cual es posible ver la transmisión de video de varias maneras y una página de control que permite controlar completamente la configuración de la cámara mientras se transmite con cualquier aplicación Video4Linux.

Sin embargo, todavía no lo he probado (ya que no quiero estropear mi configuración actual).

Louis Somers
fuente
1
No estoy seguro si este fue su problema, pero si está enviando tráfico RTSP de multidifusión a través de un enrutador, asegúrese de que tenga habilitada la inspección IGMP y asegúrese de que su PC no esté bloqueando las consultas IGMP del enrutador. De lo contrario, el enrutador no se dará cuenta de que su PC está tratando de recibir los paquetes, por lo que nunca los reenviará.
Malvineous