ffmpeg buka webcam menggunakan YUYV tetapi saya ingin MJPEG

14

Saya perlu ffmpeg untuk membuka webcam (logitech c910) dalam mode MJPEG, karena webcam dapat memberikan ~ 24 menggunakan MJPEG "protokol" dan hanya ~ 10 fps menggunakan YUYV. Bisakah saya memilih di antara mereka menggunakan command line 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

Baris perintah saya saat ini:

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 menghasilkan stream h264 yang rusak ketika saya merekam dari webcam, tetapi strem h264 yang normal ketika saya merekam dari x11grab. Codec lain (mjpeg, mpeg4) berfungsi baik dengan webcam ... Tapi ini adalah cerita lain.

perbarui output konsol Full ffmpeg: http://pastebin.com/Hzem6CKF (Anda dapat melihatnya membuka perangkat video dalam mode YUV, tetapi perangkat juga dapat memberikan outpud MJPEG juga).

pavelkolodin
sumber

Jawaban:

13

Anda dapat mencantumkan informasi tambahan tentang apa yang dapat dihasilkan oleh webcam Anda v4l2-ctl --list-formats-ext. Anda juga dapat menampilkan informasi webcam dengan ffmpeg menggunakan -list_formatsopsi input:

$ 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

Kamera web dari contoh saya ini dapat mendukung format mentah ( yuyv422) dan terkompresi ( mjpeg), dan Anda dapat ffmpegmenentukan mana yang Anda inginkan dengan -input_formatopsi input.

Contohnya

Aliran menyalin aliran video MJPEG (tanpa pengodean ulang):

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

Re-encode video webcam mentah ke H.264:

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

Sama seperti di atas tetapi secara manual memilih frame rate dan ukuran video ( v4l2-ctl --list-formats-extuntuk frame rate yang tersedia dan ukuran video):

ffmpeg -f v4l2 -input_format yuyv422 -framerate 30 -video_size 640x480 -i /dev/video0 -c:v libx264 -vf format=yuv420p output.mp4
  • Lihat dokumentasi perangkat input video4linux2 untuk opsi lebih lanjut.

  • Jika frame rate yang dihasilkan lebih rendah dari yang diharapkan maka tambahkan lebih banyak cahaya: webcam mungkin menurunkan frame rate untuk mendapatkan eksposur yang lebih lama dalam lingkungan yang redup.

llogan
sumber
0
ffmpeg -t 60 -f video4linux2 -input_format mjpeg -i /dev/video0 -c:v libx264 -strict -2 /DataVolume/share/Public/v/outputs.mp4
somewood
sumber
4
Selamat Datang di Pengguna Super! Dapatkah Anda memperluas ini? Secara khusus, informasi apa yang dimiliki LordNekbeard? :)
bertieb
Tidak perlu -strict -2kecuali: 1) Anda ffmpegsudah ketinggalan zaman, dan 2) Anda sedang menyandikan audio AAC.
Logan