Ретрансляция потоков
Flussonic Media Server (рестример) может подключиться к другому Flussonic Media Server (источнику), получить список запущенных и доступных по запросу потоков, а затем рестримить их. Вы также получаете прозрачный доступ к архиву на источнике.
Flussonic Media Server позволяет указать несколько серверов-источников и построить отказоустойчивую конфигурацию.
Отличия от HTTP прокси
Многие CDN предлагают решение проблемы доставки видео, используя кластер из обычных HTTP-прокси серверов, которые кешируют сегменты HLS потока и доставляют их до пользователей.
В отличие от простого HTTP прокси, Flussonic Media Server, установленный на все сервера в сети, предоставляет следующие возможности:
- вы получаете не только HLS, но и DASH, RTMP, RTSP, HTTP MPEG-TS, и UDP MPEG-TS;
- единая авторизация пользователей по всем доступным протоколам;
- централизированная агрегация сессий и сбор статистики.
Главное отличие между обычным HTTP прокси и рестримингом на Flussonic Media Server в том, что вы доставляете видео между серверами лишь единожды, а на выходе получаете весь функционал Flussonic Media Server на рестриминг сервере.
Это нереализуемо на HTTP прокси, потому что он не работает с видео на низком уровне.
Конфигурация
Чтобы включить рестриминг в кластере Flussonic Media Server, вам нужно использовать следующие директивы:
source
— чтобы указать сервер, с которого вы хотите рестримить видео.cluster_key
— чтобы Flussonic Media Server мог забрать видео через кластерную авторизацию.
Директива source
имеет следующий синтаксис и опции:
cluster_key abcd;
source streamer:8081 {
}
Вы должны установить одинаковые cluster_key
на источнике и рестримере. Кластерный ключ очень важен и его нужно хранить в секрете, потому что он может быть использован для настройки удаленного сервера. Он не передается в открытом виде, только хэш.
Директива source
включает автоматический захват потоков с сервера источника. В ней потоки можно разделить на несколько списков:
- белый список — эти потоки будут статическими (
static
) на рестримере; - серый список — эти потоки будут доступны на рестримере по запросу (
ondemand
); - черный список — эти потоки не будут видны на рестримере.
По умолчанию все работающие потоки с источника попадают в белый список, а все потоки по запросу с источника будут в сером списке рестримера.
Опция except
помещает потоки в черный список. Эта опция имеет более высокий приоритет, чем only
.
source streamer:8081 {
cluster_key abcd;
except stream1 football;
}
Опция only
разделяет доступные потоки (кроме тех, что в черном списке) на белый и серый списки: only
– в белый список, остальные не будут статическими и будут ждать запроса для запуска.
Если на сервере-рестримере будут локальные или публикуемые потоки с тем же именем, что и на сервере источнике, тогда поток с источника будет игнорироваться и будет использоваться только поток, настроенный локально.
cluster_key abcd;
source streamer:8081 {
only cbc football stream2;
}
С опциями only
и except
можно использовать шаблон поиска по имени потока. Эта возможность упрощает конфигурацию, когда используются live-локации на удаленном сервере, и заранее неизвестны имена потоков. Например, такая конфигурация позволяет захватить все потоки с origin
, имена которых начинаются на mylive/
:
cluster_key abcd;
source streamer:8081 {
only mylive/*;
}
Дополнительные настройки
Вы можете применить настройки сразу для всех потоков, запущенных через source
:
cluster_key abcd;
source streamer:8081 {
on_play http://IP-ADDRESS:PORT/php-auth-script.php;
backup vod/bunny.mp4;
dvr /storage 2d 97%;
}
source test2:8082 {
on_play http://IP-ADDRESS:PORT/php-auth-script.php;
backup vod/bunny.mp4;
dvr /storage 2d 97%;
}
Такая конфигурация автоматически применится для всех потоков, запущенных на рестримере.
Если у вас на основном сервере используется опция backup
, то вам следует загрузить этот файл на рестример и указать путь:
source origin {
backup vod/bunny.mp4;
}
Несколько источников
Можно указать несколько источников на рестримере. Если у нескольких источников будут одинаковые имена потоков, такой поток будет настроен с несколькими URL.
Это значит, что если первый источник упадет или потеряет поток, рестример переключит поток на другой источник.
Когда настроено несколько источников с помощью кластерного захвата, вы получаете действительно высокодоступный кластер.
Протокол M4F
Flussonic Media Server по умолчанию использует для рестриминга свой внутренний сегментный протокол M4F
.
Этот протокол гарантирует следующие возможности:
- потоки между источником и рестримером хорошо синхронизированы;
- одинаковые таймстампы кадров;
- одинаковое тело;
- нет короткого счетчика таймстапов, как в MPEGTS или RTMP: все таймстампы в UTC;
- сохраняет такую же структуру сегментов, делая byte-to-byte копию с источника для всех протоколов на рестримере;
- сохраняет одинаковыми номера сегментов на источнике и рестримере;
- имеет такую же байт-структуру, как формат хранения архива на диске;
- умеет слать пуш-уведомления клиенту о появлении новых данных;
- предоставляет рестримеру информацию об архиве источника.
Таким образом, при передаче по протоколу M4F
точно передаются время и данные. Протокол поддерживает все те кодеки, что и Flussonic.
Наш протокол M4F
имеет ряд преимуществ по сравнению с HLS или RTMP:
- RTMP имеет только миллисекундную точность таймстампов, и он ломает таймстампы;
- RTMP имеет лишь 24 (или 32 бита) таймер миллисекунд, MPEG-TS дает 33 бита для таймера, основанного на 90Khz. Это значит, что сложно синхронизировать время между источником и рестримером;
- RTMP и MPEG-TS не имеют способов синхронизации времени потока и реального времени;
- RTSP имеет механизм синхронизации времени потока и реального времени, но имеет проблемы с доставкой B-кадров и некоторых кодеков;
- У M4F достаточно места, чтобы сохранить реальное время в 90khz, давая абсолютное время каждого кадра с высокой точностью.