IPTV監視

マルチキャストストリームを監視する必要がありました。 既製のソリューションの検索が始まりました。 最初にGoogleで管理したのは、 IPTV-AnalyzerNetUP IPTVProbeです。 各ソリューションには独自の欠陥があるか、多大な費用がかかります。 独自の監視を作成することが決定されました。 主なタスクは、マルチキャストストリームの落下を通知して記録することです。



メカニズム:

ffmpegを使用してNN時間ストリームに接続すると、NN秒からフレームが開始され、画像にアーチファクトがなくなります。 NN秒以内に何かを取得できない場合、撤回エラーでデータベースに書き込みます。 すべてが非常に簡単です。



メインコンポーネントのインストールに進みます。

sudo apt-get install apache2 php5 mysql-server libapache2-mod-php5 libapache2-mod-auth-mysql php5-mysql ffmpeg







apache -Webインターフェース用。

mysql-データベースに、統計に必要なデータとチャネルのリストを保存します。

ffmpeg-マルチキャストストリームからスクリーンショットを取得する必要があります。



主なコンポーネントがインストールされました。始めましょう。



ディレクトリ(デフォルトのapache2 / var / www /)で、データベース接続設定でdbinit.phpファイルを作成します。



 <?php $dbhost = "localhost"; $dbname = "name"; $dbuser = "user"; $dbpass = "password"; mysql_connect($dbhost, $dbuser, $dbpass); mysql_query("set character_set_client='utf8'"); mysql_query("set character_set_results='utf8'"); mysql_query("set collation_connection='utf8_general_ci'"); mysql_select_db($dbname); ?>
      
      







基本構造:

date-TIMESTAMP (チャンネルが落ちた、または上がった日付)

name-TEXT (チャンネル名)

状態-TEXT (状態:真上、偽下)



これは、チャネルがダウンした時間をさらに計算するために必要です。



適切に生成し、実際にチャネルを「監視」するスクリプトを作成します。

gen.phpと呼びましょう



 <?php include "dbinit.php"; $query = "SELECT * FROM `name`"; $result = mysql_query($query); if (!$result) { print "<center>:" . mysql_error() . "</center>"; } elseif (mysql_num_rows($result) == 0) { print ""; } else { $rows = array(); while ($row = mysql_fetch_assoc($result)) { $rows[]= $row; } foreach($rows as $row) { echo exec('/usr/bin/timeout 20s /usr/bin/time -f %U -o /var/www/tmp/'.$row['name'].'.txt /usr/bin/ffmpeg -i udp://@'.$row['mcast'].' -y -f image2 -sameq -t 0.001 -ss 00:00:4 -s 120*80 /var/www/screen/'.$row['mcast'].'.jpg'); echo exec('/bin/cp -f /var/www/tmp/'.$row['mcast'].'.txt /var/www/rez/'); } ?>
      
      





スクリプト行についてさらに詳しく考えてみましょう。

スクリプトを実行するには、実行タイムアウト(タイムアウト20秒)を設定します。チャネルが利用できない場合、非常に長い時間ハングします。

スクリーンショットを撮る時間がファイルに書き込まれます:
  /usr/bin/time -f %U -o /var/www/tmp/'.$row['name'].'.txt
      
      





スクリーンショット

 /usr/bin/ffmpeg -i udp://@'.$row['name'].' -y -f image2 -sameq -t 0.001 -ss 00:00:4 -s 120*80 /var/www/screen/'.$row['name'].'.jpg
      
      







結果を取得してデータベースに追加する:

rez.phpファイルを作成します



 <?php $lines = file ('rez/'.$row['mcast'].'.txt'); if ($lines[0]=='') { $last_result=mysql_result(mysql_query("select state from name where name='".$row['name']."' order by date desc limit 0,1"),0); if($last_result=='true') { $query = "INSERT INTO `name` (`date`, `name`, `state`) VALUES ('{$date}', '{$row['name']}', 'false');"; mysql_query($query) or die(mysql_error()); } foreach ($A as $v) { echo exec('/usr/bin/perl /usr/local/scripts/jabber_alert.pl -e '.$v.'@jabber.server -n tv@jabber.server -w password -y '.translitIt ($row['name']).'-'.$row['mcast'].' << "EOF" read -d "^D" input'); } } else { $last_result=mysql_result(mysql_query("select state from name where name='".$row['name']."' order by date desc limit 0,1"),0); echo $last_result; if($last_result=='false') { $query = "INSERT INTO `name` (`date`, `name`, `state`) VALUES ('{$date}', '{$row['name']}', 'true');"; mysql_query($query) or die(mysql_error()); } echo $row['name']." ". $lines[1]." "; } ?>
      
      





スクリーンショットが正常に取得された場合、実行時間がファイルに書き込まれ、ファイルが失敗した場合は空になります。 スクリプトでは、ファイルの内容を確認します。



落ちたチャンネルについてジャバーで送ります

 echo exec('/usr/bin/perl /usr/local/scripts/jabber_alert.pl -e '.$v.'@jabber.server -n tv@jabber.server -w password -y '.translitIt ($row['name']).'-'.$row['mcast'].' << "EOF" read -d "^D" input');
      
      





jabber_alert.pl



index.phpを作成します



 <?php foreach($rows as $row) { $work=mysql_result(mysql_query("select date from name where date>'".$row['date']." order by date limit 0,1'"),0); $date1 = new DateTime($work); $date2 = new DateTime($row['date']); $interval = $date2->diff($date1); if($work=="") { $style="red"; } else { $style="";} echo "<tr><td style='color:".$style."'><font color='red'>".$row['date']; if($work!="") { echo "</font> - <font color='green'>".$work."</font>"; } echo "</td><td>"; if($interval->format("%h") != 0) { echo $interval->format("%h. "); } echo $interval->format("%i. %s.")."</td><td style='color:".$style."'>".$row['name']."</td></tr>"; } ?>
      
      





落ちた/盛り上がったチャンネルを表示し、色を付けます。



2つのスクリプトの実行をクラウンに追加します。

ソリューションはそれほどエレガントではありませんが、機能し、タスクを実行します。



終了すると、これを取得できます。










All Articles