ffmpeg webcam ouverte en utilisant YUYV mais je veux MJPEG

14

J'ai besoin de ffmpeg pour ouvrir la webcam (logitech c910) en mode MJPEG, car la webcam peut donner ~ 24 en utilisant le "protocole" MJPEG et seulement ~ 10 fps en utilisant le YUYV. Puis-je choisir entre eux en utilisant la ligne de commande 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

Ma ligne de commande actuelle:

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 produit un flux h264 corrompu lorsque j'enregistre à partir d'une webcam, mais un strem h264 normal lorsque j'enregistre à partir de x11grab. Un autre codec (mjpeg, mpeg4) fonctionne bien avec webcam ... Mais c'est une autre histoire.

mettre à jour la sortie complète de la console ffmpeg: http://pastebin.com/Hzem6CKF (vous pouvez voir qu'elle ouvre le périphérique vidéo en mode YUV, mais le périphérique peut également fournir une sortie MJPEG).

pavelkolodin
la source

Réponses:

13

Vous pouvez répertorier des informations supplémentaires sur ce que votre webcam peut produire v4l2-ctl --list-formats-ext. Vous pouvez également afficher des informations sur la webcam avec ffmpeg en utilisant l' -list_formatsoption d'entrée:

$ 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

Cette webcam de mon exemple peut prendre en charge les formats raw ( yuyv422) et compressé ( mjpeg), et vous pouvez dire ffmpeglequel vous voulez avec l' -input_formatoption d'entrée.

Exemples

Copiez en flux le flux vidéo MJPEG (pas de ré-encodage):

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

Ré-encoder la vidéo webcam brute en H.264:

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

Identique à ci-dessus mais choisissez manuellement la fréquence d'images et la taille de la vidéo ( v4l2-ctl --list-formats-extpour la fréquence d'images et les tailles vidéo disponibles):

ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
  • Voir la documentation du périphérique d'entrée video4linux2 pour plus d'options.

  • Si la fréquence d'images émise est inférieure à celle attendue, ajoutez plus de lumière: la webcam peut réduire la fréquence d'images pour obtenir des expositions plus longues dans un environnement sombre.

llogan
la source
0
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4
un peu de bois
la source
4
Bienvenue sur Super User! Pouvez-vous développer davantage sur ce sujet? En particulier, de quelles informations dispose-t-elle que LordNekbeard ne possède pas? :)
bertieb
Pas besoin de -strict -2moins que: 1) votre ffmpeghorriblement obsolète, et 2) vous encodez de l'audio AAC.
llogan