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)
Ответ на: комментарий от 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

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

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