При работе с потоковым видео качество и скорость воспроизведения играют ключевую роль. Можно ли настроить многопоточную трансляцию без покупки дорогостоящего «железа»? Попробуем разобраться.
Проблема. Качественная трансляция видео обычно предполагает серьезные издержки: нужно выделить помещение и создать в нем инженерную инфраструктуру, закупить оборудование и нанять сотрудников для его обслуживания, арендовать каналы передачи данных и провести другие необходимые мероприятия. В зависимости от масштаба проекта только капитальные вложения могут потребовать значительных бюджетов.
Какова альтернатива?
Существенно снизить капитальные затраты и перевести их в операционные можно за счет аренды облачных серверов с 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.
Videoman
Спасибо большое за обзор. Есть такой вопрос: с учётом несколько не гуманной стоимости плат NVIDIА, да той же RTX A5000, вы не проводили эксперименты, не получится ли дешевле поставить 4-6 CPU с аппаратным ускорением кодировки H.264, например от Intel, c Quick Sync на борту?
redneko
Насколько знаю сами CPU и чипсеты к ним (а для Quick Sync важна именна связка целиком) -- только для односокетных конфигураций. И, тут могу ошибаться, но или Intel отказался от поддержки своего MediaSDK под Linux, или всё слишком замудрёно стало с версиями драйверов, судя по мануалу на офсайте ffmpeg. На работе делали как раз переносные мини-кодеры SDI на базе Intel NUC и Decklink Micro, но на базе Windows и самописного ПО - работают отлично, качество картинки тоже вполне себе неплохое.
tbl
Intel отказались от Media SDK и теперь развивают oneVPL
redneko
Спасибо, нужно будет попробовать. Года три назад работал с кодерами под Linux, слишком много заморочек было. Ставился свой драйвер, после чего невозможно было без извращений переустановить ядро. Даже Blackmagic, распространяя свои закрытые драйвера, ставил их через DKMS, не ломая ОС. У QuickSync есть преимущество перед кодированием на CPU и GPU в виде более полного соответствия генерируемого битстрима спецификациям DVB. Встретился только один ресивер, который не смог декодировать MPEG-TS от QS - Makito от Hivision, у него явно что-то было с прошивкой. Самый капризный IRD Ericsson RX8200 спокойно воспроизводил, чего нельзя сказать от потоках, кодированных на Nvidia и CPU. Там приходилось очень долго крутить настройки, чтобы на ресивере буфер не опустошался.
Videoman
redneko
Если верить словам Элекарда то выходит плюс-минус одинаково
https://telesputnik.ru/materials/tech/article/quicksync-protiv-nvenc-sravnenie-kodirovaniya-na-gpu/
Videoman
Спасибо большое за ссылку. Меня конечно больше интересует состояние дел на текущий момент, после безумного роста на видеокарты, а не в 2020 году. Так-то мы раньше вообще использовали гибридные решения, где в сервере было и то и то. Одно время NVIDIA была даже предпочтительнее, так как одно время на серверных Xeon-ах почему-то был заблокирован HD Graphics. Хотелось бы конечно сравнение в текущих ценах (2022 год).
redneko
Да, с ростом цен на видеокарты из-за этого дефицита творится полное безумие. Хотя, справедливости ради, мы ту же платформу от Supermicro с QS ждали несколько месяцев. Есть даже идеи по переходу на самосбор типа Shuttle DH410 - цены на них в отличие от серверов вменяемые, есть 2 сетевых интерфейса, при желании и Xeon можно воткнуть, хоть и смысла особого нет, видеоядра у Intel одинаковые. И 1U на полку влезет много. Еще нашелся интересный ускоритель, который применяет у себя Amazon - Xilinx Alveo U30. Заявляют что сможет переварить 32 720p стрима (либо 2 HEVC 4k 60p). И всё это при 25W. Всё бы хорошо, но цены нет.
ULP
Я знаю что многие используют старшие i9/i10 для этих целей, так тоже можно и ffmpeg это поддерживает. Попробовать в планах есть.