Лучшие настройки для FFMpeg с NVENC
Я использую свой FFMPEG с поддержкой моего графического процессора (NVENC) для преобразования файлов из моего спутникового приемника (SD, mpeg2 .TS-Files) в 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
уже должен быть лучший качественный подход, верно?
4 ответа
Вот примерное руководство по настройке кодера:
Мы начнем с основ, так как это пагубно для того, чтобы сделать вывод, что быстрый набор опций внезапно улучшит ожидаемый результат без понимания желаемых целей и ожиданий:
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.
Затем, используя эту информацию, перейдите к следующему шагу.
3. Синтаксис имеет решающее значение:
Вот порядок, в котором вы должны передавать аргументы в FFmpeg:
(А). Вызовите двоичный файл.
(Б). Передайте любые аргументы в FFmpeg (например, -loglevel
непосредственно) до объявления входных данных.
(С). Если вы используете любое аппаратно-ускоренное декодирование, такое как cuvid
, объявите это здесь и включите любые конкретные аргументы, которые требуются. На этом этапе необходимо упомянуть, что декодеры имеют определенные ограничения, такие как ожидаемое разрешение ввода, поддерживаемые кодеки и т. Д., И поэтому рекомендуется в производстве отключить аппаратно-ускоренные декодеры, поскольку на этом этапе возникают ошибки. в не удалось кодировать и не подлежит восстановлению. Фактически, разработчики MPV неоднократно упоминали об этом, не полагаясь на аппаратно-ускоренное декодирование для доставки критически важного контента.
(Г). Объявите ваш вклад. Для потоков используйте URL-адрес и, если необходимо, добавьте дополнительные флаги (например, размеры буфера) по мере необходимости. Для локальных ресурсов (в доступной файловой системе) требуется абсолютный путь к файлу.
(Е). При желании вставьте фильтр. Это необходимо для таких функций, как изменение размера, диалоги в формате пикселей, деинтерлейсинг и т. Д. Обратите внимание, что в зависимости от используемого здесь фильтра аппаратный декодер (как описано в разделе (c)) будет вводить ограничения, которые ваш фильтр должен иметь обрабатывать, иначе ваш код не удастся.
(Е). Вызовите соответствующие видео- и аудиокодеры и передайте им необходимые аргументы, такие как сопоставления, битрейты, предустановки кодировщика и т. Д.
(г). Принимая во внимание, что 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"
Вы можете повысить его выходное качество, сместив более высокую скорость передачи битов, включив методы кодирования с адаптивным квантованием (поддерживаются методы пространственного и временного AQ, и одновременно может использоваться только один, и обратите внимание, что это также отключает поддержку B-кадров) и опциональное включение методов взвешенного прогнозирования, как показано ниже, а также дополнительный фильтр для надлежащего уменьшения масштаба и изменения размера, если это необходимо:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"
В приведенном выше фрагменте предполагается, что входной файл является потоком 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 scale_npp=w=1920:h=1080:format=yuv420p:interp_algo=lanczos \
-c:v h264_nvenc -preset:v llhq -profile:v main -level:v 4.1 -rc:v ll_2pass_quality -rc-lookahead:v 32 -temporal-aq:v 1 -weighted_pred:v 1 -coder:v cabac \
-f mp4 "e:\output.mp4"
Дополнительная заметка о количестве потоков (передается в ffmpeg через -threads
опция):
Чем больше потоков кодировщика превышает определенный порог, тем больше задержка и будет занимать большую площадь памяти для кодирования. Ухудшение качества является более заметным с большим количеством потоков в режимах с постоянной скоростью передачи битов и в режиме с почти постоянной скоростью передачи битов, называемым VBV (верификатор видеобуфера), из-за увеличенной задержки кодирования. Для ключевых кадров требуется больше данных, чем для других типов кадров, чтобы избежать пульсации ключевых кадров низкого качества.
Режим с нулевой задержкой или секционированным потоком не имеет задержки, но этот параметр еще больше ухудшает качество многопоточности в поддерживаемых кодировщиках.
Поэтому целесообразно ограничить число потоков для кодов там, где имеет значение задержка, так как воспринимаемая пропускная способность кодера компенсирует любые преимущества, которые он может принести в долгосрочной перспективе.
И поскольку вы работаете в Windows, вы можете удалить оболочку \
выше, поскольку я пишу это из коробки Unix, тестирующей команду выше.
Мой опыт использования 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.
Ответ здесь:информация об опции hevc_nvenc
ffmpeg -strict 2 -hwaccel auto -i "inputfile.mp4" -c:v hevc_nvenc -rc vbr -cq 24 -qmin 24 -qmax 24 -profile:v main10 -pix_fmt p010le -b:v 0K -c:a aac -map 0 "outputfile.mp4"