Театральное качество кодирования ffmpeg/x264 динамичного видео 1080p

Я изо всех сил пытался кодировать видео с использованием FFMPEG и x264. Вывод заикается при воспроизведении в Quicktime, в то время как в VLC он показывает много артефактов сжатия в тех же местах, где Quicktime заикается. Таким образом, кажется, что Quicktime заикается, потому что пытается подавить повреждение/артефакты.

В видеороликах много случайных движений, в том числе кадры, в которых 75% пикселей меняются со случайным интервалом (видео создается программным обеспечением, поэтому оно действительно псевдослучайное). Сжатие, кажется, задыхается в этих местах, где оно, вероятно, неправильно определяет «вырезание сцены». Он также, кажется, задыхается через равные промежутки времени, где, я думаю, он делает ключевой кадр.

Я взял за основу предустановки кодирования предустановку x264-hq, которая поставляется с FFMPEG. Я пробовал отключить обнаружение вырезания сцены и поиграть с параметрами keyint/g и keyint_min. Установка g в 1 заставляет его работать, но увеличивает размер файла. Я пробовал предустановки без потерь, но они вообще не воспроизводятся в Quicktime. Как ни странно, у меня не возникло никаких проблем при работе с тестовым видео более низкого разрешения (1440x810).

Вот пресет, который у меня есть прямо сейчас, который работает, но дает файл, который примерно на 60% больше, чем дает (неработающий) пресет hq. Есть ли способ улучшить это? Размер файла не имеет большого значения, я просто хочу что-то, что будет воспроизводиться где угодно и будет очень высокого качества.

coder=1
flags=+loop
cmp=+chroma
partitions=+parti8x8+parti4x4+partp8x8+partp4x4+partb8x8
me_method=umh
subq=8
me_range=16
g=1
keyint_min=1
sc_threshold=0
i_qfactor=0.71
b_strategy=1crf=20
qcomp=0.6
qmin=20
qmax=51
qdiff=4
bf=16
refs=4
trellis=1
flags2=+dct8x8+wpred+bpyramid+mixed_refs
wpredp=2

Вот команда:

ffmpeg \
  -r 60 -i "frame-%06d.tiff" \
  -vcodec libx264 -vpre my_preset \
  -threads 0 \
  -r 60 -an -f out.mp4

person Ian    schedule 25.11.2011    source источник


Ответы (1)


Если возможно, используйте многопроходное кодирование, это даст H264 возможность обнаружить изменения сцены и подготовиться к ним.

Почему вы устанавливаете sc_threshold на ноль?

Не будьте слишком толерантны к большим размерам файлов, возможны заикания, если мгновенный битрейт превышает скорость передачи устройства хранения (в том числе сетевого). Контент 1080p должен легко кодироваться со скоростью менее 10 Мбит/с.

person Bryan Boettcher    schedule 02.12.2011
comment
Спасибо. Я пробовал двухпроходное кодирование, но результаты были еще хуже: много артефактов и еще больше заиканий при смене сцены. Я начал с предустановок slower_firstpass и slower, поставляемых с ffmpeg. Я установил sc_threshold на ноль в надежде полностью отключить смену сцен. - person Ian; 05.12.2011