Как я могу использовать кодирование 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 для преобразования / изменения размера видео с высоким качеством и небольшим размером? Должен ли я использовать графический процессор для кодирования?
5 ответов
Для кодов на основе 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-кадры (ограничьте это максимум 4, и для этого требуется основной профиль H.264 и выше. Базовые профили не поддерживают B-кадры. Для этого передайте -bf {uint}
к видео кодеру, так что -bf:v 4
приведет к тому, что кодер будет использовать 4 B-кадра.
Ключевыми частями здесь являются -preset
и -rc:v vbr_minqp
аргументы, которые позволяют настраивать кодировщик как с предустановленной переменной скоростью передачи битов, так и с максимально допустимой скоростью передачи битов. (-b:v
а также -maxrate:v
)
А теперь небольшие заметки о NVENC и настройке его для высококачественного кодирования:
NVENC, как и любой другой аппаратный кодер, имеет несколько ограничений, и, в частности, с HEVC, вот известные ограничения:
На Паскале:
Для кодирования HEVC применяются следующие ограничения:
- Размеры CTU выше 32 не поддерживаются.
- B-кадры в HEVC также не поддерживаются.
- Форматы текстур, поддерживаемые кодировщиком NVENC, ограничивают цветовые пространства, с которыми кодировщик может работать. На данный момент у нас есть поддержка 4:2:0 (8-битная) и 4:4:4 (для 10-битная). Внешние форматы, такие как 4:2:2 10-бит, не поддерживаются. Это повлияет на некоторые рабочие процессы, где такие цветовые пространства требуются.
- Управление заглядыванием вперед также ограничено 32 кадрами. Возможно, вы захотите взглянуть на эту редакцию для более подробной информации.
И на 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
За -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
Я не являюсь авторитетом в этом вопросе, но я провел большое количество исследований, особенно для архивирования рипов Bluray с неразличимым и прозрачным сжатием по сравнению с исходным рипом для файлов с видеопотоками HEVC/h.265 с использованием аппаратного ускорения кодировщика Nvidia. Я забочусь об этом, поэтому, прежде чем переходить к какой-либо конкретной настройке, я рекомендую протестировать две отдельные части каждого фильма. Я выбрал 2 части: самая темная часть фильма и часть с быстрым движением.
Я пропускаю звук в обоих тестах и визуализирую только около 1 минуты по нескольким причинам: для просмотра вперед требуется заданное количество кадров, а битрейт колеблется от сцены к сцене. Вот что я использую с FFMPEG для тестирования 1 минуты видео с 30 минут 00 секунд до 31 минуты 00 секунд.
Кроме того, я тестирую файл с
-qp
22, 23, 24 для HEVC/h.265. Я не могу сказать, что разница будет ниже. При переходе выше 24 появляются цветовые полосы на темных сценах, в сценах со светящимся светом или на небе с плавным переходом от белого к синему.
ffmpeg -hwaccel auto -ss 00:30:01 -to 00:31:01 -i input.mkv -map 0:v:0 -map 0:a:0 -map 0:s:0 -c copy -c:v hevc_nvenc -rc constqp -qp 24 -b:v 0K -c:a copy output.mkv
В
-map 0
соответственно, демультиплексирует первый поток видео, аудио и субтитров (хотя субтитры технически не являются потоком, я просто называю его так для простоты) и назначает их первому потоку в повторно упакованном файле. Остальные настройки описаны ранее на этой странице, или их можно найти.
ОБРАТИТЕ ВНИМАНИЕ:
Контейнер должен быть MKV для повторного объединения субтитров... по какой-то причине... Я просто не мог заставить MP4 работать. Опять же, я в этом не профессионал, но результаты, которые я получил, исключительно хороши.
После того, как я проверил 1-минутные тестовые файлы и мне понравилось то, что я увидел, я продолжаю обрабатывать фильмы без
-ss 00:30:01 -to 00:31:01
. Я предлагаю, когда вы смотрите на файл, покадрово воспроизводить рендеринг в течение 1 минуты.
Я считаю, что нашел решение:
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
,
.......-rc constqp -qp 21 Сообщение от FFMPEG Выбранный пресет устарел. Используйте p1–p7 + -tune или быстрый/средний/медленный. FFMPEG, февраль 2023 г.
Вот последняя информация о том, что ссылки не повреждены для версии (от июля 2020 г.) https://developer.nvidia.com/blog/introducing-video-codec-sdk-10-presets/ Я использую -preset 'slow' -b:v 0, и он обеспечивает скорость 20 Мбит на 65-битном источнике H265, 1,3x в реальном времени ~32 кадра в секунду на 2080 4K. «hq» был бы моим вторым выбором, немного быстрее.