web-dev-qa-db-fra.com

ffmpeg ouvre webcam en utilisant YUYV mais je veux MJPEG

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 images par seconde 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 depuis une webcam, mais un H264 normal lorsque j’enregistre depuis x11grab. Un autre codec (mjpeg, mpeg4) fonctionne bien avec la webcam ... Mais ceci est une autre histoire.

update Sortie de la console complète de ffmpeg: http://Pastebin.com/Hzem6CKF (vous pouvez voir qu'il ouvre un périphérique vidéo dans YUV mode, mais le périphérique peut également fournir une sortie MJPEG).

14
pavelkolodin

Vous pouvez répertorier des informations supplémentaires sur ce que votre webcam peut afficher avec v4l2-ctl --list-formats-ext. Vous pouvez également afficher les informations de la webcam avec ffmpeg à l’aide de l’option de saisie -list_formats:

$ 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 bruts (yuyv422) et compressés (mjpeg) et vous pouvez indiquer à ffmpeg lequel vous voulez avec l'option d'entrée -input_format.

Exemples

Flux copier le flux vidéo MJPEG (pas de réencodage):

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

Réencodez la vidéo webcam brute au format H.264:

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

Comme ci-dessus, mais choisissez manuellement la fréquence d'images et la taille de la vidéo (v4l2-ctl --list-formats-ext pour la fréquence d'images et la taille des vidéos 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 périphérique d'entrée video4linux2 pour plus d'options.

  • Si la cadence en sortie est inférieure aux prévisions, ajoutez plus de lumière: la webcam peut réduire la cadence pour obtenir des expositions plus longues dans un environnement sombre.

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