Вот приблизительное руководство по настройке кодера:
Мы начнем с основ, так как было бы вредно делать вывод, что быстрый набор опций внезапно улучшит ожидаемый результат без понимания желаемых целей и ожиданий:
1. Начните с понимания параметров кодировщика.
Для кодеров на основе NVENC начните с изучения параметров, которые использует каждый кодер (обратите внимание, что я работаю в Linux, поэтому я использую xclip для копирования параметров кодека в буфер обмена перед их вставкой здесь):
(А). Для кодера 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 <int> 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 <int> 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 <int> 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 <int> 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 <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> 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 <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-b_adapt <boolean> E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
-spatial-aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal-aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> 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 <float> 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 <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
-coder <int> 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....
(Б). Для датчика 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 <int> 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 <int> E..V.... Set the encoding profile (from 0 to 4) (default main)
main E..V....
main10 E..V....
rext E..V....
-level <int> 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 <int> E..V.... Set the encoding tier (from 0 to 1) (default main)
main E..V....
high E..V....
-rc <int> 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 <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> 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 <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-spatial_aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal_aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> 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 <float> 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 <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
2. Поймите ограничения оборудования и придерживайтесь нормальных значений по умолчанию перед применением параметров:
Обратитесь к этому ответу для ознакомления с аппаратными ограничениями, с которыми вы столкнетесь в NVENC, особенно для кодирования HEVC на Pascal.
Информацию об аппаратно-ускоренной инфраструктуре, доступной для оборудования NVIDIA текущего поколения с FFmpeg, смотрите в этом ответе.
Затем, используя эту информацию, перейдите к следующему шагу.
3. Синтаксис имеет решающее значение:
Вот порядок, в котором вы должны передавать аргументы в FFmpeg:
(А). Вызовите двоичный файл.
(б). Передайте любые аргументы в FFmpeg (например, -loglevel
напрямую) перед объявлением ввода.
(с). Если вы используете какое-либо аппаратно-ускоренное декодирование, например cuvid
, объявите его здесь и включите в него любые конкретные аргументы, которые ему требуются. На этом этапе необходимо упомянуть, что у декодеров есть определенные ограничения, такие как ожидаемое разрешение ввода, поддерживаемые кодеки и т. Д., И поэтому рекомендуется в производстве определить и проверить необходимость аппаратно-ускоренных декодеров в качестве сбоя. на этом этапе кодирование не выполняется и не подлежит восстановлению. Фактически, разработчики MPV неоднократно упоминали об этом , не полагаясь на аппаратно-ускоренное декодирование для доставки критически важного контента.
(Г). Объявите ваш вклад. Для потоков используйте URL и, если необходимо, добавьте дополнительные флаги (например, размеры буфера) по мере необходимости. Для локальных ресурсов (в доступной файловой системе) требуется абсолютный путь к файлу.
(Е). При желании вставьте фильтр. Это необходимо для таких функций, как изменение размера, диалоги формата пикселей, деинтерлейсинг и т. Д. Обратите внимание, что в зависимости от используемого здесь фильтра аппаратный декодер (как описано в разделе (c)) будет вводить ограничения, что ваш фильтр должен быть в состоянии обработать, иначе ваш код не удастся.
(е). Вызовите соответствующие видео и аудио кодеры, и передать необходимые аргументы для них, таких как отображения, битрейт, кодировщик пресеты и т.д. Когда речь идет о битрите, убедитесь , что ваши желаемые значения устанавливаются с помощью -b:v
, -maxrate:v
и -bufsize:v
опций. Не оставляйте это поле пустым. Это хорошая отправная точка того, почему эти значения имеют значение. Как всегда, начните с указания пресета. Прокрутите вниз, чтобы увидеть примечания о влиянии на производительность пресетов с этим конкретным кодером.
(грамм). Принимая во внимание, что FFmpeg может выводить требуемый выходной формат файла в зависимости от выбранного расширения выходного файла, рекомендуется явно объявить выходной формат (с помощью опции -f), чтобы при необходимости можно было передать дополнительные опции нижележащему мультиплексору. , как это часто бывает с потоковыми форматами, такими как HLS, mpegts и DASH.
(час). Абсолютный путь к выходному файлу.
С вашим примером выше, цитируемым как:
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"
В частности, с помощью Тьюринга вы также можете воспользоваться включением 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 (верификатор видеобуфера), из-за увеличенной задержки кодирования. Для ключевых кадров требуется больше данных, чем для других типов кадров, чтобы избежать пульсации некачественных ключевых кадров.
Режим с нулевой задержкой или секционированным потоком не имеет задержки, но этот параметр еще больше ухудшает качество многопоточности в поддерживаемых кодировщиках.
Поэтому целесообразно ограничить число потоков для кодов там, где имеет значение задержка, так как воспринимаемая пропускная способность кодера компенсирует любые преимущества, которые он может принести в долгосрочной перспективе.
И поскольку вы работаете в Windows, вы можете удалить \
вышеупомянутые оболочки, поскольку я пишу это из коробки Unix, тестирующей приведенную выше команду.
Примечания о влиянии на производительность с предустановками и соображениями чересстрочной кодировки:
Для обеспечения высокой пропускной способности и производительности с низкой задержкой убедитесь, что вы используете один llhp
или несколько llhq
предустановок. Это наиболее полезно для рабочих нагрузок, таких как потоковая передача в реальном времени, где ожидается более широкая совместимость с более широким спектром устройств, и, как таковые, возможности снижения производительности, такие как B-кадры, могут быть вообще опущены для хорошего компромисса между более высокими скоростями передачи в использование и пропускная способность. Более высокие предустановки (такие как настройки по умолчанию medium
) быстро уменьшают отдачу в качестве вывода, в то же время в значительной степени снижая пропускную способность кодера. Разница в качестве между измеряемой llhp
и llhq
измеряемой VMAF Netflixвеличиной практически ничтожна, однако прирост производительности кодера (более 30% на моем тестовом стенде) по сравнению с первым определенно ощутим.
Для llhp
и llhq
пресетов, а также других пресетов в использовании, вы можете переопределить встроенные методы контроля скорости, передавая -rc:v
аргументы, разоблачены вариантами датчика. Например, при кодировании с постоянной скоростью передачи битов вы можете указать -rc:v cbr
(что значительно быстрее, чем cbr_ld_hq
метод управления скоростью, что дополнительно увеличивает пропускную способность на ~ 20%). Обратите внимание, что выбранная предустановка оказывает наибольшее влияние на пропускную способность , за которой следуют предустановленные параметры (например, используемый метод управления скоростью), которые можно при желании изменить при желании.
Рассмотрите ваш рабочий процесс кодирования и отрегулируйте по мере необходимости. Ваш пробег будет определенно различаться, в зависимости от вашего исходного контента, используемых цепочек фильтров, конкретных переменных конфигурации pltform (таких как ваш GPU и версии драйверов) и т. Д.
В то же время обратите внимание, что NVIDIA явно отключила чересстрочное кодирование на Тьюринге на всех уровнях, даже в линии 1660Ti, в которой используется более старый кодер Volta NVENC. Если вам требуется поддержка чересстрочной кодировки, переключитесь на Pascal или более старые SKU.
scale_npp=w=1920:h=1080
потому что фильтры - это то, что больше всего выигрывает от графического процессора, верно? Другое дело, ограничение скорости передачи данных, по--b:v 1000k -minrate 500k -maxrate 3000k
видимому, делает размер выходного документа более предсказуемымМой опыт использования nvenc заключается в том, что вам нужно сказать ему, какой битрейт вы хотите - по умолчанию VBR, что хорошо, но никакие настройки не компенсируют тот факт, что он всегда хочет дать вам средний битрейт 2M независимо от того, в каком разрешении вы его кормите. Это похоже на ошибку в кодировщике; он работает предсказуемо во всех других отношениях, но ему нужно (например)
-b:v 4M
для файла 720p или-b:v 8M
для 1080p. Вы можете, возможно, тоже немного понизить их.источник
Libvorbis для аудио кажется медленным. AC3 должен дать вам 15% + ускорение.
При этом что-то не так с вашим видеодрайвером, или вы используете старую копию ffmpeg. q У меня нет вашего клипа, но я взял файл SD TS из моего PVR и использовал ваши настройки.
Я получил 700fps (ваши настройки) на GTX750 (не TI) (дешевле)
Я получил 925fps (ваши настройки с аудио ac3)
Другая рекомендация, которую я могу дать:
Измените свой Qmax примерно до 23.
источник
ffmpeg40\bin\ffmpeg -hwaccel cuvid -c:v mpeg2_cuvid -i "E:\input.ts" -c:v h264_nvenc "E:\output.mp4"
могли бы вы добавить свой код с AC3 i.stack.imgur.com/CNaWM.png