Какие настройки ffmpeg позволяют получить наилучшее разрешение видео / частоту кадров, на которое способна моя веб-камера?
Я хочу записать наилучший возможный видеофайл (с точки зрения разрешения / частоты кадров / цветов) с моей веб-камеры.
Прямо сейчас я использую эту команду:
ffmpeg -f v4l2 -framerate 25 -video_size 640x480 -i /dev/video0 output.mkv
Моя веб-камера, кажется, поддерживает это:
$ ffmpeg -f v4l2 -list_formats all -i /dev/video0
…
[video4linux2,v4l2 @ 0xf07d80] Raw : yuyv422 : YUV 4:2:2 (YUYV) : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
[video4linux2,v4l2 @ 0xf07d80] Compressed: mjpeg : MJPEG : 640x480 160x120 176x144 320x176 320x240 352x288 432x240 544x288 640x360
Я думаю, что получил часть разрешения, но как я могу улучшить мою командную строку до:
- Не используйте сжатие (я подозреваю, что текущий вывод.mkv сжат)
- Используйте наилучшую частоту кадров, на которую способны камера и компьютер, без дублирования кадров (нет смысла сохранять файл со скоростью 100 кадров в секунду, если веб-камера не способна захватывать кадры с такой скоростью)
- Все идеи для дальнейшего улучшения качества видео приветствуются
2 ответа
Вы действительно не хотите сжатия? Несжатое видео будет очень большим. Или вы не хотите перекодирования? Или без потерь?
, сжатие невозможно. Как указано в https://superuser.com/a/1302502/128124
Сначала определите доступные форматы с помощью:
v4l2-ctl --list-formats-ext
как упоминалось в разделе: Как я могу перечислить доступные видеорежимы для веб-камеры USB в Linux?
Для меня самые высокие:
[0]: 'YUYV' (YUYV 4:2:2)
Size: Discrete 1280x720
Interval: Discrete 0.100s (10.000 fps)
[1]: 'MJPG' (Motion-JPEG, compressed)
Size: Discrete 1280x720
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Затем вы также можете проверить:
ffmpeg -f v4l2 -list_formats all -i /dev/video0
который содержит для моего устройства:
video4linux2,v4l2 @ 0x5579b13df240] Raw : yuyv422 : YUYV 4:2:2 : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720
[video4linux2,v4l2 @ 0x5579b13df240] Compressed: mjpeg : Motion-JPEG : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720
Затем, если я запишу два очень похожих 3,5-секундных видео, где я корчу рожи на установке, описанной в https://askubuntu.com/questions/348838/how-to-check-available-webcams-from-the-command-line/848390#848390 ред. 18 с:
ffmpeg -y -f v4l2 -framerate 30 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -c copy out.mjpeg.mkv
ffmpeg -y -f v4l2 -framerate 30 -video_size 1280x720 -input_format yuyv422 -i /dev/video0 -c copy out.yuyv422.mkv
размеры примерно:
- 15 МБ
- 60 МБ
иffprobe
подтверждает соответственно:
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 1280x720, 10 fps, 10 tbr, 1k tbn, 1k tbc (default)
Lossless обсуждается по адресу:
- Универсальный формат видео без потерь
- https://stackoverflow.com/questions/11713882/lossless-ffmpeg-conversion-encoding
- https://video.stackexchange.com/questions/7903/how-to-lossless-encode-a-jpg-image-sequence-to-a-video-in-ffmpeg
Протестировано на Ubuntu 20.04, Lenovo ThinkPad P51.
Я использую: ffmpeg -f video4linux2 -input_format yuyv422 -video_size 640x480 -i /dev/video0 -c:v copy 640x480.mkv