Streaming H264 con Logitech C920

13

Tengo una cámara web logitech C920. Tiene la capacidad de codificar directamente el video en H264.

Quiero reproducir lo que se hizo con un Beaglebone, pero usando un Raspberry Pi: envíe un flujo H264 a la red . El Raspberry Pi solo está aquí para empaquetar la transmisión en RTP, la compresión de video se realiza mediante la cámara web. El modo H264 se aplica mediante video4linux.

Hasta ahora, y si uso una computadora común con la última versión de Ubuntu, funciona usando VLC como servidor o GStreamer. Por ejemplo, si inicio en Raspberry Pi un servidor VLC usando el comando:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... y luego, si leo la transmisión con VLC en otra computadora, todo está bien.

Sin embargo, si uso la Raspberry Pi para enviar la transmisión de video, el resultado es bastante pobre. Mucha basura en la imagen tan pronto como algo se mueve. Las claves de imagen se reciben bien cada 10 segundos, pero mientras tanto, no es lo suficientemente bueno en comparación con la transmisión desde una computadora común.

También probé el método descrito para el beaglebone con la "captura" proporcionada utilidad de : está bien si transmito desde una computadora real, el mismo problema de basura si transmito desde una Raspberry Pi.

No es un problema de red: hice algunas comprobaciones de red con Wireshark y las estadísticas de VLC, no tengo pérdida de paquetes. Intenté con Raspbian y Arch Linux para Raspi (gstreamer 0.10 en raspbian, gstreamer 1.0 en Arch Linux).

No sé si es relevante o no, pero también probé con la versión de soporte de flotación suave de Raspbian. Primero se debe realizar una actualización para usar un kernel 3.2; pero el mismo problema, el video tiene algo de basura.

¿Alguna idea de lo que podría hacer para mejorar la calidad del video?

Vincent Hiribarren
fuente
Intenta reducir la velocidad de fotogramas. La CPU del rPi es muy pobre, por lo que supongo que transmitir una imagen de 800x600 a 30FPS es demasiado. Solo la nueva placa de cámara rPI que está conectada a través del conector MIPI / CIS (en lugar de USB) transmite 1080p a 15-30 FPS.
Matthias
No es FPS. El Pi puede manejar HD a 60FPS sin problemas usando el módulo de cámara Pi. Si la cámara Logitech envía un video H264 ya está codificado y el Pi necesita retransmitir los paquetes ... de lo cual es completamente capaz. De hecho, puede retransmitir hasta 6 transmisiones HD @ 25FPS antes de que alcance el máximo. Debe ser el controlador V4L que daña los paquetes
Piotr Kula
Sé que es un hilo viejo, pero ¿finalmente encontraste algo que funciona? Estoy tratando de hacer algo similar y atascado
Ajith
Usé un Beaglebone y funcionó mejor. El problema se debió a un mal controlador USB para RaspberryPi en Raspbian. Por lo que recuerdo, más tarde probé el mismo sistema con una versión posterior de Raspbian y tuve menos basura. Puedo hacer una actualización rpi (como se dijo en una de las respuestas), pero no me acuerdo bien. Pero lo que es seguro es que el rendimiento fue mejor después de usar un firmware / sistema operativo actualizado.
Vincent Hiribarren
Vincent, recibo el error 'no se puede abrir la url v4l2'. ¿Está este comando ahora desactualizado?
Dalanmiller

Respuestas:

5

Tuve el mismo problema, encontré este hilo al buscar un codificador de hardware, no por problemas con el c920.

Sin embargo, ejecute una actualización de firmware para la frambuesa pi y la basura debería desaparecer

$> sudo rpi-update

Yo mismo encontré la solución aquí: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi

Steffen
fuente
Para cerrar esta pregunta, acepto esa respuesta. El problema fue debido a un controlador USB roto, hubo una pérdida de paquetes en la comunicación USB. Un sistema / firmware actualizado debería hacer el truco.
Vincent Hiribarren
2

Puedes probar y usar FFMPEG. Pero el problema no es utilizar la versión de repositorios porque está desactualizada. Hay una versión bifurcada que funciona muy bien.

Tendrá que compilarlo, lo que demora aproximadamente 5 horas o descargar un binario precompilado.

Luego puede canalizar los datos del controlador V4L a FFMPEG con esta configuración. Donde -i "fifo"debería estar solo -ipara caputre la transmisión canalizada y -fdeberá verificar dos veces cómo generar H264. el FLV lo vuelve a empaquetar en FLV que se puede jugar con reproductores HTML.

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

o un ejemplo que encontré que apunta directamente a V4L pero oyu tiene que tener la cámara presente en /dev/video* donde * es 1o más ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

el -f denota el formato de salida en. No significa que vaya a transcodificarlo como H264 a FLV sólo se pone envuelto en el formato FLV. luego cambie la dirección al reproductor VLC de su cliente. por ejemplo-f mpegts udp:192.168.1.19:1234

VLC no parece funcionar demasiado bien en Pi. Tuve muy poco éxito empujando el módulo Pi cmaera a mi PC usando UDP. Funcionó pero no era estable.

También puede mirar instalar nginx con el módulo rtmp que funciona de maravilla. Mire esta guía pero necesitará modificar un poco la configuración. Luego, conecta su reproductor VLC a la transmisión nginx-rtmp y funcionará de maravilla.

Piotr Kula
fuente
1
¿Qué versión bifurcada es la que funciona bien?
Brian
1

Esto parece funcionar para mí @ menos ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy

Philippe Gachoud
fuente
0

Pruebe con un búfer más grande en el cliente que muestra el video. Para mí hay una diferencia dramática entre el buffer de 1000ms y el buffer de 200ms. El búfer de 5000 ms se ve mejor que el búfer de 1000 ms.

: almacenamiento en red = 2000

Odie
fuente
Debería funcionar con el almacenamiento en caché 0 con el extraño jittering en LAN. Obtuve el módulo de cámara Pi para que funcione así sin ningún problema.
Piotr Kula
0

Publiqué una posible solución en el foro de frambuesa utilizando un servidor RTSP ligero basado en live555 que captura H264 de un controlador V4L2. Está disponible en github h264_v4l2_rtspserver

Esto se hizo para la raspicamera, pero debería funcionar con cualquier dispositivo V4L2 que proporcione H264.

mpromoneta
fuente
-1

Si entendí bien tu situación, ¿quieres que Raspberry transcodifique el video a H264? Creo que es por eso que obtienes un mal rendimiento, porque VLC está usando codificación de software y Raspberry no es poderoso para esa tarea.

Sugeriría probar con Gstreamer y gst-omxcomplementos . Hay un elemento para la codificación de video de hardware que sería un buen servidor desde su Raspberry.

10robinho
fuente
1
Como él dijo, la cámara Logitech ya proporciona H.264. Por lo tanto, el rPi solo transporta tramas pero no realiza ninguna codificación.
Matthias
Él no está transcodificando. Solo retransmitiendo los datos. Como en él usa stream directamente.
Piotr Kula