Ось приблизне керівництво по налаштуванню кодера:
Ми почнемо з основ, оскільки було б згубно зробити висновок, що швидкий вибір варіантів раптово покращить очікуваний результат, не розуміючи бажаних цілей та очікувань:
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-адресу і, якщо потрібно, додайте додаткові прапорці (наприклад, розміри буфера) за потребою. Для локальних ресурсів (у доступній файловій системі) потрібен абсолютний шлях до файлу.
(е). За бажанням вставити фільтр. Це потрібно для таких функцій, як розмір розміру, розмова у форматі пікселів, де-переплетення тощо. Зауважте, що залежно від використовуваного тут фільтра апаратний декодер (як описано в розділі (с) введе обмеження, якими повинен бути ваш фільтр в змозі обробити, інакше ваш код не вийде.
(f). Викличте відповідні відео та аудіо кодери, і передати необхідні аргументи для них, таких як відображення, бітрейт, кодировщик пресети і т.д. Коли мова йде про бітрейте, переконайтеся , що ваші бажані значення встановлюються з допомогою -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. Якщо вам потрібна підтримка переплетеного кодування, перейдіть замість неї на Паскаль або старіші SKU.