Есть ли способ улучшить качество вывода h264_nvenc?

Я сжимаю несколько видео для архивирования и пришел к такой конфигурации, которая дает мне хорошее общее качество при небольшом размере:

ffmpeg -threads 4 -y -hide_banner -i input.mp4 -vf scale=-2:480 -c:v libx264 -b:v 200k -preset slow -tune animation -movflags faststart -pix_fmt yuv420p -an -f mp4 -pass 1 NUL
ffmpeg -threads 4 -y -hide_banner -i input.mp4 -vf scale=-2:480 -c:v libx264 -b:v 200k -preset slow -tune animation -movflags faststart -pix_fmt yuv420p -pass 2 2-pass-x264.mp4

Это качество вывода приемлемо для моих нужд:

закодированный x264 кадр

Но хотелось бы аппаратного ускорения, оно намного быстрее.

Итак, я попытался:

ffmpeg -hwaccel nvdec -y -hide_banner -i input.mp4 -vf scale=-2:480 -movflags faststart -pix_fmt yuv420p -c:v h264_nvenc -b:v 200k -maxrate 2M -bufsize 1M -rc-lookahead:v 30 -rc:v vbr_hq -preset slow -profile:v high -level 5.1 -an h264_nvenc.mp4

Но это дает мне результат с худшим общим качеством, а в сложных частях все становится еще хуже:

h264_nvenc закодированный кадр

Можно ли добиться такого же общего качества (для низкого битрейта) с помощью кодировщика h264_nvenc?

Ответы (3)

Не на самом деле нет. Более новые карты nvidia на основе Turing будут давать лучшее качество, чем предыдущие поколения. Но поскольку nvenc — это фиксированная функция, а не программное обеспечение, работающее на графическом процессоре, его нельзя обновить или изменить, за исключением нескольких параметров, таких как предустановки.

Я пробовал все возможные варианты, это действительно позор.
Это просто природа кодирования видео с аппаратным ускорением. Бесплатных обедов не бывает.

h264_nvenc может кодировать с постоянным качеством, по крайней мере, начиная с Pascal. Мне пришлось немало покопаться в Интернете, чтобы понять, как правильно его использовать, но, наконец, я нашел работающую формулу.

Команда, подобная приведенной ниже, будет записывать с постоянным качеством, а значение CQ 26 будет производить примерно такое же, но немного лучшее качество, измеренное с помощью VMAF, как при кодировании libx264 со следующими параметрами: -vcodec libx264 -level 4.1 -profile:v high -tune film -preset medium -crf 23. Битрейт H264_Nvenc был примерно на 19% выше, чем кодирование libx264, но у него был немного лучший показатель VMAF. Я провел эти тесты на некоторых игровых записях 1080p60, а также на некоторых трейлерах к фильмам 1080p.

ffmpeg -i input.mkv -c:v h264_nvenc -preset p6 -profile:v high -tune hq -rc-lookahead 8 -bf 2 -rc vbr -cq 26 -b:v 0 -maxrate 120M -bufsize 240M output.mkv

Важный:

  • Если вы не установите максимальную скорость и размер буфера с помощью -maxrate 120M -bufsize 240M, режим CQ не будет вести себя соответствующим образом, и снижение его значения не даст лучших результатов. Режим постоянного качества активируется путем указания управления переменным битрейтом вместе с параметром CQ, битрейтом, установленным на ноль, и двумя вышеуказанными параметрами, установленными на какое-то большое значение, которое не будет ограничивать вывод. Не бойтесь этих значений, так как битрейт будет неплохим.
  • Приведенные выше ограничения заставят кодировщик создавать кодировку уровня 5.1. Даже более высокие ограничения, такие как 300/600, создавали видео с уровнем, помеченным как 6.2, которое неправильно воспроизводилось в NLE как Vegas Pro. Если вам требуется определенный максимальный уровень, убедитесь, что максимальная скорость и размер буфера находятся в пределах уровня, и проверьте результат.

Укажите битрейт, как -b:v 0сделал трюк, общий битрейт увеличился с 2mдо 16m.

ffmpeg -i in.mp4 -c:v h264_nvenc -b:v 0 out.mp4