Ефективне кодування відео в Linux c Nvidia NVENC: частина 1, загальна


Ця стаття містить практичні відомості, корисні для організації ефективного кодування відео на Linux з використанням останніх відеопроцесорів Nvidia.
Чим не є ця стаття:
  • Не є посібником з вибору технології апаратного кодування або агітацією на користь описуваної. Крім Nvidia NVENC є Intel QuickSync, є AMD VCE, напевно, є і ще щось. Всі ці технології мають різні характеристики, які важко навіть укласти на одну шкалу для порівняння. Тим не менш, я зробив свій вибір.
  • Не є претензією на найшвидший/якісний спосіб кодування. З причин, вказаних вище.

Про NVENC

Nvidia NVENC це технологія, що дозволяє кодувати відео в H. 264 (і H. 265 для останніх процесорів Maxwell) силами GPU зі швидкостями кілька сотень кадрів в секунду (в залежності від профілю та дозволу). Вендор надає можливість використання цієї технології у вигляді набору розробника NVENC SDK.

Реалізація

Є безліч утиліт для різних платформ, які в будь-якому вигляді дають доступ до функціонала SDK. У березні 2015 року вийшов реліз ffmpeg, який включив в себе підтримку NVENC. ffmpeg займає центральне положення серед безлічі вільного і не дуже ПО для роботи з відео, тому з практичної точки зору він найбільш цікавий. Цим інструментом можна і обробляти відеофайли (1, 2), і вести потокове мовлення (1, 2). З моменту березневого релізу вийшов , який включив в себе ще більше опцій для кодека nvenc і підтримку H. 265 (HEVC).

Складанням FFmpeg з підтримкою NVENC ми і займемося.

Розгортання
Для створення робочої конфігурації нам буде потрібно:
  • Одна відеокарта Nvidia на ядрі Kepler або Maxwell. На мій погляд, найцікавіший вибір це GTX 970 — процесор Maxwell другого покоління (GM204) за 300$.
  • Один лінукс типової (ubuntu 14.04) на комп'ютері з відеокартою.


Драйвери і рантайм CUDA
Драйвери і бібліотеки встановити за одним пакетом. З репозиторію краще нічого не використовувати.
sudo apt-get update
sudo apt-get-y install axel build-essential dkms
axel 'http://developer.download.nvidia.com/compute/cuda/7_0/Prod/local_installers/cuda_7.0.28_linux.run'
chmod +x cuda_7.0.28_linux.run
sudo ./cuda_7.0.28_linux.run

На всі питання шановного комп'ютера слід відповісти ствердно. Після установки перезавантажити.

Відмінності файли nvenc
Для складання додатків з nvenc sdk неободимы деякі відмінності файли. Раніше їх необхідно було стягувати з виндовой версії SDK. Але прогрес йде семимильними кроками і тепер цей файл можна стягти з прикладів линуксовом SDK. Знайдіть в прикладах (були встановлені разом з рантаймом і драйверами на попередньому кроці) файли

nvCPUOPSys.h
nvEncodeAPI.h
nvFileIO.h
NvHWEncoder.h
nvUtils.h

і покладіть їх в /usr/include. Вони потрібні тільки один раз, при складанні ffmpeg. На всіх машинах вони не потрібні.

FFMPEG
Почати його збірку краще з установки всіх складальних залежностей.
sudo apt-get build-dep libav
sudo apt-get install-y libfdk-aac-dev libopencv-dev

Я міг щось забути, що щось може змінитися. Щоб знайти необхідний для складання файл, не соромтеся користуватися apt-file:
$ sudo apt-get install apt-file-y
$ sudo apt-file update
$ apt-file search libxcb-shm.so.0
libxcb-shm0: /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0
libxcb-shm0: /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0.0.0


Викачуємо з сайту останню версію ffmpeg, розпаковуємо, конфігуруємо, збираємо і встановлюємо:
axel 'http://ffmpeg.org/releases/ffmpeg-2.7.1.tar.bz2'
tar xf ffmpeg-2.7.1.tar.bz2
cd ffmpeg-2.7.1
./configure --cpu=native --enable-pthreads --extra-version=habrahabr.ru --enable-bzlib --enable-libdc1394 --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-libfdk-aac --enable-nonfree --enable-gpl --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --enable-libopencore-amrnb --enable-version3 --enable-libopencore-amrwb --enable-version3 --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-nvenc
make-j5
sudo make install

Збираємо з libfdk-aac, він точно краще наявного кодек aac. Крім іншого, можна помітити опцію --enable-nvenc. В іншому параметри обрані за мотивами билдспеки пакету libav в самому дистрибутиві ubuntu. Після всіх маніпуляцій повинен з'явитися робочий ffmpeg в /usr/local/bin/ffmpeg.

Застосування
Запуск
Опції запуску все точно такі ж, як при софтверному кодуванні, але тільки замість libx264 відеокодек буде називатися nvenc (він же nvenc_h264) для h.264 і nvenc_hevc для h.265.
/usr/local/bin/ffmpeg-i input.mov-vcodec nvenc-b:v 5000k-r 30 ... output.mp4


Продуктивність і якість
Щоб зробити 1 годину відео в 4х якостях з хорошою точністю транскодинга, потрібно витратити приблизно 1 годину машинного часу двох шестиядерних ксеонов, або трохи більш як півгодини часу десктопа з такою відеокартою. Якість результатів виходить неотличимое від програмного кодека x264 з аналогічними установками.

Обмеження
На жаль і ах, Nvidia ввела обмеження: на звичайних десктопних відеокартах не можна кодувати більше двох потоків відео одночасно. Зняття цього обмеження буде присвячена моя наступна стаття, яка, ймовірно, буде цікава трохи іншому колу читачів.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.