Какова альтернатива?
Патч для драйвера и сборка FFmpeg
Настройка трансляции/a>
Тестирование
Заключение
При работе с потоковым видео качество и скорость воспроизведения играют ключевую роль. Можно ли настроить многопоточную трансляцию без покупки дорогостоящего «железа»? Попробуем разобраться.
Проблема.
Качественная трансляция видео обычно предполагает серьезные издержки: нужно выделить помещение и создать в нем инженерную инфраструктуру, закупить оборудование и нанять сотрудников для его обслуживания, арендовать каналы передачи данных и провести другие необходимые мероприятия. В зависимости от масштаба проекта только капитальные вложения могут потребовать значительных бюджетов.
Какова альтернатива?
Существенно снизить капитальные затраты и перевести их в операционные можно за счет аренды облачных серверов с GPU, причем стоит сделать ставку на аппаратное транскодирование на Nvidia NVENC 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 кбит/сек |
Компрессия видео | 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 1080Ti | |
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 1080Ti | |
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 height
Количество потоков после применения патча к видеодрайверу и объем используемой памяти представлены на диаграмме:
Лимит количества обрабатываемой каждой картой потоков ограничен как объемом памяти 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 | 5493MiB/11178MiB |
Cache available | 18 G |
Swap | |
Total | 31 G |
Used | 11 G |
Free | 234 M |
Shared | |
Buff | |
Cache available |
Заключение
Тестирование на потребительских видеоадаптерах требует грубого вмешательства в системное ПО, но даже оно показывает, что серверы с GPU позволяют организовать транскодирование живых потоков под большими нагрузками.
То есть FFmpeg вполне можно выбрать для качественной трансляции без покупки коммерческого программного обеспечения и дорогостоящих рабочих станций. Например, как бюджетный вариант для задач видеонаблюдения и сохранения потоков с нескольких десятков камер в файлы: здесь можно взять машину с одной GTX 1080 Ti и писать с нее потоки на NAS самостоятельно.
Решение также обеспечивает масштабирование трансляции, так как не требует значительных затрат времени и вычислительных мощностей для изменения количества потоков.
Разумеется, вне вашего офиса/площадки или на территории ЦОДа из-за лицензионных правил NVidia использовать игровые карты не получится, да и незачем: для этого есть профессиональные линейки. Об экспериментах с ними расскажем в следующей части статьи.