ffmpeg webcam aberta usando YUYV, mas eu quero MJPEG


14

Preciso do ffmpeg para abrir a webcam (logitech c910) no modo MJPEG, porque a webcam pode fornecer ~ 24 usando o "protocolo" MJPEG e apenas ~ 10 fps usando o YUYV. Posso escolher entre eles usando a linha 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

Minha linha de comando atual:

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

O ffmpeg produz um fluxo h264 corrompido ao gravar a partir da webcam, mas o h264 normal quando grava a partir do x11grab. Outros codecs (mjpeg, mpeg4) funcionam bem com a webcam ... Mas essa é outra história.

atualizar a saída completa do console do ffmpeg: http://pastebin.com/Hzem6CKF (você pode ver que ele abre o dispositivo de vídeo no modo YUV, mas o dispositivo também pode fornecer saída de MJPEG).

Respostas:


13

Você pode listar informações adicionais sobre o que sua webcam pode gerar v4l2-ctl --list-formats-ext. Você também pode mostrar informações da webcam com ffmpeg usando a -list_formatsopção 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 webcam do meu exemplo pode suportar os formatos raw ( yuyv422) e compactado ( mjpeg), e você pode dizer ffmpegqual deles deseja com a -input_formatopção de entrada.

Exemplos

Stream copie o stream de vídeo MJPEG (sem recodificação):

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

Recodifique o vídeo bruto da webcam em H.264:

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

O mesmo que acima, mas escolha manualmente a taxa de quadros e o tamanho do vídeo ( v4l2-ctl --list-formats-extpara a taxa de quadros disponível e os tamanhos de vídeo):

ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
  • Veja a documentação do dispositivo de entrada video4linux2 para mais opções.

  • Se a taxa de quadros emitida for menor do que o esperado, adicione mais luz: a webcam pode estar diminuindo a taxa de quadros para obter exposições mais longas em um ambiente escuro.


0
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4

4
Bem-vindo ao Super Usuário! Você pode expandir isso? Em particular, que informação tem que a de LordNekbeard não? :)
bertieb

Não é necessário, a -strict -2menos que: 1) você ffmpegesteja terrivelmente desatualizado e 2) esteja codificando áudio AAC.
Llogan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.