среда, 25 февраля 2015 г.

Организация сервера потоковой видео трансляции

И так, появилась нехитрая задача - есть видео поток, который надо отдавать в другой офис, но в исходном состоянии он занимает порядка 30Мбит/с, что довольно объемно, а значит надо его пережать.

Поиск в гугле посоветовал использовать VLC-плеер для этого.
Вариантов исходящего вещания много, как unicast, так и multicast. Я остановился на вещании по HTTP, т.к. иногда надо подключить несколько клиентов, а поднимать multicast-роутинг по всей сети сейчас немного несподручно, хотя идея такая не покидает.
Было написано несколько скриптов:
Базовый
#!/bin/sh
# Script for VLC Streaming by Dmitry Bidzilya @ 2015
# input parametrs
#1st - tunner URL
#2nd - output port
# output stream options
threads="1"
vcodec="h264"
vb="2000"
width="854"
hieght="480"
acodec="mp3"
ab="128"
mux="ts"
venc="x264{profile=baseline,preset=veryfast}"
# example
# vlc  --sout="#transcode{vcodec=mp4v,vb=1500,acodec=mp3,ab=192,channels=2}:standard{access=http{user=user,pwd=pass},mux=ts,dst=":8080/",name=test}" 
vlc --intf dummy --overlay --drop-late-frames --skip-frames --sout-transcode-high-priority --sout-transcode-hurry-up --sout-http-user="$3" --sout-http-pwd="$4"  "$1" --sout="#transcode{threads="$threads",vcodec="$vcodec",vb="$vb",venc="$venc",width="$width",height="$height",acodec="$acodec",ab="$ab",channels=2}:standard{access=http,mux="$mux",dst=":$2",name=test}" 
Как видно из текста скрипта ему передается 4 параметра
1 - ссылка на оригинальную трансляцию
2 - порт, по которому будет доступна пережатая трансляция
3 - логин
4 - пароль
Логин и пароль не обязательны, но служат для минимальной защиты трансляций от несанкционированного доступа
Минусом скрипта было то, что если отключиться от сессии то его работы прекращалась, для этого было написано ещё два скрипта на базе nohup

start.sh
#!/bin/sh
# Script for VLC Streaming by Dmitry Bidzilya @ 2015
# input parametrs
#1st - tunner URL
#2nd - output port
# output stream options
threads="1"
vcodec="h264"
vb="2000"
width="854"
hieght="480"
acodec="mp3"
ab="128"
mux="ts"
venc="x264{profile=baseline,preset=veryfast}"
# example
# vlc  --sout="#transcode{vcodec=mp4v,vb=1500,acodec=mp3,ab=192,channels=2}:standard{access=http{user=user,pwd=pass},mux=ts,dst=":8080/",name=test}" 
nohup vlc --intf dummy --overlay --drop-late-frames --skip-frames --sout-transcode-high-priority --sout-transcode-hurry-up  "$1" --sout="#transcode{threads="$threads",vcodec="$vcodec",vb="$vb",venc="$venc",width="$width",height="$height",acodec="$acodec",ab="$ab",channels=2}:standard{access=http,mux="$mux",dst=":$2",name="$3"}" &
В данном скрипте передается 3 параметра, первые два такие же, а третий это идентификационное имя, оно используется для остановки перекодирования именно данной трансляции

stop.sh
#!/bin/sh
for i in $(ps -eLf | grep "$1" | awk '{print $2}')
do 
        kill -9 $i
done
Ничего сложного и достаточно функционально, параметры исходящего потока можно удобно менять в параметрах обоих скриптов, с данными настройками пережатый поток занимает около 5МБит/с
 


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

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