LINUX.ORG.RU

Howto: добавляем поддержку NVENC в ffmpeg

 , ,


3

1

Что такое ffmpeg?

А то вы не знаете.

Что такое nvenc?

Аппаратный кодер в h264 (и не только https://developer.nvidia.com/ffmpeg#FFmpeg_GPU_HW-Acceleration_Support_Table).

На каких картах работает?

Kepler (NVIDIA GeForce 6xx за исключением тех, которые базируются на Fermi) и новее.

Как включить?

Установите заголовочные файлы NVENC, взяв их отсюда: https://developer.nvidia.com/nvidia-video-codec-sdk#Download Файлы имеют имена *.h, например nvEncodeAPI.h. Класть в /usr/include (Upd: оказывается, можно в пространство пользователя - читаем конец статьи).

Gentoo

Есть USE-флаг «nvenc», «подтягивающий» media-video/nvidia_video_sdk Пруф

Arch

FFmpeg из дефолтных реп собран с nvenc. Пруф

Ubuntu

Имейте в виду что ffmpeg вернули лишь в последних релизах Ubuntu. Включаем репозиторий Source уот так уот. Обновляем базу пакетов apt-get. Выполняем:

sudo apt-get build-dep ffmpeg // зависимости для сборки
mkdir ~/build-ffmpeg
cd ~/build-ffmpeg
apt-get source ffmpeg // скачиваем исходный код ffmpeg. Ключ -b его сразу соберёт

Собирать командой fakeroot ./debian/rules binary, но нам сначала надо открыть файл rules, найти параметры для сборки, и добавить --enable-nonfree и --enable-nvenc. Первый, скорее всего, уже добавлен (для AAC).

Из исходников

Берём исходник ffmpeg. Распаковываем его куда-нибудь, например в ~/build-ffmpeg. Выполняем «ffmpeg», чтобы посмотреть, с какими параметрами configure он собран. Заходим в директорию с исходниками и пишем "./configure", затем копируем параметры. Только в них надо кое-что поменять:

  • Убираем всю эту кашу директорий: «это туда, это сюда». Тупо делаем --prefix=/home/username/build-ffmpeg/3.2/
  • Добавляем --enable-nvenc. Если по какой-то причине --enable-nonfree нет, добавляем и его тоже

Потом make и make install (без sudo). Всё. Использовать так:

LD_LIBRARY_PATH=/home/username/build-ffmpeg/3.2/lib/ /home/username/build-ffmpeg/3.2/bin/ffmpeg

Пользуемся

ffmpeg -i непожатое_видео.mkv -acodec libfaac -ac 2 -ab 128k -vcodec nvenc -preset hq -tune film пожатое_видео.mkv

Начиная с FFmpeg 3.2, вместо «nvenc» - «h264_nvenc», вероятно будет h265. И вместо libfaac теперь что-то другое.

Бонус

Не удивляйтесь моему комменту под записью с накладыванием стороннего патча на ffmpeg. Оказалось что патч уже в апстриме, я не знал. Выше я рассказывал только про NVENC. А ещё есть libnpp и CUVID, речь о которых пойдёт здесь.

libnpp (бывший nvresize) расширяет возможности NVENC, который разделён на часть без CUDA (nvenc) и с CUDA (nvenc+libnpp). Я считаю разумным отделение части функционала, требующего CUDA! У меня без libnpp не заработало только обрезание видео с 1600x900 до 1024x600 (хотел взять запись полного экрана и выхватить из него только окно с помощью -filter:v "crop=1024:600:263:75"). Я уверен что есть и другие применения libnpp, о которых я не знаю, и также уверен что большинству пользователей часть с CUDA не нужна: ведь что нужно большинству? Записывать видео с экрана (с минимальной нагрузкой на CPU), сжимать несжатые видео, ну и некоторым стримить в Твич.

CUVID теперь называется nvDecode. Насколько я понял, включение CUVID выступает в роли катализатора для декодирования и кодирования видео, перенося ещё больше действий с CPU на GPU. Как работает, Как пользоваться (спасибо hizel за ссылки).

Кстати, если вам нужны libnpp и CUVID, устанавливать CUDA Toolkit не нужно: тех файлов CUDA, которые есть в самом драйвере NVIDIA, будет достаточно.

Включается так:

--enable-nonfree --enable-nvenc --enable-cuda --enable-cuvid --enable-libnpp

Брал здесь: https://developer.nvidia.com/ffmpeg. Там ещё есть --extra-cflags=-Ilocal/include --extra-cflags=-I../nv_sdk --extra-ldflags=-L../nv_sdk, а значит я зря копировал всё в /usr/include - можно было в /home/username/build-ffmpeg/nv_sdk

Несколько других полезных ссылок: Доступные разрешения экранов, Моя подборка полезных команд для ffmpeg.

★★★★★

Последнее исправление: ZenitharChampion (всего исправлений: 45)

Лайк все, кто пришел от Бэдкомедиана :)

Очень круто, спасибо

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

Бонус

Пересборка с nvresize помогла. Все инструкции по включению nvresize - по ссылке на сообщение товарища (там PDF-ка). Только вот нюанс. В PDF-ке с инструкцией по включению дана ссылка на патч для ffmpeg, который не накладывается на современные версии. Там же сказано, что «патч сделан на базе ffmpeg GIT от 10 Nov 2015». Окей.

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
git checkout b83c849e8797fbb972ebd7f2919e0f085061f37f
cp ../ffmpeg_NVIDIA_gpu_acceleration.patch .
patch -p1 < ffmpeg_NVIDIA_gpu_acceleration.patch

Дальше - выполняйте мою инструкцию для Gentoo. Я на всякий случай поменял у себя NVENC SDK с 7.1 на 5.1, потому что в инструкции - именно эта версия (мало ли что). Добавьте, кстати, параметры "--enable-libvo-aacenc --enable-libaacplus --enable-libfaac", так как в этой версии ffmpeg ещё не удалили поддержку FAAC.

У меня не скомпилировалось, выдав ошибку «aacps_fixed_tablegen.c undefined reference to av_log». Попробовал коммит «7ad698e24e6b9dde57c4e01c145bcddfe9d6e4a3» (на неделю позднее), с ним всё Ок. Также ещё такая ошибка была:

LD	libavcodec/libavcodec.so.57
/usr/lib/gcc/x86_64-pc-linux-gnu/4.6.4/../../../../x86_64-pc-linux-gnu/bin/ld: ../cudautils/libcudautils.a(cudautils.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
../cudautils/libcudautils.a: could not read symbols: Bad value
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [libavcodec/libavcodec.so.57] Ошибка 1

Собственно, сделал что просили.

ZenitharChampion ★★★★★
() автор топика
Ответ на: Бонус от ZenitharChampion

так как в этой версии ffmpeg ещё не удалили поддержку FAAC.

А должны? Тогда что взамен?

iZEN ★★★★★
()
Ответ на: комментарий от stevejobs

> может, тебе собрать какой-нибудь пакет ffmpeg-nvenc? Или USE=nvenc ?

Мне лень, надеюсь что мейнтейнеры добавят сами.

ZenitharChampion ★★★★★
() автор топика

Ребята, если кому-то нужен nvresize, то патчить ничего не надо - в FFmpeg 3.2 добавили параметр --enable-cuda! Я обновил исходное сообщение.

ZenitharChampion ★★★★★
() автор топика

Устаревшая информация, неэффективное решения. Топик следует удалить и автора забанить за нубизм в районе

Заходим в директорию с исходниками и пишем "./configure", затем копируем параметры, в которых надо кое-что поменять:

Актуальная информация https://trac.ffmpeg.org/wiki/HWAccelIntro#CUDACUVIDNvDecode

hizel ★★★★★
()
Ответ на: комментарий от hizel

Спасибо за ссылку - сейчас добавлю её наверх. Топик удалять не надо: 2/3 из него полезно, а 1/3 я подредактировал сам. Судя по «In combination with nvenc...», nvenc ещё никуда не делся, а CUVID его только дополняет.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

nvresize это вялый nvidia патч, в новых ffmpeg который ты собираешь используется npp(набор алгоритмов использующий cuda). и да cuvid не дополняет, а превращает наконец транскод на nvenc в годноту, когда все преобразования происходят на видеокарте и это ускорение на порядок

If ffmpeg was compiled with support for libnpp, it can be used to insert a GPU based scaler into the chain:

ffmpeg -hwaccel_device 0 -hwaccel cuvid -c:v h264_cuvid -i input -vf scale_npp=-1:720 -c:v h264_nvenc -preset slow output.mkv

вот это вот

hizel ★★★★★
()
Ответ на: комментарий от hizel

А что такое CUVID? Он пришёл на смену VDPAU или NVENC?

Sample decode using CUVID, the cuvid decoder copies the frames to system memory in this case:

ffmpeg -c:v h264_cuvid -i input output.mkv

Вроде декодирование. А VDPAU чем хуже?

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от hizel

Кажется, до меня начинает доходить. Если использовать просто h264_nvenc, то будет быстро. А если добавить -hwaccel_device 0 -hwaccel cuvid (причём именно добавить, а не заменить этим h264_nvenc), то будет ещё быстрее?

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Всё, это была финальная правка. Кто ещё не читал - читайте, кто уже читал - перечитайте «Бонус».

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

Может использоваться как оба.

anonymous
()
Ответ на: комментарий от anonymous

Уф, это не сегодня. Запостил устаревший текст, потом 40 раз правил... На сайте http://gearsongallium.com/ есть информация, искать по слову gst-launch-1.0. Gstreamer умеет Encode с помощью VAAPI (Intel) и OpenMAX (AMD). А ещё у нас в Development сделали ускоряющий патч на Gstreamer по просьбе Novell-ch, владельца сайта по ссылке выше!

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 5)

лучше бы про свободный VAAPI написал

Harald ★★★★★
()

Что за тупизм про генту? Добавить 1 строчку в ебилд, и всего делов. А кто не умеет, тому гента не нужна. И хидеры можно тоже в ебилд, да.

ass ★★★★
()
Ответ на: комментарий от ZenitharChampion

libfdk-aac

О, нет. Сами пользуйтесь.

iZEN ★★★★★
()
Ответ на: комментарий от ass

Ага, а потом создать локальный оверлей (если не создан), а потом подписать... Проще собрать в юзерспейс. Я так Wine собираю, по директории на версию.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от ZenitharChampion

в юзерспейс

Домохозяйка, плес. Не вставляй зачётные слова если не уверен в их значении.

anonymous
()
Ответ на: комментарий от ZenitharChampion

Home directory, но это не точно.

anonymous
()
Ответ на: комментарий от ZenitharChampion

Каждый гентушник должен иметь локальный оверлей :)

ass ★★★★
()

С разморозкой! Последние версии FFmpeg из коробки поддерживают Nvenc, если установлен Nvidia драйвер. Ибо кодек теперь открытый, под MIT

Sunderland93 ★★★★★
()

В арче в дефолтном ffmpeg из реп nvenc работает искаропки. Можешь добавить в шапку.

Я так понимаю, он в crf не умеет, только битрейт минимальный/максимальный задавать ему? Потыкал немного. Жмёт h264_nvenc, конечно, очень намного быстрее, чем libx264, но качество на выходе получается хуже. И соотношение объём/качество тоже. Впрочем, для всякого стриминга, где важна скорость, или же когда на объём пофиг, но надо по-быстрому, подходит хорошо.

Psych218 ★★★★★
()
Ответ на: комментарий от anonymous

Мне нужно -level:v 4.0, иначе телек может не прочитать. Естественно, -profile:v high -level:v 4.0 вписывал и для libx264 и для h264_nvenc.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 1)
Ответ на: комментарий от ZenitharChampion

Зачем генту убрал? Написал бы что-нибудь навроде flaggie +nvenc media-video/ffmpeg.

ass ★★★★
()

Форумы обычно для задавания вопросов или обсуждения тем. Это ни то, ни другое. Больше всего похоже на непрошенное умничанье. И это в разделе Development, это не вики.

Andrey_Utkin ★★
()
USE=nvenc emerge -av =media-video/ffmpeg-9999

Пользуюсь где-то полгода или больше, даже не думал, что это какое-то достижение.

Nietzsche
()
Ответ на: комментарий от Nietzsche

Мой фейл. Я думал что раз на протяжении двух лет не добавляли USE-флаг, значит и за последние несколько месяцев - тем более. Я исправил статью: вместо Gentoo теперь «Из исходников», а про Gentoo и Arch написал что там доступно «из коробки».

ZenitharChampion ★★★★★
() автор топика
Последнее исправление: ZenitharChampion (всего исправлений: 1)

Спасибо автору темы! Очень интересные сведения.

Вопрос: а можно жать десять картинок 640x480 на одном GPU? В параллель. Вроде битрейт позволяет, но всегда вопрос: а может оно помнить 10 контекстов? Есть ли поддержка такового.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

libnpp (бывший nvresize)

сук, до слёз

Я считаю разумным отделение части функционала, требующего CUDA!

но зачем? cuda это мощный рычаг которым nvidia сейчас ворочает в своих рекламных буклетах, еще раз посмотри на https://developer.nvidia.com/sites/default/files/akamai/designworks/images/VC... , это не просто так красивая картинка

У меня без libnpp не заработало

что у тебя там незаработало?

Я уверен что есть и другие применения libnpp

нвидиа поцоны выдохнули, незря либушку писали

hizel ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Нужно что-то там у них покупать или крякать драйвер, на хабре было.

anonymous
()
Ответ на: комментарий от anonymous

не вариант... если это в самом деле платное или имеет ограничение на число потоков, то видимо это чудо техники не подходит для моих задач

I-Love-Microsoft ★★★★★
()

хотел взять запись полного экрана и выхватить из него только окно с помощью -filter:v «crop=1024:600:263:75»

ffmpeg -hide_banner -h decoder=h264_cuvid

hizel ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

На GeForce ограничение - 2 потока, на Quadro можно больше. Я попробовал сжимать два файла, содержащие видео 1280x720. В nvidia-settings в графе «Video Engine Utilization» один процесс ест 45%, два - 90%.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от hizel

Я так понимаю, VDPAU и NVENC работают не на базе ядер CUDA, поэтому не снижают производительность игр. Поэтому записывать геймплей игры лучше без CUDA.

ZenitharChampion ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Чисто в теории, нагрузка на Video Engine должна быть слабой, значит можно. Кстати, открой новость о релизе драйвера 352.xx, там подробно о том, что на Квадре, а что на ДжиФорсе

ZenitharChampion ★★★★★
() автор топика
5 апреля 2018 г.
Ответ на: комментарий от Psych218

Как ни крути nvenc, а качество будет хуже x264.

nvenc жму так: -c:v h264_nvenc -r 60 -s 1920x1080 -preset llhq -rc vbr_minqp -qmin:v 1 -qmax:v 21 -bf:v 4 -b:v 10000k -maxrate:v 20000k -b:a 128k

x264 жму так: -c:v h264 -r 60 -s 1920x1080 -preset veryslow -crf 17 -b:a 128k

Размеры файлов с такими настройками на выходе сопоставимые. У x264 цвет лучше и детализация выше, хоть и жмёт раза в два медленнее nvenc. Карта GTX960, проц Xeon E5-1650v3.

saper ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.