VLCを介した安定したIPTVブロードキャスト

私が働いていたインターネットサービスプロバイダーの会社でIPTV放送を組織することに決めたとき、私はIPTVをよりよく知る必要がありました。 ブロードキャストは、Linuxとvlcプログラムで行われていることが判明しました。 プレートとSkyStar2 DVBカードがインストールされましたが、これはLinuxで問題なく動作するはずです。 そのため、ubuntuサーバーがインストールされたすべての新しいマシンでそうでした。 Debianは、カーネルの更新後にのみ機能しました。 セットアップは比較的簡単でした。その時点ですでにこのトピックに関するいくつかの記事があり、vlcのドキュメントも非常に役に立ちました。 ローンチ後、チャンネルの音声とビデオの損失に関するいくつかの問題、および以下で説明するその他の問題が始まりました。 登場後、これらの問題を修正するスクリプトが作成されました。 現在、合計5つのdvbカードで3つのサーバーを実行し、3つの衛星から23のチャンネルがブロードキャストされています。 カットの下には、LinuxでVLCを介してIPTVブロードキャストを開始した後に表示される可能性のある問題とその対処方法のリストがあります。 私たちはbashと戦います。





IPTV放送の初期設定と起動については、記事「Linuxで衛星テレビチャンネルを受信する」で詳しく説明されています。

IPTV放送の主な問題:チャンネルの1つでのメモリリークとビデオまたは音声の損失。



メモリリーク



メモリリークの問題は、1)1日1回以上、必要に応じてcrontabを介してvlcデーモンを再起動するか、2)空きメモリを定期的に確認し、サマリーメモリが特定の値に減少したときにデーモンを再起動することで解決できます。



1)

crontab:

#午前3時にvlcを再起動します

0 3 * * * /home/desecho/vlc/vlc_regular_reload.sh



vlc_regular_reload.sh:

#!/bin/bash <br/> echo "`date`;VLC regular reload" >> /home/desecho/vlc/logs/vlc_restart.log<br/>/home/desecho/vlc/vlc_starter.sh<br/>







2)

crontab:

#5分ごとに確認

* / 5 * * * * /home/desecho/vlc/memory_check.sh



memory_check.sh:

#!/bin/bash <br/> # <br/>free_mem=$(free -m | grep ^M | awk -F ' ' '{print $4 }' )<br/> # <br/>mem_limit= 16 <br/> # <br/> if [ $free_mem -le $mem_limit ]<br/> then <br/> echo "`date`;Memory Overload" >> /home/desecho/vlc/logs/vlc_restart.log<br/> /home/desecho/vlc/vlc_starter.sh<br/> fi <br/>







ビデオまたはオーディオの損失



この問題を解決するには、チャンネル内のビデオとサウンドの存在を定期的に確認する必要があります。

2つのチャンネルをブロードキャストする例のスクリプトの実装。 ブロードキャストは、オリジナルと圧縮の2つのストリームで行われます。 問題のあるチャネルを再起動することが役立つ場合もありますが、デーモンを完全に再起動する必要がある場合もあります。



スクリプトを機能させるには、次のコマンドを実行します。



cp /usr/bin/vlc /usr/bin/vlc2<br/> touch /home/desecho/vlc/run.sh<br/> chmod +x /home/desecho/vlc/run.sh<br/>







チャネルを開始してリロードするスクリプト:

vlc_starter.sh:

#!/bin/bash <br/> echo "`date`;Reloaded" >> /home/desecho/vlc/logs/vlc_restart.log<br/> <br/> # vlc <br/> killall - 9 vlc<br/> # <br/>vlc --no-stats -vvv --color --daemon --ttl 12 --ts-es-id-pid --dvb-adapter 0 --programs= 13 , 14 dvb: --dvb-frequency= 10995000 --dvb-srate= 20000000 --dvb-voltage= 13 --sout '#duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8001},select="program=13",dst=std{access=http,mux=asf,url=0.0.0.0:8002},select="program=14"}' <br/> # <br/> sleep 5 <br/> # 820Kbit/s 70Kbit/s <br/>vlc http: //127.0.0.1:8001 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8011}' <br/>vlc http: //127.0.0.1:8002 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:8012}' <br/>







チャンネルチェックスクリプト:

vlc_restarter.sh:



#!/bin/bash <br/> <br/> # <br/> #$1 - id <br/> function rec {<br/> # <br/> b= "vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --noaudio --sout '#duplicate{dst=std{access=file,mux=asf,dst=\"/home/desecho/vlc/0$1.avi\"}}'" <br/> # - - vlc <br/> echo $b > /home/desecho/vlc/run.sh<br/> /home/desecho/vlc/run.sh<br/> # <br/> b= "vlc2 http://127.0.0.1:80$1 -vvv --color --daemon --novideo --sout '#duplicate{dst=std{access=file,mux=asf,dst=\"/home/desecho/vlc/0$1.mp3\"}}'" <br/> echo $b > /home/desecho/vlc/run.sh<br/> /home/desecho/vlc/run.sh<br/> sleep 5 <br/> killall - 9 vlc2<br/>}<br/> <br/> # vlc <br/> #$1 - <br/> function reload {<br/> echo "`date`;$1 - Reload" >> /home/desecho/vlc/logs/vlc_restart.log<br/> /home/desecho/vlc/vlc_starter.sh<br/>}<br/> <br/> # <br/> #$1 - id <br/> #$2 - <br/> function check {<br/> # <br/> y= "$(du /home/desecho/vlc/0$1.avi | grep -oE --regexp='[0-9]+' | sed -n '1p')" <br/> # <br/> if [ $y -gt 10 ] ; then <br/> x011=1<br/> else <br/> x011=0<br/> fi <br/> # <br/> y= "$(du /home/desecho/vlc/0$1.mp3 | grep -oE --regexp='[0-9]+' | sed -n '1p')" <br/> if [ $y -gt 10 ] ; then <br/> x012=1<br/> else <br/> x012=0<br/> fi <br/> echo " $2 - $x011 $x012" >> /home/desecho/vlc/logs/vlc_restart.log<br/> let x01=x011+x012<br/> # , z=0 <br/> if [ $x01 != 2 ]<br/> then <br/> z=0<br/> else <br/> z=1<br/> fi <br/>}<br/> <br/> # <br/> #$1 - id <br/> #$2 - <br/> function check_full {<br/> # <br/> rec $1 <br/> # <br/> check $1 $2 <br/> # z <br/> if [ $z = 1 ] ; then <br/> z[ $1 ]= 1 <br/> fi <br/>}<br/> <br/> # <br/> #$1 - id <br/> #$2 - <br/> #$3 - id <br/> function restart {<br/> echo "`date`;$2 - Restart" >> /home/desecho/vlc/logs/vlc_restart.log<br/> # <br/> a= "$(ps -C vlc -o '%p%a' | grep " http: //127.0.0.1:80$3 -vvv --daemon --color --sout" | grep -oE --regexp='[0-9]+' | sed -n '1p')" <br/> kill $a <br/> # <br/> b= "vlc http://127.0.0.1:80$3 -vvv --daemon --color --sout '#transcode{vcodec=mp4v,vb=820,scale=1,acodec=mpga,ab=70,channels=1}:duplicate{dst=std{access=http,mux=asf,url=0.0.0.0:80$1}'" <br/> echo $b > /home/desecho/vlc/run.sh<br/> /home/desecho/vlc/run.sh<br/>}<br/> <br/> # <br/> #$1 - id <br/> #$2 - <br/> #$3 - id <br/> function fix {<br/> # <br/> if [ ${z[ $1 ]} != 1 ] ; then <br/> restart $1 $2 $3 <br/> sleep 5 <br/> # <br/> check_full $1 $2 <br/> fi <br/> # VLC <br/> if [ ${z[ $1 ]} != 1 ] ; then <br/> reload $2 <br/> exit <br/> fi <br/>}<br/> # 0 z <br/>z[ 11 ]=0<br/>z[ 12 ]=0<br/> <br/> # / <br/>check_full 11 perviy<br/> # / <br/>fix 11 perviy 01 <br/> <br/>check_full 12 rossiya<br/>fix 12 rossiya 02 <br/> <br/> echo "`date`;DVB - Status: Stable" >> /home/desecho/vlc/logs/vlc_restart.log<br/>







crontabにエントリを追加します:

* / 5 * * * * /home/desecho/vlc/vlc_restarter.sh



その結果、ビデオまたはオーディオが消えたときに放送チャンネルを自動的に復元するシステムが得られます。 ブロードキャスト復元スクリプトのすべてのアクションはログファイルに書き込まれます。

良い放送を!



UPD: IPTVブログに移動しました。 PSカルマをありがとう!

UPD2:メモリリークを中和するには、「optimizememory」フラグなしでvlcをビルドするか、vlcを更新してください。記事「VLCマルチキャストを使用したビデオファイルのブロードキャスト」を参照してください 理論とともに" おかげでブレーカー



All Articles