FFmpeg: максимальное качество VHS?
Я оцифровываю несколько кассет VHS в видеофайлы без потерь с помощью FFmpeg. Как я могу дополнительно оптимизировать команду FFmpeg, чтобы приблизиться к запрошенным ниже спецификациям с максимально возможным качеством?
Целевые (идеальные) характеристики без потерь
- Формат файла: MKV/AVI/MOV/MXF.
- Видеокодеки: FFV1/JPG2000 без потерь/HuffYUV/Dirac/H.264 без потерь
- Цветность: 4:2:2
- Размер пикселя: Rec.601
- Соотношение сторон: 4:3
- Разрешение: 720x576
- ПАЛ
- 25 кадров в секунду
- Аудио: 48 кГц/24 бит PCM 48 кГц/16
команда FFmpeg
(ОС — Ubuntu Studio, процессор имеет 8 ядер)
sudo \
nice --20 \
ffmpeg \
-hide_banner \
-v verbose \
-report \
-err_detect +crccheck+bitstream+buffer+compliant+aggressive \
-fflags +igndts \
-f video4linux2 -thread_queue_size 1024 -i "/dev/video4" \
-f alsa -thread_queue_size 1024 -channel_layout stereo -ac 2 -i "hw:1" \
-vcodec ffv1 -level 3 -threads 8 -coder 1 -context 1 -g 1 -slices 30 -slicecrc 1 \
-acodec copy \
-aspect 4:3 \
-colorspace bt470bg \
-t 00:00:00 \
"NAME_HERE.mkv"
Дополнительная информация
Устройство захвата — USB-Live2 от Hauppauge с использованием полуофициальных драйверов для совместимости с Linux.
Входные потоки FFmpeg с устройства захвата:
Input #0, video4linux2,v4l2, from '/dev/video4':
Duration: N/A, start: 1048.849074, bitrate: 165888 kb/s
Stream #0:0: Video: rawvideo, 1 reference frame (YUY2 / 0x32595559), yuyv422, 720x576, 165888 kb/s, 25 fps, 25 tbr, 1000k tbn
Guessed Channel Layout for Input Stream #1.0 : stereo
Input #1, alsa, from 'hw:1':
Duration: N/A, start: 1673449766.232483, bitrate: 1536 kb/s
Stream #1:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (rawvideo (native) -> ffv1 (native))
Stream #1:0 -> #0:1 (copy)
Потоки FFprobe для примера выходного видеофайла:
ffprobe -hide_banner sample.mkv
Input #0, matroska,webm, from 'sample.mkv':
Metadata:
ENCODER : Lavf59.27.100
Duration: 00:00:10.01, start: 0.000000, bitrate: 52324 kb/s
Stream #0:0: Video: ffv1 (FFV1 / 0x31564646), yuv422p(tv, bt470bg/unknown/unknown, progressive), 720x576, SAR 16:15 DAR 4:3, 25 fps, 25 tbr, 1k tbn
Metadata:
ENCODER : Lavc59.37.100 ffv1
DURATION : 00:00:10.000000000
Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s
Metadata:
DURATION : 00:00:10.006000000
Текущие рационализации командования
sudo nice --20 гарантирует, что процессору будет присвоен максимальный приоритет процессу ffmpeg. (После этого я использую chown, чтобы изменить владельца видеофайла от root.)
err_detect предназначен для обнаружения любых ошибок. Если что-то произойдет, я перезапущу сеанс оцифровки. Не знаю, являются ли какие-либо из флагов полностью дублирующими друг друга и/или влияющими на производительность.
Насколько я понимаю, поскольку ffv1 является « внутрикадровым », а не межкадровым кодеком , ошибки DTS следует безопасно игнорировать с помощью fflags +igndts. (Довольно часто они появляются во время сеанса, и из-за них кажется ненужным перезапускать сеанс.)
Без чрезмерного размера thread_queue_size 1024 ffmpeg имеет тенденцию предупреждать о «блокировке очереди сообщений потока».
ffv1 кажется самым мощным доступным видеокодеком без потерь, а параметры кажутся самыми мощными из возможных: https://trac.ffmpeg.org/wiki/Encode/FFV1
Входной звук достаточно близок к целевым характеристикам (и AFAIK не может быть улучшен), поэтому он просто копируется как есть.
Изменить: оказывается, у меня 8 ядер, а не 16. Соответственно обновлен параметр -threads ffv1.
1 ответ
Сегодня аналоговая лента полностью перешла на FM RF для «лучшего и окончательного» формата со сжатием FLAC. Это сохраненные необработанные данные видео и HiFi FM-сигнала, а с понижением частоты до минимальных скоростей меньше, чем 10-битный FFV1, но при этом обеспечивающий весь сигнал. кадр после программного декодирования и коррекции временной развертки, включая данные строки 21, т. е. временной код CC/VITC и т. д.
Декодированный кадр 4fsc NTSC, пример канала Y/Luma
Стоит прочитать вики VHS-Decode .