Flash Media Server: онлайн трансляции и ffmpeg

This post is also available in: Английский

live video
Flash Media Server предоставляет отличные возможности по созданию онлайн видео сервисов. Одним из наиболее популярных видео сервисов в Интернете является сервис онлайн видео трансляций (live video). В качестве источника сигналов часто использую Flash Media Live Encoder — отличный бесплатный программный энкодер, обладающий некоторыми ограничениями. В этой статье мы рассмотрим процесс организации онлайн трансляций при помощи продуктов Flash Platform и преодоление ограничения FMLE в 3 битрейта на видео канал.

Прежде всего рассмотрим типовую схему организации онлайн трансляций. Она состоит из устройства захвата видео сигнала, Flash Media Live Encoder’а, Flash Media Server’а и Flash видео плеера. Использование Flash Media Server’а как центрального звена обработки и распределения видео потоков позволяет создавать уникальные сервисы, где тесно связана бизнес логика и мультимедийный контент. Кроме того, в новом релизе должен появиться стриминг на iOS устройства (поддержка Apple HTTP Live Streaming).
Live Video broadcasts architecture

Устройство захвата видео сигнала
В качестве устройств захвата видео сигнала чаще всего используют весьма бюджетные PCI Express видео карты (например, BlackMagic DeckLink SDI) или АЦП Canopus ADVC 110 (подключается через FireWire адаптер). Настраивая такую схему стоит предусмотреть как можно большую мощность процессоров в сервере, выполняющем роль энкодера. По нашему опыту восьмиядерного сервера (2 Quad Core CPU) достаточно для энкодинга трех каналов в H.264 с суммарным битрейтом 7.5 Мбит. При создании промышленных решений чаще всего используются аппаратные энкодеры или транскодеры (Digital Rapids, Harmonic и др.). В этом случае важно обратить внимание на мелкие, но очень полезные фишечки: Absolute Time Code (ATC), MultiPoint Publishing, резервирование, восстановление потока при разрыве связи.

Flash Media Live Encoder
Бесплатный H.264 энкодер для онлайн потоков. Он подключается к устройству захвата видео сигнала и генерирует от 1го до 3х RTMP потоков (динамический битрейт) для возможности плавного переключения. Трех битрейтов при доставке на разнообразные устройства в современных проектах как правило не достаточно. Мобильные телефоны, смартфоны, планшетники, персональные компьютеры, телевизоры и STB — у них очень сильно отличаются экраны и параметры подключения к Интернет. В идеале требуется порядка 10 битрейтов для покрытия всех устройств. Преодолеть это ограничение можно при помощи онлайн транскодирования ffmpeg’ом, который размножит один поток на необходимое количество битрейтов. Как это сделать подробно описано далее.

Flash Media Server
Вся прелесть Flash Media Server в том, что его использование требует минимум усилий со стороны системного администратора. Простой инсталлятор после которого в большинстве случаев не требуется даже правка конфигурационных файлов. Впрочем это не наш путь. Наша задача получить максимум возможностей и здесь Flash Media Server также на высоте. Если для вас очень важно сэкономить на медиа сервере, то вы можете использовать Amazon версию Flash Media Server’а.
Для онлайн трансляций Flash Media Server позволяет организовать доставку видео каналов при помощи RTMP/RTMPE (Flash), HTTP DS (Flash), HTTP LS (iOS) форматов стриминга. Преимущество HTTP протоколов в большей стабильности при плохом Интернете у пользователей, возможности закешировать контент во время ожидания на паузе. Преимущество RTMP во встроенной в Flash Player интерактивности на базе RTMP протокола для передачи метаданных, объектов и вызов удаленных процедур.
Основная задача Flash Media Server’а — это высокопроизводительная отдача контента пользователям в разнообразных форматах и реализация дополнительных сервисов защиты контента (DRM на базе Flash Access), DVR (перемотка видео потока, установка на паузу) и других.

Видео плеер
В зависимости от платформы это может быть любой видео плеер: HTML5, Flash, Android, iOS… В своей работе мы стараемся создавать видео плееры на базе всех технологий, хотя в большинстве случаев для достижения результата хватает компиляции Flash плеера под конкретную платформу. Конечно не стоит забывать о модификации функций управления для разных платформ.

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

Сборка ffmpeg с поддержкой h264. Транскодинг Live потока с FMS и обратная публикация нескольких потоков.

1. Для сборки понадобятся следующие пакеты:

1
yum install git make gcc gcc-c++ pkgconfig yasm

2. Сборка librtmp

1
2
3
4
git clone git://git.ffmpeg.org/rtmpdump
cd rtmpdump/librtmp
make
make install

3. Сборка libfaac & libmp3lame

a) libfaac
Идем http://www.audiocoding.com/downloads.html и качаем faac-1.28.tar.gz

1
2
3
4
5
tar zxvf faac-1.28.tar.gz
cd faac-1.28
./configure
make
make install

б) libmp3lame
Идем http://lame.sourceforge.net/download.php и качаем lame-3.98.4.tar.gz

1
2
3
4
5
tar zxvf lame-3.98.4.tar.gz
cd lame-3.98.4
./configure
make
make install

4. Сборка libx264

1
2
3
4
5
git clone git://git.videolan.org/x264
cd x264
./configure --enable-shared
make
make install

5. Сборка ffmpeg с h264

1
2
3
4
5
6
7
git clone git://git.videolan.org/ffmpeg.git
cd ffmpeg
export PKG_CONFIG_PATH=../rtmpdump/librtmp/
./configure --enable-debug=3 --enable-librtmp --enable-libmp3lame --enable-libfaac --enable-nonfree \
--enable-version3 --enable-gpl --enable-libx264 --enable-libfaac
make -j4
make install

Для проверки можно либо опубликовать поток через Flash Media Live Encoder (FMLE) на Flash Media Server (FMS) в базовое live приложение,
либо можно сделать SSAS приложение, которое будет генерировать онлайн видео поток из локального файла.

Далее нужно запустить ffmpeg, чтобы он брал видео поток с максимальным битрейтом и в реальном времени генерировал из него несколько потоков более низкого качества. В случае запуска ffmpeg на том же сервере, что и FMS это можно сделать следующим образом:

1
2
3
4
5
ffmpeg -threads 15 -i "rtmp://localhost/live_channel/maxlive live=1" \
  -re -acodec libfaac -ar 22050 -vcodec libx264 -s svga -b 500k -f flv "rtmp://localhost/live/test_500" \
  -re -acodec libfaac -ar 22050 -vcodec libx264 -s vga -b 300k -f flv "rtmp://localhost/live/test_300" \
  -re -acodec libfaac -ar 22050 -vcodec libx264 -s qvga -b 150k -f flv "rtmp://localhost/live/test_150" \
  -re -acodec libfaac -ar 22050 -vcodec libx264 -s qqvga -b 50k -f flv "rtmp://localhost/live/test_50"

Здесь в качестве источника берется live поток maxlive у приложения live_channel с локального FMS.
На локальный же FMS обратно публикуются уже 4 перекодированных потока c разным битрейтом и размером кадра.

Для тестирования этих потоков можно разместить где-то f4m файл с таким, например, содержанием:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns="http://ns.adobe.com/f4m/1.0">
<id>Dynamic Streaming</id>
<streamType>live</streamType>
<media url="rtmp://FMS_IP/live2/test_50" bitrate="50" width="160" height="120" />
<media url="rtmp://FMS_IP/live2/test_150" bitrate="150" width="320" height="240" />
<media url="rtmp://FMS_IP/live2/test_300" bitrate="300" width="640" height="480" />
<media url="rtmp://FMS_IP/live2/test_500" bitrate="500" width="800" height="600" />
</manifest>

Размещенный F4M файл можно воспроизвести при помощи видео плеера на базе OSMF, например, StrobeMediaPlayback.

Полезные ссылки:
1. Настройка librtmp
2. Настройка ffmpeg