Лучшие настройки для 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 уже должно быть лучшим подходом к качеству, верно?

Решение

Вот примерное руководство по настройке кодера:. Мы начнем с основ, поскольку было бы вредно делать поспешные выводы о том, что быстрое перечисление опций внезапно улучшит ожидаемый результат, не понимая желаемых целей и ожиданий: 1. Начните с понимания возможностей кодера. Для кодеров на базе NVENC начните с изучения опций каждого кодера (обратите внимание, что я работаю в Linux, поэтому я использую xclip для копирования опций кодека в буфер обмена перед тем, как вставить их сюда): (a). Для кодека H.264:

ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip

Выход:

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset                    E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... 
     losslesshp                   E..V.... 
  -profile                   E..V.... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
     high444p                     E..V.... 
  -level                     E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     1b                           E..V.... 
     1.0b                         E..V.... 
     1.1                          E..V.... 
     1.2                          E..V.... 
     1.3                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     2.2                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     3.2                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     4.2                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
  -rc                        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt               E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
  -coder                     E..V.... Coder type (from -1 to 2) (default default)
     default                      E..V.... 
     auto                         E..V.... 
     cabac                        E..V.... 
     cavlc                        E..V.... 
     ac                           E..V.... 
     vlc                          E..V.... 

(b). Для кодера HEVC/H.265:

ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip

Выход:

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
  -preset                    E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... lossless
     losslesshp                   E..V.... lossless hp
  -profile                   E..V.... Set the encoding profile (from 0 to 4) (default main)
     main                         E..V.... 
     main10                       E..V.... 
     rext                         E..V.... 
  -level                     E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
     5.2                          E..V.... 
     6                            E..V.... 
     6.0                          E..V.... 
     6.1                          E..V.... 
     6.2                          E..V.... 
  -tier                      E..V.... Set the encoding tier (from 0 to 1) (default main)
     main                         E..V.... 
     high                         E..V.... 
  -rc                        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal_aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

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). Абсолютный путь к выходному файлу. В приведенном выше примере цитируется как:

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Вы можете повысить качество вывода, указав соответствующий битрейт (через параметры -b:v, -maxrate:v и -bufsize:v), включив методы кодирования с адаптивным квантованием (поддерживаются методы пространственного и временного AQ, из которых только один может использоваться одновременно) и опционально (и отдельно) включив взвешенное предсказание (которое отключит поддержку B-кадров), как показано ниже, а также опциональный фильтр для правильного понижения и изменения размера, если это необходимо. В примере ниже показан фрагмент, обрабатывающий входной сигнал mpegts, закодированный в mpeg2:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"

Предупреждение: Обратите внимание, что взвешенное предсказание (-weighted_pred) не может быть включено одновременно с адаптивным квантованием. Попытка сделать это приведет к сбою инициализации кодера. В приведенном выше фрагменте предполагается, что входной файл является потоком MPEG2. Если это не так, переключитесь на правильный декодер CUVID после его анализа:

ffprobe -i e:\input.ts

Если это' H.264/AVC, измените фрагмент, как показано ниже:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"

Я заметил, что включение адаптивного квантования ИЛИ взвешенного предсказания для NVENC может вызвать проблемы со стабильностью, особенно при определенных комбинациях драйверов устройств. По возможности, используйте B-кадры (не более 3) в сочетании с общей опцией -refs:v, установленной на 16 или около того, вместо включения AQ и взвешенного предсказания:

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"

В Turing, в частности, вам также может быть полезно включить B-кадры для ссылок, как показано ниже (см. переключатель -b_ref_mode:v middle):

ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"

Дополнительное замечание о количестве потоков (передаваемых в 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.

Комментарии (5)

Мой опыт использования nvenc показывает, что вам нужно указать ему, какой битрейт вам нужен - по умолчанию он устанавливает VBR, что хорошо, но никакая настройка не компенсирует тот факт, что он всегда хочет дать вам средний битрейт 2M, независимо от того, файл какого разрешения вы ему подаете. Это похоже на недостаток кодера; он работает предсказуемо во всех других отношениях, но ему требуется (например) -b:v 4M для файла 720p или -b:v 8M для 1080p. При желании их можно немного снизить.

Комментарии (0)

Libvorbis для аудио кажется медленным. ac3 должен дать вам прирост в скорости на 15%+.

Учитывая это, что-то не так с вашим видеодрайвером или вы используете старую копию ffmpeg. q У меня нет вашего клипа, но я взял SD ts файл с моего PVR и использовал ваши настройки.

Я получил 700 кадров в секунду (ваши настройки) на GTX750 (не TI) (более дешевой).

Я получил 925 кадров в секунду (ваши настройки с аудио ac3)

Другая рекомендация, которую я могу дать:

Измените qmax примерно до 23.

Комментарии (2)