Сборка пакета FFmpeg из исходных кодов (с поддержкой CUDA)

by Anton Chernousov aka GITA-DEV


Опубликовано: 28 Фев 2018 (последние правки 2 месяца)


Сборка пакета FFmpeg из исходных кодов (с поддержкой CUDA)

Использование аппаратного ускорения позволяет значительно ускорить операции обработки видео, но штатное ПО входящее в поставку дистрибутива Ubuntu Linux не поддерживает аппаратное кодирование/декодирование видео и для активации поддержки NVENCODE вам потребуется собрать FFMPEG из исходных кодов.

Если у вас есть видеокарта класса NVIDIA Quadro, Tesla, GRID или продукты GeForce поколений Fermi, Kepler, Maxwell и Pascal, то вы можете задействовать NVIDIA VIDEO CODEC SDK для ускорения кодирования-декодирования видео.

Схема использования аппратаного ускорения для декодирования видео

Более подробно с описанием технологии вы можете познакомиться на официальной странице NVIDIA VIDEO CODEC SDK, я же в свою очередь хотел продемонстрировать практическую часть сборки FFMPEG с поддержкой аппаратного ускорения и провести некоторые замеры.

Установка пакетов необходимых для сборки обычной версии FFMEG

Естественно, что первым делом нам необходимо подготовить окружение для сборки обычной версии FFMPEG и лишь потом подключить возможность аппаратного ускорения. Стандартный пакет ffmpeg в поставке Ubuntu Linux 16.04 собран со следующим набором ключей:

--toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth \
--enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite \
--enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse \
--enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame \
--enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx \
--enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r \
--enable-libfreetype  --enable-libopencv --enable-libx264 --enable-shared --enable-libfontconfig --enable-libfreetype

Я в свою очередь соберу последнюю стабильную версию из официального GitHub-репозитория, с аналогичным набором ключей но другим префиксом и в итоге у меня получится две версии ffmpeg и мы сможем проверить насколько поможет при перекодировании видеокарта GeForce GTX 1050 Ti.

Для сборки пакета аналогичного стандартной поставке дистрибутива установите необходимое для сборки окружения из компиляторов, заголовочных файлов и других пакетов сопровождения, после чего клонируем гит-репозиторий и собираем (аналогичная операция мной уже несколько раз рассматривалась):

# apt-get install build-essential nasm yasm
# apt-get install autoconf automake build-essential cmake git libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool
# apt-get install libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev mercurial pkg-config texinfo wget zlib1g-dev
# apt-get install libx264-dev libx265-dev libvpx-dev libmp3lame-dev libopus-dev libfaac-dev libfdk-aac-dev libchromaprint-dev
# apt-get install frei0r-plugins-dev ladspa-sdk libiec61883-dev libavc1394-dev libbluray-dev libbs2b-dev libdc1394-22-dev
# apt-get install flite1-dev flite-dev libgme-dev libgsm1-dev libmysofa-dev libopencv-dev libopenjpeg-dev libopenmpt-dev 
# apt-get install librsvg2-dev librubberband-dev libshine-dev libsnappy-dev libsoxr-dev libspeex-dev libtwolame-dev
# apt-get install libwavpack-dev libwebp-dev libxvidcore-dev libzmq3-dev libzmq5-dev libzmqpp-dev libzvbi-dev libomxil-bellagio-dev
# apt-get install libcdio-dev libcdio-paranoia-dev 
# cd /usr/src/
# git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
# cd ./ffmpeg/
# git checkout -b remotes/origin/release/3.4
#  ./configure --enable-nonfree --prefix=/usr/local/ffmpeg --enable-gpl --disable-stripping --enable-avresample --enable-avisynth \
--enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite \
--enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt \
--enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr \
--enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack \
--enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal \
--enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r \
--enable-libfreetype  --enable-libx264 --enable-shared --enable-libfontconfig --enable-libfreetype
# make && make install

Проверяем, что все необходимые компоненты собрались:

# ls /usr/local/ffmpeg/bin/
ffmpeg  ffplay  ffprobe

Самое сложное на данном этапе было подобрать все необходимые заголовочные файлы, которые требуются для сборки и теперь можем приступать к сборке второго экземпляра ffmpeg, но уже с поддержкой графического ускорения видео-обработки.

Сборка FFMPEG с поддержкой CUDA и NVENC

Сборка FFMPEG с поддержкой CUDA сводится к добавлению нескольких дополнительных опций к конфигурации сборки:

--enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64

Но не все так просто и основная сложность это установка CUDA SDK путь к заголовочным файлам которого как раз и передается в дополнительных флагах сборки. Вам потребуется установить последние стабильные драйвера для вашей видео-карты и это вы можете сделать полностью автоматически используя команду:

# ubuntu-drivers autoinstall

Это самый простой способ установить последние стабильные драйвера для видео-карт Nvidia. Хотя, раньше я рекомендовал использовать бинарные пакеты с сайта Nvidia (http://www.nvidia.com/Download/index.aspx?lang=en-us), но последнее время я отказался от этой практики на Ubuntu Linux. Вы можете конечно установить бинарные пакеты драйверов если обладаете достаточной квалификацией для этой операции.

После установки драйверов видео-каты, установите CUDA SDK и он в свою очередь поставляется или в виде deb-пакетов или бинарного файла для установки. Просто перейдите на сайт https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604 и выберите необходимый тип поставки.

Загрузка NVIDIA Cuda

Я предпочитаю бинарный инсталлятор и его установка проходит достаточно просто, сопровождаясь консольным мастером установки где вам потребуется лишь отказаться от сборки модуля ядра для драйверов видеокарты (он у нас установлен при помощи пакетного менеджера).

Аналогично простой сборке FFMPEG соберем версию с поддержкой CUDA и NVENC добавив к конфигурации сборки представленные выше опции:

./configure --enable-nonfree --prefix=/usr/local/ffmpeg-cuda --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls \
 --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfribidi \
--enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus \
--enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh \
--enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 \
--enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm \
--enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libfreetype  --enable-libx264 --enable-shared --enable-libfontconfig \
--enable-libfreetype --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include \
--extra-ldflags=-L/usr/local/cuda/lib64

Собранная версия FFMPEG с поддержкой аппаратного сжатия находится к каталоге /usr/local/ffmpeg-cuda/bin/ и мы можем приступать к бенчмарк-тестам и тестирование проводить мы будем на простом перекодировании (нормализации) и эти операции я уже описывал в своей статье: Обработка видео для публикации в интернет (подготовка к публикации видео на Youtube при помощи FFmpeg).

Сравним скорость обработки видео с CUDA и без CUDA

Проведем нормализацию видео файла сначала первым методом (без аппаратного ускорения):

# /usr/local/ffmpeg/bin/ffmpeg -i ./TopSnes-2018-03-27_14.29.04.mkv -preset slow  -vcodec h264 -acodec aac ./no-cuda-resample.mp4

Операция заняла: 2 минуты 12 секунд и в результате обработки получился файл объемом 33 мегабайт.

И наконец, аналогичная операция но с аппаратной поддержкой:

# /usr/local/ffmpeg-cuda/bin/ffmpeg -i ./TopSnes-2018-03-27_14.29.04.mkv -preset slow -c:v h264_nvenc -acodec aac ./cuda-resample.mp4

Операция заняла: 34 секунды и файл занял 86 мегабайт.

Как вы видите, для активации режима аппаратной поддержки обработки видео используется кодек h264_cuvid для декодирования:

# ffmpeg -vsync 0 -c:v h264_cuvid -i <input.mp4> -f rawvideo <output.yuv>

И кодек h264_nvenc для кодирования видео:

ffmpeg -f rawvideo -s:v 1920x1080 -r 30 -pix_fmt yuv420p -i <input.yuv> -c:v h264_nvenc -preset slow -cq 10 -bf 2 -g 150 <output.mp4>

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


Есть вопросы?
Спрашивайте и я обязательно вам отвечу!

* Поля обязательные для заполнения .

Блог это некоммерческий проект! Если вам понравился мой блог и то что я пишу помогло вам на практике, то можете сказать спасибо материально.