Дополнительно
Лучшие настройки для FFMpeg с NVENC
Я использую FFMPEG с поддержкой моего GPU (NVENC) для преобразования файлов с моего спутникового приемника (SD, mpeg2 .TS-файлы) в h264 .mp4-файлы.
Вот строка, которую я использую
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Но качество не такое хорошее, как ожидалось. И полная мощность моей системы не используется:
Только 11% использования GPU и 30% использования CPU.
Вопрос: Есть ли несколько улучшений, которые я могу сделать, чтобы улучшить качество при равном размере файла и использовать больше вычислительной мощности моей Geforce GTX 1080?
Я нашел несколько параметров из 林正浩 для изменения, но -preset slow
уже должно быть лучшим подходом к качеству, верно?
24
3
Вот примерное руководство по настройке кодера:. Мы начнем с основ, поскольку было бы вредно делать поспешные выводы о том, что быстрое перечисление опций внезапно улучшит ожидаемый результат, не понимая желаемых целей и ожиданий: 1. Начните с понимания возможностей кодера. Для кодеров на базе NVENC начните с изучения опций каждого кодера (обратите внимание, что я работаю в Linux, поэтому я использую xclip для копирования опций кодека в буфер обмена перед тем, как вставить их сюда): (a). Для кодека H.264:
Выход:
(b). Для кодера HEVC/H.265:
Выход:
2. Поймите ограничения аппаратного обеспечения и придерживайтесь вменяемых значений по умолчанию, прежде чем применять опции:. Обратитесь к этому ответу, чтобы узнать об аппаратных ограничениях, с которыми вы столкнетесь при использовании NVENC, особенно при кодировании HEVC на Pascal. Об инфраструктуре аппаратного ускорения, доступной для оборудования NVIDIA текущего поколения с FFmpeg, читайте в этом ответе. Затем, используя эту информацию, переходите к следующему шагу. 3. Синтаксис имеет решающее значение:. Вот порядок, в котором вы должны передавать аргументы FFmpeg: (a). Вызвать двоичный файл. (b). Передайте любые аргументы FFmpeg (например,
-loglevel
непосредственно ему) перед объявлением входов. (c). Если вы используете аппаратное ускорение декодирования, напримерcuvid
, объявите его здесь и включите все необходимые аргументы. На этом этапе необходимо упомянуть, что декодеры имеют специфические ограничения, такие как ожидаемое разрешение входного сигнала, поддерживаемые кодеки и т.д., и поэтому в производстве рекомендуется определить и подтвердить необходимость использования декодеров с аппаратным ускорением, поскольку неудача на этом этапе приводит к неудачному кодированию и не подлежит восстановлению. Фактически, разработчики MPV неоднократно упоминали об этом, не полагайтесь на аппаратно-ускоренное декодирование для критически важной доставки контента. (d). Объявляйте ваши входные данные. Для потоков используйте URL и при необходимости добавляйте дополнительные флаги (например, размер буфера). Для локальных ресурсов (на доступной файловой системе) необходим абсолютный путь к файлу. (e). По желанию, вставьте фильтр. Он необходим для таких функций, как изменение размера, преобразование формата пикселей, деинтерлейсинг и т.д. Обратите внимание, что в зависимости от используемого здесь фильтра аппаратный декодер (как описано в разделе (c)) будет вводить ограничения, которые ваш фильтр должен уметь обрабатывать, иначе кодирование будет неудачным. (f). Вызовите соответствующие видео- и аудиокодеры и передайте им необходимые аргументы, такие как сопоставления, битрейты, предустановки кодера и т.д. Когда речь идет о битрейте, убедитесь, что нужные вам значения установлены с помощью опций-b:v
,-maxrate:v
и-bufsize:v
. Не оставляйте их пустыми. Здесь - хорошая отправная точка в объяснении того, почему эти значения имеют значение. Как всегда, начните с указания предустановки. Прокрутите страницу вниз, чтобы просмотреть заметки о влиянии пресетов на производительность при использовании данного конкретного кодера. (g). В то время как FFmpeg может определить требуемый формат выходного файла в зависимости от выбранного расширения выходного файла, рекомендуется явно объявлять формат выхода (с помощью опции -f), чтобы при необходимости можно было передать дополнительные параметры базовому муксеру, как это часто бывает с потоковыми форматами, такими как HLS, mpegts и DASH. (h). Абсолютный путь к выходному файлу. В приведенном выше примере цитируется как:Вы можете повысить качество вывода, указав соответствующий битрейт (через параметры
-b:v
,-maxrate:v
и-bufsize:v
), включив методы кодирования с адаптивным квантованием (поддерживаются методы пространственного и временного AQ, из которых только один может использоваться одновременно) и опционально (и отдельно) включив взвешенное предсказание (которое отключит поддержку B-кадров), как показано ниже, а также опциональный фильтр для правильного понижения и изменения размера, если это необходимо. В примере ниже показан фрагмент, обрабатывающий входной сигнал mpegts, закодированный в mpeg2:Предупреждение: Обратите внимание, что взвешенное предсказание (
-weighted_pred
) не может быть включено одновременно с адаптивным квантованием. Попытка сделать это приведет к сбою инициализации кодера. В приведенном выше фрагменте предполагается, что входной файл является потоком MPEG2. Если это не так, переключитесь на правильный декодер CUVID после его анализа:Если это' H.264/AVC, измените фрагмент, как показано ниже:
Я заметил, что включение адаптивного квантования ИЛИ взвешенного предсказания для NVENC может вызвать проблемы со стабильностью, особенно при определенных комбинациях драйверов устройств. По возможности, используйте B-кадры (не более 3) в сочетании с общей опцией
-refs:v
, установленной на 16 или около того, вместо включения AQ и взвешенного предсказания:В Turing, в частности, вам также может быть полезно включить B-кадры для ссылок, как показано ниже (см. переключатель
-b_ref_mode:v middle)
:Дополнительное замечание о количестве потоков (передаваемых в ffmpeg через опцию
-threads
):. Увеличение числа потоков кодирования сверх определенного порога увеличивает задержку и приводит к увеличению объема памяти кодирования. Ухудшение качества более заметно при большем количестве потоков в режимах с постоянным битрейтом и в режиме с почти постоянным битрейтом, называемом VBV (video buffer verifier), из-за увеличения задержки кодирования. Ключевые кадры требуют больше данных, чем другие типы кадров, чтобы избежать пульсации ключевых кадров низкого качества. Режим нулевой задержки или режим нарезанных потоков не имеет задержки, но эта опция значительно ухудшает качество многопоточного кодирования в поддерживаемых кодировщиках. Поэтому разумно ограничить количество потоков при кодировании, где задержка имеет значение, так как предполагаемое увеличение пропускной способности кодера нивелирует любые преимущества, которые оно может дать в долгосрочной перспективе. Поскольку вы работаете под Windows, возможно, вам захочется убрать оболочечные сокращения\
выше, поскольку я пишу это с Unix-компьютера, тестируя приведенную выше команду. Примечания о влиянии на производительность при использовании предустановок и чересстрочного кодирования:. Для высокой пропускной способности и низкой задержки убедитесь, что вы используете предустановкиllhp
илиllhq
. Это наиболее полезно для таких рабочих нагрузок, как прямая трансляция, где ожидается более широкая совместимость с большим количеством устройств, и, таким образом, функции, снижающие производительность, такие как B-кадры, могут быть полностью опущены для достижения хорошего компромисса между более высокими используемыми битрейтами и пропускной способностью. Более высокие предустановки (такие какmedium
по умолчанию) имеют быстро уменьшающуюся отдачу в качестве при одновременном значительном замедлении пропускной способности кодера. Разница в качестве междуllhp
иllhq
, измеренная Netflix's VMAF, практически незначительна, однако прирост производительности кодера (более ~30% на моем тестовом стенде) при использовании первого параметра определенно ощутим. Для пресетовllhp
иllhq
, а также других используемых пресетов, вы также можете переопределить встроенные методы регулирования скорости, передавая аргументы-rc:v
, как указано в опциях кодера. Например, при кодировании с постоянным битрейтом вы можете указать-rc:v cbr
(который значительно быстрее метода управления скоростьюcbr_ld_hq
, что дает дополнительный ~20% прирост пропускной способности). Обратите внимание, что выбранный пресет оказывает наибольшее влияние на пропускную способность, за ним следуют опции пресета (например, используемый метод контроля скорости), которые при желании можно переопределить. Рассмотрите свой рабочий процесс кодирования и настройте его при необходимости. Ваш пробег определенно будет варьироваться, основываясь на исходном контенте, используемых цепочках фильтров, специфических переменных конфигурации pltform (например, GPU и версии драйвера) и т.д. В то же время, обратите внимание, что NVIDIA явно отключила чересстрочное кодирование на Turing на всех уровнях, даже в линейке 1660Ti, где используется более старый кодер Volta NVENC. Если вам требуется поддержка чересстрочного кодирования, пожалуйста, перейдите на Pascal или более старые SKU.Мой опыт использования nvenc показывает, что вам нужно указать ему, какой битрейт вам нужен - по умолчанию он устанавливает VBR, что хорошо, но никакая настройка не компенсирует тот факт, что он всегда хочет дать вам средний битрейт 2M, независимо от того, файл какого разрешения вы ему подаете. Это похоже на недостаток кодера; он работает предсказуемо во всех других отношениях, но ему требуется (например)
-b:v 4M
для файла 720p или-b:v 8M
для 1080p. При желании их можно немного снизить.Libvorbis для аудио кажется медленным. ac3 должен дать вам прирост в скорости на 15%+.
Учитывая это, что-то не так с вашим видеодрайвером или вы используете старую копию ffmpeg. q У меня нет вашего клипа, но я взял SD ts файл с моего PVR и использовал ваши настройки.
Я получил 700 кадров в секунду (ваши настройки) на GTX750 (не TI) (более дешевой).
Я получил 925 кадров в секунду (ваши настройки с аудио ac3)
Другая рекомендация, которую я могу дать:
Измените qmax примерно до 23.