ffmpeg cámara web abierta usando YUYV pero quiero MJPEG

14

Necesito ffmpeg para abrir la cámara web (logitech c910) en modo MJPEG, porque la cámara web puede dar ~ 24 usando el "protocolo" MJPEG y solo ~ 10 fps usando el YUYV. ¿Puedo elegir entre ellos usando la línea de comando ffmpeg?

xx@(none) ~ $ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
    Index       : 0
    Type        : Video Capture
    Pixel Format: 'YUYV'
    Name        : YUV 4:2:2 (YUYV)

    Index       : 1
    Type        : Video Capture
    Pixel Format: 'MJPG' (compressed)
    Name        : MJPEG

Mi línea de comando actual:

ffmpeg -y -f alsa -i hw:3,0 -f video4linux2 -r 20 -s 1280x720 -i /dev/video0 -acodec libfaac -ab 128k -vcodec libx264 /tmp/web.avi

ffmpeg produce una transmisión corrupta h264 cuando grabo desde la cámara web, pero normal h264 strem cuando grabo desde x11grab. Otros códecs (mjpeg, mpeg4) funcionan bien con la cámara web ... Pero esta es otra historia.

actualice la salida completa de la consola de ffmpeg: http://pastebin.com/Hzem6CKF (puede ver que abre el dispositivo de video en modo YUV, pero el dispositivo también puede proporcionar salida MJPEG).

pavelkolodin
fuente

Respuestas:

13

Puede enumerar información adicional sobre lo que puede generar su cámara web v4l2-ctl --list-formats-ext. También puede mostrar información de la cámara web con ffmpeg usando la -list_formatsopción de entrada:

$ ffmpeg -f video4linux2 -list_formats all -i /dev/video0
[...]
[video4linux2,v4l2 @ 0x1fb7660] Raw       :   yuyv422 :     YUV 4:2:2 (YUYV) : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
[video4linux2,v4l2 @ 0x1fb7660] Compressed:     mjpeg :                MJPEG : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360

Esta cámara web de mi ejemplo puede admitir los formatos raw ( yuyv422) y comprimido ( mjpeg), y puede decir ffmpegcuál desea con la -input_formatopción de entrada.

Ejemplos

Stream copie la transmisión de video MJPEG (sin volver a codificar):

ffmpeg -f v4l2 -input_format mjpeg -i /dev/video0 -c:v copy output.mkv

Vuelva a codificar el video de la cámara web sin procesar en H.264:

ffmpeg -f v4l2 -input_format yuyv422 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4

Igual que el anterior, pero elija manualmente la velocidad de fotogramas y el tamaño del video ( v4l2-ctl --list-formats-extpara la velocidad de fotogramas y los tamaños de video disponibles):

ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
  • Consulte la documentación del dispositivo de entrada video4linux2 para obtener más opciones.

  • Si la velocidad de fotogramas que se emite es inferior a la esperada, agregue más luz: la cámara web puede estar bajando la velocidad de fotogramas para obtener exposiciones más largas en un entorno oscuro.

lema
fuente
0
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4
alguna madera
fuente
44
¡Bienvenido a Super User! ¿Puedes ampliar esto? En particular, ¿qué información tiene que no tenga LordNekbeard? :)
bertieb
No es necesario a -strict -2menos que: 1) tu ffmpegesté horriblemente desactualizado y 2) estés codificando audio AAC.
llogan