Как я могу использовать кодирование CRF с nvenc в ffmpeg?

22

Это моя текущая команда для изменения размера видео (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 для преобразования / изменения размера видео с высоким качеством и небольшим размером? Должен ли я использовать графический процессор для кодирования?

hongducwb
источник
Вы можете изменить , slowчтобы fastв первой команде. CRF не реализован в nvenc.
Гьян
Цель NVENC - разрешить кодирование видео в реальном времени (для таких вещей, как видеозвонки); качество является второстепенным фактором.
кл.

Ответы:

23

Для кодировок на основе 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, вот известные ограничения:

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

    Для кодирования HEVC применяются следующие ограничения:

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

У Тьюринга есть все улучшения, доступные для Pascal, с добавлением поддержки B-кадров для HEVC и возможностью использовать B-кадры в качестве эталона. Посмотрите этот ответ для примера этой возможности.

  1. И на 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
林正浩
источник
1
Отличный ответ! Вики ffmpeg на nvenc немного устарели и не имеют всей этой информации ... если бы у вас было несколько минут, было бы здорово, если бы вы могли поделиться
slhck
1
спасибо за ответ :) ffmpeg вики нужно больше ответов, как это
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.

Alexander01998
источник
1
Нет, -qpвсе отличается от -crf. h264_nvenc 's -qpэквивалентно libx264 ' s-qp
мяу
@ Моуу Это достаточно близко для меня, но приятно знать, что есть разница. Для тех, кто может увидеть это в будущем, эта страница объясняет разницу между CRF и QP.
Alexander01998
3

Для -crfзамены из libx264 может быть -cqили -qpиз h264_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
азбука
источник