Як я можу використовувати кодування CRF за допомогою nvenc у ffmpeg?


23

Це моя поточна команда щодо зміни розміру відео (1080p) від 2 ГБ до 300 МБ, але це займає багато часу:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Я спробував nvenc зі своїм NVIDIA GTX1070:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Розмір виводу завжди становить 3⨉ або 5⨉ вихідного розміру - nvenc не використовує -crf.

Тож як я можу використовувати nvenc з ffmpeg для перетворення / розміру відео з високою якістю та невеликим розміром? Чи варто використовувати GPU для кодування?


Ви можете змінити , slowщоб fastв першій команді. CRF не реалізовано в nvenc.
Gyan

Мета NVENC - дозволити кодування відео в режимі реального часу (для таких речей, як відеодзвінки); якість - це підпорядкований розгляд.
ЗР.

Відповіді:


24

Для кодувань на основі CRF передайте наступні аргументи у фрагменті нижче до FFmpeg:

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

Звичайно, вам потрібно буде скоригувати цільові бітові швидкості та фіксовану cqвеличину. 19 - рекомендована настройка як "візуально ідентична 0, проте зберігає хорошу компресію на компресію до розміру файлу. Дивіться цю рецензію для більш того, що робить CRF.

Зауважимо, що -cqшкала є логарифмічною, тобто 0 по суті є без втрат, а 51 - найгіршим.

Якість можна покращити, додавши такі параметри, як B-кадри (обмежте максимум на 3, а для цього потрібен основний профіль H.264 і вище. Базові профілі не підтримують B-кадри. Для цього перейдіть -bf {uint}до відео кодер, такий, що -bf:v 4приводив би до кодування з використанням 4 В-кадрів.

Ключовими частинами тут є аргументи -cq:v 19та -rc:v vbr_hqаргументи, які дозволяють налаштувати кодер як із заданим бітрейтом змінної, так і з максимально допустимим бітрейтом ( -b:vі -maxrate:v), дотримуючись значення CRF 19.

А тепер невеликі нотатки про NVENC та налаштування його на якісні коди:

NVENC, як і будь-який інший апаратний кодер, має кілька обмежень, зокрема, з HEVC, ось відомі обмеження:

  1. На Паскалі:

    Для кодексів HEVC застосовуються такі обмеження:

    • Розміри CTU вище 32 не підтримуються.
    • B-кадри в HEVC також не підтримуються.
    • Формати текстур, підтримувані кодером NVENC, обмежують кольорові простори, з якими може працювати кодер. Наразі ми підтримуємо 4: 2: 0 (8-бітові) та 4: 4: 4 (для 10-бітових). Сторонні формати, такі як 10: 2: 2 10-розрядні, не підтримуються. Це вплине на деякі робочі процеси, де потрібні такі простори кольорів.
    • Керування вперед також обмежене 32 кадрами. Ви можете переглянути цю редакцію для отримання більш детальної інформації.

Turing має всі вдосконалення, доступні для Pascal, з додаванням підтримки B-кадру для HEVC та можливості використовувати B-кадри в якості еталону. Дивіться цю відповідь для прикладу цієї можливості.

  1. А на Maxwell Gen 2 (графічні процесори серії GM200x):

    У кодуванні HEVC відсутні такі функції:

Вплив на Максвелла полягає в тому, що важкі сцени руху з HEVC під обмеженими бітратами можуть постраждати від артефактування (блокади) через відсутні функції функцій пошуку та адаптації циклу адаптивного зсуву (SAO). Паскаль дещо покращив цю можливість, але залежно від версії SDK, з якої було побудовано відеокодер, не всі функції можуть бути доступні.

Наприклад, для зваженого режиму передбачення для кодувань H.264 на Pascal потрібен NVENC SDK 8.0x і вище, і цей режим кодування також відключить підтримку B-кадру. Аналогічно, комбінація апаратних масштабувальників, що працюють на Nvidia Performance Primitive (NPP) та NVENC, може внести поліпшення продуктивності в додатки для масштабування відео за рахунок масштабування артефактування, особливо з розширеним вмістом. Це також впливає на конвеєр відеокодування, оскільки функції масштабування АЕС запускають ядра CUDA на графічному процесорі, і, як такий, вплив продуктивності, що вводиться додатковим навантаженням, слід аналізувати в кожному конкретному випадку, щоб визначити, чи якість продуктивності компроміс є прийнятним.

Пам'ятайте про це: апаратний кодер завжди пропонує дещо менші налаштування, ніж еквівалентна реалізація на основі програмного забезпечення, і, як такий, ваш пробіг та прийнятна якість виходу завжди будуть відрізнятися.

Для довідки:

За допомогою FFmpeg ви завжди можете звернутися до налаштувань кодера для настройки:

ffmpeg -h encoder {encoder-name}

Отже, для кодерів на основі NVENC ви можете запускати:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

Ви також можете побачити всі кодери на базі NVENC та масштабувачі на АЕС (якщо такі побудовані), виконавши:

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

Вибірка зразка на моїй тестовій панелі:

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion

1
Чудова відповідь! Вікі ffmpeg на nvenc трохи застаріла і не вистачає всієї цієї інформації ... якщо у вас є кілька хвилин, було б чудово, якщо ви могли б внести свої знання там: trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
дякую за відповідь :) ffmpeg wiki потрібна така відповідь, як ця
hongducwb

Дякуємо за відгук. Я розгляну, як додати це до вікі FFmpeg.
林正浩

Вихідні файли кольорів здаються темнішими, я пам’ятаю, один аргумент може керувати кольором так само, як і вхідний файл
hongducwb

2
vbr_minqpначебто застаріло. Ви згодні з тим, що ця відповідь може бути неправильно зрозуміла, оскільки немає режиму CRF h264_nvenc.
slhck

4

Я вважаю, що знайшов рішення:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Здається, що h264_nvenc використовує -qpзамість -crf. Ця опція працює лише тоді, коли -rcвстановлено значення constqp.


1
Ні, -qpчи відрізняється кожен -crf. h264_nvenc 's -qpеквівалентно libx264 ' s-qp
Meow

@Meow Це досить близько для мене, але добре знати, що є різниця. Для тих, хто може бачити це в майбутньому, на цій сторінці пояснюється різниця між CRF та QP.
Олександр01998

3

Для -crfзаміни libx264 може бути -cqабо -qph264_nvenc:

-crf Виберіть якість для режиму постійної якості

-cq Встановіть цільовий рівень якості (від 0 до 51, 0 означає автоматичний) для режиму постійної якості в контролі швидкості VBR

-qp Метод контролю швидкості параметрів постійної квантування (від -1 до 51) (за замовчуванням -1)

Найшвидший апаратний прискорений метод кодування:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizeроздільна здатність на вхід (апаратно); не потрібно збирати ffmpeg --enable-libnppдля scale_nppфільтру.

Для отримання додаткової інформації:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.