При работе с потоковым видео качество и скорость воспроизведения играют ключевую роль. Можно ли настроить многопоточную трансляцию без покупки дорогостоящего «железа»? Попробуем разобраться.

Проблема. Качественная трансляция видео обычно предполагает серьезные издержки: нужно выделить помещение и создать в нем инженерную инфраструктуру, закупить оборудование и нанять сотрудников для его обслуживания, арендовать каналы передачи данных и провести другие необходимые мероприятия. В зависимости от масштаба проекта только капитальные вложения могут потребовать значительных бюджетов.

Какова альтернатива?

Существенно снизить капитальные затраты и перевести их в операционные можно за счет аренды облачных серверов с GPU, причем стоит сделать ставку на аппаратное транскодирование на NVIDIA NVENC. Кроме сокращения расходов, вы упростите организацию трансляции живых потоков. 

А вот для организации вещания стоит попробовать FFmpeg. 

Мы используем этот бесплатный набор библиотек с открытым кодом для автоматизированного тестирования видеокарт. Внедрить и обслуживать решения на его основе довольно просто, к тому же они отличаются высокой скоростью кодирования и декодирования потоков. Повышение скорости достигается за счет отказа от копирования кодированных файлов в системную память: процесс кодирования осуществляется с использованием памяти графического чипа.

Схема процесса транскодинга с применением FFmpeg:

Патч для драйвера и сборка FFmpeg

Проводить тестирование мы будем в Ubuntu Linux, причем начнем с игровых графических ускорителей: GeForce GTX 1080 Ti и GeForce RTX 3090. В реальных проектах они не используются, но продемонстрировать разницу между транскодированием на CPU и GPU вполне способны. Производитель не считает эти адаптеры «квалифицированными» и ограничивает максимальное количество одновременных сеансов транскодирования видео NVENC. Чтобы решить эту проблему, придется применить хитрость и отключить проверку с помощью выложенного энтузиастами на GitHub патча для видеодрайвера.  

Патч не потребуется для профессиональных видеокарт, например, таких как RTX A4000 или A5000, поскольку для них в драйвере нет жесткого ограничения количества потоков. Список видеокарт NVIDIA с поддержкой NVENC доступен на сайте производителя. Технологию можно использовать в виде набора разработчика NVENC SDK.

Также необходимо собрать FFmpeg с поддержкой GPU NVIDIA. Пока мы не выложили его в репозиторий, поэтому приведем подробную инструкцию для Ubuntu (в других дистрибутивах Linux порядок действий сходный):

# Compiling for Linux
# FFmpeg with NVIDIA GPU acceleration is supported on all Linux platforms.
# To compile FFmpeg on Linux, do the following:
# Clone ffnvcodec
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
# Install ffnvcodec
cd nv-codec-headers && sudo make install && cd –
# Clone FFmpeg's public GIT repository.
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg/
# Install necessary packages.
sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
# Configure
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared
# Compile
make -j 8
# Install the libraries.
sudo make install

Настройка трансляции

Для трансляции потокового видео c использованием FFmpeg нам понадобится ffserver. Отредактируем файл ffserver.conf (стандартный путь к нему — /etc/ffserver.conf).

Пример конфигурации ffserver для потокового вещания:

# Указываем порт, на котором будет работать сервер.
HTTPPort 8090
# Адрес, на котором будет работать сервер (0.0.0.0 — все доступные адреса).
HTTPBindAddress 0.0.0.0
# Максимальная пропускная способность на одного клиента в кб/с (до 100000).
MaxClients 1000 
RTSPPort 5454
RTSPBindAddress 0.0.0.0

<Stream name>
Format rtp
File /root/file.name.mp4
ACL allow 0.0.0.0
#VideoCodec libx264
#VideoSize 1920X1080
</Stream>

Пример команды для запуска потокового вещания:

ffserver ffmpeg  bbb_sunflower_1080p_30fps_normal.mp4 http://ip/feed.ffm

Пример декодирования потокового видео с использованием GPU и декодера NVENC (подключение к трансляции потокового видео и сохранение его на устройство):

ffmpeg -i rtsp://ip:5454/nier -c:v h264_nvenc Output-File.mp4

Пример вывода nvidia-smi подтверждает, что FFmpeg использует GPU: 0 N/A N/A 27564 C ffmpeg 152MiB.

Тестирование

Сравнительное тестирование транскодинга живых потоков FullHD 1080p в high profile H.264 мы провели на потребительских видеокартах, не проходивших специальной подготовки. Работа GeForce RTX 3090 была проверена без снятия ограничений на количество потоков, а также с пропатченным драйвером (для GTX 1080 Ti тест без патча показался нам избыточным). В качестве исходного видео выбрали один из демофайлов Blender — bbb_sunflower_1080p_30fps_normal.mp4

Для тестирования сигнала использовался входной поток со следующими параметрами:

Компрессия видео

H.264

Размер кадра

1920 x 1080 пикселей

Частота кадров

30 кадров/сек

Битрейт видео

2,996 Мбит/сек

Компрессия аудио

AAC

Частота аудиосигнала

48 кГц

Количество аудиоканалов

Стерео

Битрейт аудио

479 кбит/сек

Разрешение FullHD 1080p считается одним из самых распространенных для потокового вещания видео в режиме реального времени и позволяет обеспечить интенсивную вычислительную нагрузку при тестировании.

Описание тестовой среды:

Тест на CPU

GeForce GTX 1080 Ti

GeForce RTX 3090

CPU

4 x VPS Core

4 x VPS Core

1 x Xeon E3-1230v6 3.5GHz (4 cores)

RAM

1 x VPS RAM 16Gb

1 x VPS RAM 16Gb

2 x 16 Gb DDR4

HDD

1 x VPS HDD 240 Gb

1 x VPS HDD 240 Gb

1 x 512Gb SSD

1 x 120Gb SSD

Other hardware

1 x VGPU 1080Ti

1 x VGPU 1080Ti

1 x RTX 3090

Тест на CPU

CPU

4 x VPS Core

RAM

1 x VPS RAM 16Gb

HDD

1 x VPS HDD 240 Gb

Other hardware

1 x VGPU 1080Ti

GeForce GTX 1080 Ti

CPU

4 x VPS Core

RAM

1 x VPS RAM 16Gb

HDD

1 x VPS HDD 240 Gb

Other hardware

1 x VGPU 1080Ti

GeForce RTX 3090

CPU

1 x Xeon E3-1230v6 3.5GHz (4 cores)

RAM

2 x 16 Gb DDR4

HDD

1 x 512Gb SSD

1 x 120Gb SSD

Other hardware

1 x RTX 3090

При тестировании мы получили следующую нагрузку:

Fan

Temp

Perf

Pwr:Usage/Cap

Memory-Usage

GeForce GTX 1080 Ti

59%

82C

P2

86W / 250W

5493MiB/11178MiB

GeForce RTX 3090

43%

51C

P2

149W / 350W

22806MiB /24267MiB

GeForce GTX 1080 Ti

Fan

59%

Temp

82C

Perf

P2

Pwr:Usage/Cap

86W / 250W

Memory-Usage

5493MiB/11178MiB

GeForce RTX 3090

Fan

43%

Temp

51C

Perf

P2

Pwr:Usage/Cap

149W / 350W

Memory-Usage

22806MiB /24267MiB

Тест на CPU без использования GPU прошел успешно, но максимально загрузил сервер: были задействованы все вычислительные ядра и вся доступная память, а на выходе мы получили лишь несколько потоков. Высокая нагрузка на процессор не позволяет эффективно использовать такой способ для организации реальной трансляции из-за риска возникновения критических ошибок и сбоев. CPU не годится для проведения большого количества параллельных операций.

При проведении тестирования GPU на вход декодера подавался один поток, а на выходе транскодированные потоки раздавались через протокол rstp. Отметим, что GeForce RTX 3090 без патча драйвера осилила только три потока. При попытке обработать больше мы получили ошибки:

[h264_nvenc @ 0x55ddbdd3ef80] OpenEncodeSessionEx failed: out of memory (10): (no details)
[h264_nvenc @ 0x55ddbdd3ef80] No capable devices found
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or heightight

Количество потоков после применения патча к видеодрайверу и объем используемой памяти представлены на диаграмме:

Лимит количества обрабатываемой каждой картой потоков ограничен как объемом памяти GPU, так и оперативной памятью. Модификации GeForce RTX 3090 отличаются по объему видеопамяти, но обрабатывают одинаковое количество потоков, что определяется тестовой сборкой — 32 Гб оперативной памяти. Ниже приведен пример вывода данных об оперативной памяти тестового стенда с видеокартой GeForce RTX 3090 при проведении тестирования:

Total

Used

Free

Shared

Buff

Cache available

Mem

31 G

11 G

234 M

1,3 G

19 G

18 G

Swap

4,0 G

1,0 M

4,0 G

Mem

Total

31 G

Used

11 G

Free

234 M

Shared

1,3 G

Buff

19 G

Cache available

18 G

Swap

Total

4,0 G

Used

1,0 M

Free

4,0 G

Заключение

Тестирование на потребительских видеоадаптерах требует грубого вмешательства в системное ПО, но даже оно показывает, что серверы с GPU позволяют организовать транскодирование живых потоков под большими нагрузками. 

То есть FFmpeg вполне можно выбрать для качественной трансляции без покупки коммерческого программного обеспечения и дорогостоящих рабочих станций. Например, как бюджетный вариант для задач видеонаблюдения и сохранения потоков с нескольких десятков камер в файлы: здесь можно взять машину с одной GeForce GTX 1080 Ti и писать с нее потоки на NAS самостоятельно. 

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

Разумеется, вне вашего офиса/площадки или на территории ЦОДа из-за лицензионных правил NVIDIA использовать игровые карты не получится, да и незачем: для этого есть профессиональные линейки. Об экспериментах с ними расскажем в следующей части статьи. 

Кстати, в HOSTKEY можно бесплатно попробовать серверы с RTX A5000 / A4000. 

Комментарии (9)


  1. Videoman
    17.02.2022 00:39

    Спасибо большое за обзор. Есть такой вопрос: с учётом несколько не гуманной стоимости плат NVIDIА, да той же RTX A5000, вы не проводили эксперименты, не получится ли дешевле поставить 4-6 CPU с аппаратным ускорением кодировки H.264, например от Intel, c Quick Sync на борту?


    1. redneko
      17.02.2022 02:49

      Насколько знаю сами CPU и чипсеты к ним (а для Quick Sync важна именна связка целиком) -- только для односокетных конфигураций. И, тут могу ошибаться, но или Intel отказался от поддержки своего MediaSDK под Linux, или всё слишком замудрёно стало с версиями драйверов, судя по мануалу на офсайте ffmpeg. На работе делали как раз переносные мини-кодеры SDI на базе Intel NUC и Decklink Micro, но на базе Windows и самописного ПО - работают отлично, качество картинки тоже вполне себе неплохое.


      1. tbl
        17.02.2022 11:12

        Intel отказались от Media SDK и теперь развивают oneVPL


        1. redneko
          17.02.2022 12:01

          Спасибо, нужно будет попробовать. Года три назад работал с кодерами под Linux, слишком много заморочек было. Ставился свой драйвер, после чего невозможно было без извращений переустановить ядро. Даже Blackmagic, распространяя свои закрытые драйвера, ставил их через DKMS, не ломая ОС. У QuickSync есть преимущество перед кодированием на CPU и GPU в виде более полного соответствия генерируемого битстрима спецификациям DVB. Встретился только один ресивер, который не смог декодировать MPEG-TS от QS - Makito от Hivision, у него явно что-то было с прошивкой. Самый капризный IRD Ericsson RX8200 спокойно воспроизводил, чего нельзя сказать от потоках, кодированных на Nvidia и CPU. Там приходилось очень долго крутить настройки, чтобы на ресивере буфер не опустошался.


      1. Videoman
        17.02.2022 13:25

        … только для односокетных конфигураций
        Я имею в виду поставить несколько юнитов целиком, с материнской платой и CPU с встроенным Quick Sync модулем, даже не обязательно серверного класса.
        MediaSDK под Linux, или всё слишком замудрёно стало с версиями драйверов
        С конфигурации под Linux я на практике не сталкивался, только под Windows. Но даже с учетом лицензии Windows, цена нескольких хостов для кодирования H.264, мне кажется может оказаться дешевле. Отсюда и вопрос.


        1. redneko
          17.02.2022 14:20
          +1

          Если верить словам Элекарда то выходит плюс-минус одинаково

          https://telesputnik.ru/materials/tech/article/quicksync-protiv-nvenc-sravnenie-kodirovaniya-na-gpu/


          1. Videoman
            17.02.2022 14:40

            Спасибо большое за ссылку. Меня конечно больше интересует состояние дел на текущий момент, после безумного роста на видеокарты, а не в 2020 году. Так-то мы раньше вообще использовали гибридные решения, где в сервере было и то и то. Одно время NVIDIA была даже предпочтительнее, так как одно время на серверных Xeon-ах почему-то был заблокирован HD Graphics. Хотелось бы конечно сравнение в текущих ценах (2022 год).


            1. redneko
              17.02.2022 14:58

              Да, с ростом цен на видеокарты из-за этого дефицита творится полное безумие. Хотя, справедливости ради, мы ту же платформу от Supermicro с QS ждали несколько месяцев. Есть даже идеи по переходу на самосбор типа Shuttle DH410 - цены на них в отличие от серверов вменяемые, есть 2 сетевых интерфейса, при желании и Xeon можно воткнуть, хоть и смысла особого нет, видеоядра у Intel одинаковые. И 1U на полку влезет много. Еще нашелся интересный ускоритель, который применяет у себя Amazon - Xilinx Alveo U30. Заявляют что сможет переварить 32 720p стрима (либо 2 HEVC 4k 60p). И всё это при 25W. Всё бы хорошо, но цены нет.


    1. ULP
      17.02.2022 14:14

      Я знаю что многие используют старшие i9/i10 для этих целей, так тоже можно и ffmpeg это поддерживает. Попробовать в планах есть.