Для кодировок на основе 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 B-кадра.
Основные части здесь являются -cq:v 19
и -rc:v vbr_hq
аргументы, которые позволяют вам настроить кодер как с переменной заданной скоростью передачи и максимально допустимой скоростью передачи ( -b:v
и -maxrate:v
) соблюдая при этом значения CRF 19.
А теперь небольшие заметки о NVENC и настройке его для высококачественного кодирования:
NVENC, как и любой другой аппаратный кодер, имеет несколько ограничений, и, в частности, HEVC, вот известные ограничения:
На Паскале:
Для кодирования HEVC применяются следующие ограничения:
- Размеры CTU выше 32 не поддерживаются.
- B-кадры в HEVC также не поддерживаются.
- Форматы текстур, поддерживаемые кодировщиком NVENC, ограничивают цветовые пространства, с которыми кодировщик может работать. На данный момент у нас есть поддержка 4: 2: 0 (8-битная) и 4: 4: 4 (для 10-битная). Внешние форматы, такие как 4: 2: 2 10-бит, не поддерживаются. Это повлияет на некоторые рабочие процессы, где такие цветовые пространства требуются.
- Управление заглядыванием вперед также ограничено 32 кадрами. Возможно, вы захотите взглянуть на эту статью для более подробной информации.
У Тьюринга есть все улучшения, доступные для Pascal, с добавлением поддержки B-кадров для HEVC и возможностью использовать B-кадры в качестве эталона. Посмотрите этот ответ для примера этой возможности.
И на Maxwell Gen 2 (графические процессоры серии GM200x):
Кодировка HEVC не имеет следующих функций:
- Возможности фильтра петлевого адаптивного смещения (SAO).
- Адаптивное квантование
- Прогнозный контроль скорости.
Влияние Максвелла на то, что тяжелые сцены в движении с HEVC при ограниченных битрейтах могут пострадать от артефактов (блочности) из-за отсутствующих функций просмотра и возможностей петлевой фильтрации с адаптивным смещением выборки (SAO). Pascal несколько улучшил эту возможность, но в зависимости от версии SDK, с которой был построен видеокодер, не все функции могут быть доступны.
Например, режим взвешенного прогнозирования для кодировок H.264 на Pascal требует NVENC SDK 8.0x и выше, и этот режим кодирования также отключит поддержку B-кадров. Аналогичным образом, комбинация аппаратных средств масштабирования, работающих на Nvidia Performance Primitives (NPP) с NVENC, может привести к повышению производительности в приложениях масштабирования видео за счет артефактов масштабирования, особенно с масштабированным контентом. Это также влияет на конвейер видеокодирования, поскольку функции масштабирования АЭС запускаются на ядрах CUDA на графическом процессоре, и поэтому влияние на производительность, вызванное дополнительной нагрузкой, следует анализировать в каждом конкретном случае, чтобы определить, соответствует ли качество производительности компромисс приемлем.
Имейте это в виду: аппаратный кодировщик всегда будет предлагать несколько меньшую настройку, чем эквивалентная программная реализация, и поэтому пробег и приемлемое качество вывода всегда будут отличаться.
И для вашей справки:
С FFmpeg вы всегда можете обратиться к настройкам кодера для настройки:
ffmpeg -h encoder {encoder-name}
Итак, для кодеров на базе NVENC вы можете запустить:
ffmpeg -h encoder=hevc_nvenc
ffmpeg -h encoder=h264_nvenc
Вы также можете увидеть все кодировщики на базе NVENC и масштабирующие устройства на базе NPP (если таковые созданы), выполнив:
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
slow
чтобыfast
в первой команде. CRF не реализован вnvenc
.