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

Это моя текущая команда для изменения размера видео (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 для кодирования?

22
задан slhck
24.03.2023 3:51 Количество просмотров материала 3572
Распечатать страницу

3 ответа

для кодирования на основе CRF передайте FFmpeg следующие аргументы во фрагменте кода ниже:

-c:v h264_nvenc -preset llhq -rc:v vbr_minqp -qmin:v 19 -qmax:v 21 -b:v 2500k -maxrate:v 5000k -profile:v high

конечно, вам нужно настроить для целевых битовых скоростей и целевой минимум и максимум -qp значение. 19 является рекомендуемым параметром, поскольку его " визуально идентичный 0, но сохраняет хороший компромисс сжатия до размера файла. 21-пиковое значение, которое ограничивает кодировщик не превышать этого в пределах данного диапазона битовой скорости.

отметим, что -qp масштаб логарифмический, что означает, что 0 по существу без потерь, а 51 будет абсолютным худшим.

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

ключевые части здесь -preset и -rc:v vbr_minqp аргументы, которые позволяют настраивать кодировщик как с заданным переменным битрейтом, так и с максимально допустимым. (-b:v и -maxrate:v)

а теперь, небольшие заметки про NVENC, и тюнинг его на высокое качество кодирует:

NVENC, как и любой другой аппаратный кодировщик, имеет несколько ограничений, и в частности с HEVC, вот известные ограничения:

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

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

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

    кодировка HEVC не имеет следующих особенностей:

влияние здесь для Максвелла заключается в том, что тяжелые сцены движения с HEVC при ограниченных битрейтах могут страдать от искусственного (блочности) из-за отсутствующих функций lookahead и возможностей фильтрации петель адаптивного смещения образца (SAO). Pascal несколько улучшил эту возможность, но в зависимости от версии SDK, с которой был построен видеокодер, не все функции могут быть доступны.

например, взвешенный режим прогнозирования для H. 264 кодирует на Pascal требует NVENC SDK 8.0 x и выше, и этот режим кодирования также отключит поддержку B-кадра. Аналогичным образом, сочетание аппаратных масштабаторов, работающих с Nvidia Performance Primitives (NPP) с NVENC, может повысить производительность приложений масштабирования видео за счет искусственного масштабирования, особенно с масштабируемым контентом. То же самое также влияет на конвейер кодирования видео, поскольку функции масштабирования NPP работают с ядрами CUDA на GPU, и как таковой, влияние дополнительной нагрузки на производительность следует анализировать на индивидуальной основе, чтобы определить, является ли приемлемым компромисс качества производительности.

имейте это в виду: аппаратный кодировщик всегда будет предлагать несколько меньшую настройку, чем эквивалентная программная реализация, и поэтому ваш пробег и приемлемое качество вывода всегда будут отличаться.

и для ссылка:

С 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
13
отвечен 林正浩 2023-03-25 11:39

на -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
2
отвечен abc 2023-03-25 13:56

Я считаю, что нашел решение:

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
отвечен Alexander01998 2023-03-25 16:13

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх