最小限のトラフィックで衛星経由でIPカメラからの画像をブロードキャストするビデオウォールを作成します

この記事では、ffmpeg、wget、JS、html など、およびそのような母親を使用して「ほぼビデオ放送」を提供する方法について説明しています。 実際、正確な出力とWebページでの動的更新を備えたスライドショーを作成します。 おそらく誰かが私の経験から恩恵を受けるでしょう。

知識のある人はこの記事で自分自身にとって新しいものを見つけることはできませんが、私がそれを読んだ場合、このスキームの改善に関するコメントを聞きたいと思います。



はじめにと背景


私は、その性質上、タイガに約10の支店がある会社のシステム管理者(ネットワークサポートスペシャリスト)として働いています。 最も幸福な支店を除くすべての支店のインターネットは、衛星経由で提供されています。 衛星インターネットは、これが外の世界と通信する唯一の方法である場合(ジョークを除き、通信を行う最寄りの村は通常70キロメートル離れています)、非常に不安定で高価なものであることが判明しました。



とりわけ、メール、一口電話など、当社のインターネットはビデオ監視に費やされています。 総局は、支部での作業を非常に喜んで監督します。 しかし、トラフィックはほとんどありません。 1日あたりFAP.4000 + .AST 2Gbの最大レートで、3台の2メガピクセルのカメラではばかげています。 原則として、カメラからの画像はカットできます(これを行います)が、内部の交通制限なしでカメラを表示することで、ポイントを簡単に「ハード制限」に変えることができます(毎日の交通制限に達したとき)。 1日あたり128kbit / sのストリームを持つ1台のカメラは1350MBを消費します。



私は、当社のすべてのカメラからの画像が表示されるディレクター向けの一種の「ビデオウォール」を作成することを任されました。 衛星インターネットの厳格な制限の下では、カメラからストリームを直接受信するという話はありません。 Macroscopのソフトウェアタイプソフトウェアは、カメラからのストリームのオンザフライでのトランスコードをサポートしていません。 正直なところ、Macroscopはクライアントからカメラから受信するよりもストリームを太くしているように思えます。 VLC(不安定、定期的にブラウザープラグインがクラッシュするか、ストリームを自発的に一時停止し、トランスコーディング中に多くのリソースを消費する)、ffmpeg + ffserver(したがって、このリンクを開始しませんでした)を試しました。 その結果、カメラからのストリームからスクリーンショットをキャプチャし、指定された頻度で中央オフィスに送信するというアイデアを思いつきました。 すべてが判明しましたが、不器用でコンドミニアムが判明しました。 私はオークと言います。 しかし、それは機能します。 私は将来終了します。



技術部


私たちが持っているカメラは主にBewardです。 Hikvisionがいくつかあります。 すべてのカメラ(理論上ですが、後で練習する場合)はRTSPをサポートします。 理想的な条件では、それを使用します。 最終的な画像は常にffmpegで表示されます。これらのパラメータを使用して画像サイズとjpg品質を調整し、1日あたりのトラフィック量を制御できます。 また、中央サーバーからフレームを要求する頻度は、トラフィックの量に影響します。



次は、JavaScriptといくつかのHTML(および少しのphp)です。 インターネット上で、ページ上の画像を動的に更新するJSのスクリプトを見つけましたが、それはダウンロードしてOnLoadイベントをキャッチした後でのみです。 このケース用のページが用意され、そこにパラメーター(カメラ名、管理パネルのアドレス、スクリーンショットへのリンク)を渡します。

カメラの個人ページ
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <script type="text/javascript"> var speed = 2; function cam_show() { var imac = document.getElementById('camimage'); var time = now(); imac.onload = function() { start_show(imac, now()-time); document.getElementById('speed').innerHTML = ((now()-time)*(speed+5))/1000; }; imac.src = "<?php echo ($_GET['urlpic']) ?>?r=" + Math.random(); } function now(){ return (new Date).getTime(); } function start_show(img, time) { setTimeout(function() { var ctime = now(); img.onload = function() { start_show(img, now()-ctime) document.getElementById('speed').innerHTML = ((now()-ctime)*(speed+5))/1000; }; img.src = "<?php echo ($_GET['urlpic']) ?>?r=" + Math.random(); }, time*(speed+5)); } </script> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta http-equiv="imagetoolbar" content="no"> </head> <?php error_reporting(E_ALL); ?> <body onload="cam_show()"> <center><?php echo "<a class='store' href=\"./cam-get.php?picwidth=60%&urladmin={$_GET['urladmin']}&urlpic={$_GET['urlpic']}&textpage={$_GET['textpage']}\" target=_blank alt=test>{$_GET['textpage']}</a>";?></center> <div align="center"> <img width=<?php echo "{$_GET['picwidth']}";?> id="camimage" src="" alt=""> </div> <center> <?php echo "<div id=\"div1\" style=\"display:{$_GET['visibletxt']}\">" ?> <?php echo "<a class='store' href=\"{$_GET['urladmin']}\" target=_blank>[]</a>";?> <?php echo "<a class='store' href=\"{$_GET['urlpic']}\" target=_blank>[ ]</a>";?> </div> </center> </body> </html>
      
      









どのようにすべてが接続されていますか


サーバーのブランチ(個別の仮想マシンの場合、win 2008 r2またはwin 7)に、次のソフトウェアがインストールされます。







nnCronはタスクを実行します(Windowsタスクスケジューラよりもはるかに安定しています)。これらは通常の.batで、ffmpegは何をどこで取得し、どのようにどこに配置するかを示します。 カメラがRTSPで問題を抱えている場合、ftpでダンスを開始し、最後のスクリーンショットを取得して不要なアドレスを変更します。Bevardカメラはアドレスddmmyyy \ camera_name \ 1 \ *にスクリーンショットを配置するためです。 もちろん不名誉ですが、どこに行くべきでしょうか?



FTPサーバーに個別に保存するカメラからのスクリーンショットを処理するためのWindows .bat
 set day=%DATE:~0,2% set month=%DATE:~3,2% set year=%DATE:~6,4% set YYYYMMDD=%year%-%month%-%day% FOR /L %%i IN (0,1,4) DO ( cd "C:\ftp\kpp\%YYYYMMDD%\kpp\1\" c: for /f %%i in ('dir /b /T:A /A:-D /O:-D *.jpg') do (copy /Y "%%i" "c:\ftp\copy\andat-kpp.jpg") C:\ffmpeg\bin\ffmpeg.exe -i "c:\ftp\copy\andat-kpp.jpg" -f image2 -vframes 1 -y -q:v 15 -s 480x360 C:\Apache24\htdocs\andat-kpp.jpg del /Q "C:\ftp\kpp\%YYYYMMDD%\kpp\1\*.jpg" timeout /t 5 /nobreak ) exit
      
      







ffmpegは、Webサーバーのルートフォルダーに目的のサイズと品質の画像を配置します。 次に、サーバーはセントラルオフィスで動作を開始します。セントラルオフィスでは、これらすべてが保存され、ビデオウォールがあるメインページにスリップされます。



ブランチからスクリーンショットを取得し、古いスクリーンショットをアーカイブに保存するスクリプト
 #!/bin/sh cd /var/www/ mkdir /var/www/archieve/ mkdir /var/www/archieve/tuhterek mkdir /var/www/archieve/tuhterek/gep1/ mkdir /var/www/archieve/tuhterek/polygon/ cp /var/www/tuht-gep1.jpg /var/www/archieve/tuhterek/gep1/gep1-`date +-%d-%m-%Y-%H%M%S`.jpg cp /var/www/tuht-polygon.jpg /var/www/archieve/tuhterek/polygon/polygon-`date +-%d-%m-%Y-%H%M%S`.jpg wget http://172.30.99.80/tuht-gep1.jpg -O tuht-gep1.jpg.bak cp tuht-gep1.jpg.bak tuht-gep1.jpg wget http://172.30.99.80/tuht-polygon.jpg -O tuht-polygon.jpg.bak cp tuht-polygon.jpg.bak tuht-polygon.jpg
      
      







ビデオウォールのスライス
 <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam200.jpg&picwidth=92%&textpage=26  -  &urladmin=http://192.168.0.200"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam201.jpg&picwidth=92%&textpage=26  -   &urladmin=http://192.168.0.201"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam202.jpg&picwidth=92%&textpage=26  - &urladmin=http://192.168.0.202"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam203.jpg&picwidth=92%&textpage=26  - &urladmin=http://192.168.0.203"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam205.jpg&picwidth=92%&textpage=26  -  &urladmin=http://192.168.0.205"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam206.jpg&picwidth=92%&textpage=26  -  &urladmin=http://192.168.0.206"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam204.jpg&picwidth=92%&textpage=26  - &urladmin=http://192.168.0.204"align=center width="340" height="290" scrolling="no">test</iframe> <iframe src="./cam-get.php?urlpic=http://192.168.1.239/bak_cam207.jpg&picwidth=92%&textpage=26  - &urladmin=http://192.168.0.207"align=center width="340" height="290" scrolling="no">test</iframe>
      
      







サーバーは定期的に(1分間に数回)ポイントからすべてのスクリーンショットをダウンロードし、古いスクリーンショットの代わりにそれらを追加します。古いスクリーンショットはアーカイブに保存されます。 夜には、別のスクリプトがアーカイブからそれらを取り出し、1つのビデオですべてのスクリーンショットを慎重に収集し、日付とカメラ名で名前を付けます。



スクリーンショットアーカイブを動画にコンパイルするスクリプト
 #!/bin/bash tochka=$1 kamera=$2 yestday=`date +%d -d yesterday` year=`date +%Y -d yesterday` mes=`date +%m -d yesterday` stime=`date +%H%M%S -d yesterday` mkdir /var/www/archieve/video/ mkdir /var/www/archieve/video/$tochka mkdir /var/www/archieve/video/$tochka/$kamera mkdir /tmp/picture/ rm /tmp/picture/* echo "$day $mes $year" cd /var/www/archieve/$tochka/$kamera/ find * -type f -size 0k -exec rm {} \; | awk '{ print $8 }' X=1; for i in *.jpg; do mv $i /tmp/picture/$(printf %07d.%s ${X%.*} ${i##*.}) let X="$X+1" done cd /tmp/picture/ ffmpeg -f image2 -r 1 -i %07d.jpg -y /var/www/archieve/video/$tochka/$kamera/$kamera-$yestday-$mes-$year.avi
      
      







スクリーンショットを取るためのフローチャート






今後の計画


同じパラメーターnを異なるスクリプトにn回登録する必要をなくしたいと思います。 設定を<どこか>に保存し、必要に応じてそこから取得し、目的のカメラを追加するときに必要なスクリプトを自動的に生成する予定です。

新しいカメラを追加するためのフォームを固定する予定です。



すべてをLinuxに転送したいと思います(現在、仮想マシンを展開する機会がある場所ではなく、主にWinサーバーとhyper-vを使用しています)。



信頼性を高め、画像の品質とリフレッシュレートを向上させたいのですが、トラフィックが大幅に増加することはありません。



これは最初のバージョンではありませんが、それでも完璧にはほど遠いです。 プロトタイプと言えます。 したがって、批判(建設的)は歓迎されますが、「松葉杖のサイクリスト」と叫ぶことは歓迎されません。 私はそれを自分で知っています。 しかし、完成したソフトウェアは私たちの欲求を満たしていないので、自分でかわす必要があります。



PS


PMのエラーについては、メールでお問い合わせください。



UPD:


自家製の監視システムの一部
クリック可能





「サイトが利用可能です」という碑文は、http経由でカメラ管理パネルの利用可能性を確認するphpスクリプトを使用して発行されます。 左の列の画像にカーソルを合わせると、フルサイズのウィンドウがポップアップします。

少し後で壁を挿入します。



All Articles