2014-05-23

Мультикаст рестрим на коленке

Появилась задача - обеспечить каждому сотруднику возможность посмотреть проходящую видеоконференцию. Так как количество сотрудников однозначно превышало количество лицензий Codian на подключение - пришлось собрать на коленке рестримилку.

Рестрим

В качестве софта был взят vlc под linux, экспериментальным путем запущенный вот с такими параметрами:

vlc -vvv rtsp://codian_server/conf_h264_g711u_256000__Supaconf \
 --sout "#transcode{\
threads=6,\
vcodec=h264,\
vb=1024,\
scale=0,\
acodec=mp4a,\
ab=64,\
channels=2,\
samplerate=44100,\
venc=x264{preset=ultrafast,aud,profile=baseline,level=30,keyint=30,ref=1}\
}:http{mux=flv,dst=:8080/stream}" --sout-keep

Данный вариант запускает на рестрим, доступный по адресу: http://рестримилка:8080/stream. Стрим вещается с кодеками h264/aac в контейнере flv и понимается онлайн-плеером Video.js (http://www.videojs.com/), который можно поставить прямо на рестримящий сервер. Для воспроизведения потребуется IE не менее 9го или любой другой современный браузер. Ну или можно использовать тот же самый VLC на клиентских компах, а лучше - портабельный (полностью распакованный) vlc на сетевой шаре с ярлыком, в котором прописан путь к рестриму.

Такой вариант рестримилки в моем случае при шести ядрах тянул  300 подключений не напрягаясь - загрузка процессора не превышала 20%. Однако трафик, поэтому...

Балансировка нагрузки

Еще более наколеночное и тупое решение - поднять пару серверов, которые будут захватывать стрим с основного рестримящего сервера и отдавать его без перекодировки. 

!#/bin/sh
while true; do 
/usr/bin/vlc --play-and-exit  \
-vvv http://restream-root-server:8080/stream \
--sout "#standard{access=http,mux=flv,dst=:8080/stream}" 
sleep 2
done

Этот скрипт будет пытаться достучаться до рестримящего сервера и подхватить поток. Когда поток подхватится - vlc начнет его рестрим (тот же адрес - :8080/stream) В случае прерывания потока vlc схлопнется и продолжатся попытки нащупать поток.

Подняв 2 или сколько потребуется серверов, добавляем все их в DNS с одним именем, получив примитивную Round Robin балансировку. Также для каждой такой DNS-записи следует указать небольшое время кэширования на клиентах - TTL (в Windows для этого нужно включить Advanced-режим отображения: View - Advanced).

После этого настраиваем клиентский плеер на адрес http://общий_адрес:8080/stream 

Комментариев нет:

Отправить комментарий