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

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

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

Фотография автора

Автор: Антон Черноусов
Опубликовано: 3 месяца, 2 недели (последние правки: 0 минут назад) - 0 комментариев
Категории записи: Kdenlive, Linux, Ubuntu, Usability, Video, Рабочие станции, Системное администрирование


Если у вас есть видеокарта класса 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 для видео обработки это обоснованный шаг.

Пожалуйста, оцените мою статью (всего оценок 1, средняя оценка 4.00):

Комментарии к статье:

Пока комментариев нет

Оставьте комментарий:

обязательно

обязательно (не публикуется)

необязательно

обязательно

обязательно

Последние записи

Архив

2018

Категории

Ленты

RSS / Atom