シェルツールによるWebカメラからのビデオファイルの処理の自動化

当局がいくつかの事物の彼ら自身のビデオ監視で組織し、最小の資金を満たすために時間をかけてかかった。 これを自動化するタスクは、システム管理者の肩にかかっていました。つまり、私です。

指定:N-D-Link 2102ビデオカメラ、ビデオ監視サーバーおよびリモートファイルストレージ用の物理的な2ユニットサーバー。

その結果、一部のユーザーをビデオ監視サーバーにオンラインで送信し、ビデオ録画のアーカイブを整理できるようになるはずです。



猫の下にはいくつかのスクリプトがあり、コードをより良く書く方法、なぜ多くのものが必要なのか、どのように解決されるのかを理解し、頭の中に物事を整理し、他の人を助けることを本当に期待しています。

このプロジェクトは非常に難しく書かれていました-シェル(bash)スクリプトをあまり勉強していませんでした-以前はこれは必要ありませんでした。

しかし、タスクが設定され、頭の中に解決アルゴリズムがある場合、すべてのスクリプトがやり直されたので、半年後にそれらを読んだとき、私と私の後継者は何も質問せず、ゼロからすべてを書き直したいという欲求もありませんでした。



UPD:投稿は定期的に更新されます。





選択されたディストリビューションはUbuntu-Server 10.04です。 ZoneMinderはオンライン表示用のサーバー部分になりました。UbuntuとZoneMinderの構成方法については多くのドキュメントが作成されているため、この質問はこのドキュメントの範囲外になります。アーカイブメンテナンスの自動化についてお話します。



カメラ録画(ミニクリップ、これはビデオの損失を最小限に抑えるという点で論理的に正当化されます)のメインレシーバーとして、ZoneMinderが回転するサーバーが存在することが決定されました。 Sambaサーバーは、カメラからのビデオの受信、およびカメラとファイルストレージ間のリンクを解決するための最適かつ最も簡単な方法としてサーバーに展開されます。



ビデオアーカイブに関連するすべてのファイルは、/ home / ipcamera / camnameにあります。

/ home / ipcamera / scripts-/ etc / crontabでスケジュールされたとおりに1時間に1回実行されるスクリプト。

/ home / ipcamera / out-処理されたビデオが保存されるボールのファイルストレージからマウントされます。



依存関係には、Sambaアーカイブが保存されているセクションをマウントするためのSambaツールと、コンソール計算機としてのbc、およびコーデックとavimergeがあります。



タスク:

1.カメラからビデオを受信(1分間のビデオ)

2. 60分のクリップを1つに排出します。

3.受信した1時間ごとのビデオをファイルストレージにアップロードします。

4.ビデオ監視サーバーから3日以上経過したすべてのビデオを削除します。

5. 3か月以上経過したビデオをアーカイブから定期的に削除します。

6.アーカイブへのアクセスを必要な人に与え、必要のない人には与えない。



ネットワークレベルでは、ビデオ監視サーバーにカメラを使用できます。Webインターフェイスを介して設定でき、ファイルストレージも使用できます。



すべてのスクリプトは、マキシムによってコメント化されています。



カメラ設定では、ntp組織で構成されたサーバーとビデオ録画時間を公開します。たとえば、カメラ自体の設定では9〜18です。



はい、録音の品質を認識しており、この記事ではこの問題は考慮されていません。また、このような自己組織化監視システムの合法性も考慮されていません。



SambaおよびZoneminderの構成もここでは考慮されませんが、Samba構成の一部なしで行う方法はありません。



最初の構成は、スケジューラ構成の一部です。



フォーマットのインデントがいくつかの場所で飛んでいるようです、ご容赦ください

#cat /etc/crontab 5 9-20 * * 1-6 root /home/ITC/ipcamera/scripts/split #    10 9-20 * * 1-6 root /home/ITC/ipcamera/scripts/upload #     - 30 20 * * 1-6 root /home/ITC/ipcamera/scripts/clear #       0 21 * * 6 root /home/ITC/ipcamera/scripts/archieve #  . 0 23 * * * root rm /var/spool/nullmailer/queue/* #      –    mail spooler  .
      
      





順番に行きましょう:

このすべての不名誉のための構成ファイル。

 #cat scripts.conf #         . camshare="/home/ipcamera/" #   filename="*.avi" #      currentdate=`date +%Y%m%d"/"%H` #  ,    ,  smb, -   . outfiles="out/" # Lock-,     . lockfile=`basename $0`".lock" #  . logfile="logfile" #   tmpfile=`basename $0`".tmp" #        upload_share_name="//filearchieve/web_camera_video" #     upload_share_path="/home/ipcamera/out" #        upload_share_user="ipcamerauser" #  upload_share_passwd="ipcamerapassword" #   share_mount_command="mount -t cifs" #   ,  . Age=3
      
      





スクリプトをアンロードして変数を統合するための関数記述ファイル

 #cat functions.sh #      . # ver 1.12. ###            . . /home/ipcamera/scripts/scripts.conf #     log_msg() { echo `date +%Y"/"%m"/"%d" "%T`"  "`basename $0`": $1." >> $camshare$logfile } #       -         . lock_on() { # ,    ,   -     . if [ -f $camshare$lockfile ]; then echo `date +%d"/"%m"/"%Y" "%T`"   ,  $0  ?   ." log_msg "  ,   " exit else #     - . touch $camshare$lockfile echo `date +%d"/"%m"/"%Y" "%T`"   " fi } #       . lock_off() { if [ -f $camshare$lockfile ]; then #   . rm $camshare$lockfile echo `date +%d"/"%m"/"%Y" "%T`"    ." else #    ,     . echo `date +%d"/"%m"/"%Y" "%T`"    ." fi } #       . clear_tmp() { if [ -f $camshare$tmpfile ]; then #   . rm $camshare$tmpfile echo `date +%d"/"%m"/"%Y" "%T`"   $tmpfile ." else #    . echo `date +%d"/"%m"/"%Y" "%T`"   $tmpfile  ." fi } #    . upload_share_mount() { # ,     . test=`mount | grep "$upload_share_path"` if [ "$?" -eq "0" ] ; then #   -   . echo " $upload_share_path  ." else #   . `$share_mount_command $upload_share_name $upload_share_path -o user=$upload_share_user"%"$upload_share_passwd` #  . if [ "$?" -eq "0" ] ; then #   . echo " $upload_share_path     ." else #        . echo ":  $upload_share_path   .  ." log_msg ":  $upload_share_path   .  ." exit fi fi } #     . upload_share_umount() { # ,     . test=`mount | grep "$upload_share_path"` if [ "$?" -eq "0" ] ; then #  , . `umount "$upload_share_path"` echo " $upload_share_path     ." else #  ,    . echo " $upload_share_path  ." fi }
      
      





カメラの微細なビデオをマージするファイル(残念ながら、このパラメーターはカメラでは変更できませんが、記録中の損失とカメラと受信サーバー間のリンク破損を最小限に抑えるという観点からお勧めします)

 #cat split #!/bin/sh ##          . #ver 1.0. #       . . /home/ipcamera/scripts/functions.sh lock_on log_msg "" #     ,            . find $camshare -type d | awk {'FS="/"} {print"/"$2"/"$3"/"$4"/"$5"/"$6"/"$7"/"$8}' | grep -v '/$' | grep -v '$outfiles' | grep -v $currentdate > $camshare$tmpfile #    ,   ,       . for i in `cat $camshare$tmpfile` ; do cd $i ; [ -f $i.avi ] || avimerge -i `ls | sort` -o $i.avi ; rm -fr $i ; done clear_tmp log_msg "" lock_off
      
      





処理されたすべてのビデオをファイルストレージにアップロードするスクリプト。

 #cat upload #!/bin/sh . /home/ipcamera/scripts/functions.sh ##    ,  ,    . #ver 2.2. lock_on log_msg "" upload_share_mount #      AA.avi,    ,        . find "$camshare" -type f -name '[0-9][0-9].avi' | awk '{FS="/"} {print"/"$2"/"$3"/"$4"/"$5"/"$6"/"$7"/"$8}' | grep -v "/$" | grep -v "$outfiles" | grep -v "$currentdate" > "$camshare$tmpfile" #          / -           . for source in `cat $camshare$tmpfile` ; do city=`echo "$source" | awk -F / '{ print $5 }'` date=`echo "$source" | awk -F / '{ print $7 }'` fname=`echo "$source" | awk -F / '{ print $8 }'` [ -d "$camshare$outfiles$city" ] || mkdir "$camshare$outfiles$city" | echo "  $city ." [ -d "$camshare$outfiles$city/$date" ] || mkdir "$camshare$outfiles$city/$date" | echo " $camshare$outfiles$city/$date ." [ -f "$camshare$outfiles$city/$date/$fname" ] || cp "$source" "$camshare$outfiles$city/$date/$fname" done clear_tmp upload_share_umount log_msg "" lock_off
      
      





現在-3日以上経過したファイルからのビデオ監視サーバーのクリーニング

 #cat clear #!/bin/sh ## ,     3    . #ver 1.0 #       . . /home/ipcamera/scripts/functions.sh lock_on log_msg "" upload_share_mount #   offset="172800" # 3    .# TODO      unixdate=`date +%s` #    . timediff=`echo "$unixdate"-"$offset" | bc` #        offset'. #      AA.avi,    ,         . find "$camshare" -name '[0-9][0-9].avi' | awk '{FS="/"} {print"/"$2"/"$3"/"$4"/"$5"/"$6"/"$7"/"$8}' | grep -v '/$' | grep -v "$outfiles" | grep -v `date +%Y%m%d` > $camshare$tmpfile #       . for source in `cat "$camshare$tmpfile"` ; do city=`echo "$source" | awk -F / '{ print $5 }'` #    "". date=`echo "$source" | awk -F / '{ print $7 }'` # -"- "". fname=`echo "$source" | awk -F / '{ print $8 }'` # -"- " ". filedate=`ls -l --time-style=long-iso "$source" | awk '{print $6}'` #  . unixfiledate=`date +%s -d"$filedate"` #     . outfilename="$camshare$outfiles$city/$date/$fname" #    . #       ,     ,    timediff',   - . if [ -f "$outfilename" ] ; then echo "$outfilename   ." if [ "$unixfiledate" -lt "$timediff" ] ; then echo "$source ." rm "$source" else echo "$source" "$unixfiledate ." fi else echo " $outfilename  ." fi done #   . find "$camshare" -type d -empty | grep 'video' | xargs rm -fr {} upload_share_umount clear_tmp log_msg "" lock_off
      
      





おやつに

 #cat archieve #!/bin/sh ## ,         . #ver 1.0. #       . . /home/ipcamera/scripts/functions.sh lock_on log_msg "" upload_share_mount #  . Year=`date +%Y` Month=`date +%m` Old=`echo "$Month"-"$Age"|bc` find "$camshare" -type d -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'| grep "$outfiles" > $camshare$tmpfile #       . for source in `cat "$camshare$tmpfile"` ; do ddate=`echo "$source" | awk -F / '{ print $7 }'` Y=`echo $ddate | head -c4` M=`echo $ddate | head -c6 | tail -c2` D=`echo -n $ddate | tail -c2` if [ $Y -eq `date +%Y` ] ; then # echo "$source    ." if [ "$M" -le "$Old" ] ; then # echo " $source ,  ." rm -rf $source else echo "  $source      ($Age ),  ." fi else # echo " $source          ." # TODO :   mtime  ,  2010   . echo $source >> $camshare/2010.log fi done #TODO         . upload_share_umount clear_tmp log_msg "" lock_off
      
      





実際には、日付がカメラに表示され、2010年に書き込みが開始されることもありますが、ファイルが作成された時点で、ファイルが実際に作成された時点を理解し、必要に応じて名前を変更できますが、この手順にはまだ十分ではありませんでした。



リソースの強度について:

#稼働時間

17:49:27 up 2:21、1ユーザー、平均負荷:4.27、4.25、4.24

CPUはメモリよりも負荷が高くなります。 これはZoneMinderが試行しています。



ログ別:

約10台のカメラのランタイムは次のとおりです(HP Proliant DL560 G1、1Gbのメモリ、Xeon 2x2188.804 MHz):

 2011/10/29 20:30:01  clear: . 2011/10/29 20:30:11  clear: . 2011/10/29 21:00:01  archieve: . 2011/10/29 21:00:12  archieve: . 2011/10/31 09:05:01  split: . 2011/10/31 09:05:30  split: . 2011/10/31 09:10:02  upload: . 2011/10/31 09:10:16  upload: .
      
      





カメラごとにファイルボールを作成する

 #cat mkshare #!/bin/bash ##      . # Version name: 2.0. #        functions.sh. #   . . /home/ipcamera/scripts/functions.sh lock_on log_msg "" #       -   . if [ "$1" != "" ]; then mkdir "$camshare$1" #      chmod 777 "$camshare$1" #    #   - samba   . echo -e "\n[$1]\n comment = $1\n browseable = yes\n path = $camshare$1\n printable = no\n guest ok = yes\n read only =no\n create mask = 0700" >> /etc/samba/smb.conf #  samba. service smbd restart #   . echo "!!!     IP    Samba ACL,          ,   samba : sudo service smbd restart" log_msg "  $1  ." else #         . echo "    $0." fi
      
      





Samba設定の一部:

 allow hosts = 10.0.0.1, 10.0.0.2 #         ,     . [camname1] comment = camname1 browseable = yes path = /home/ipcamera/camname1 printable = no guest ok = yes read only = no
      
      





カメラでは、サーバーはIPアドレスとカム名で構成されています。



## TODOリスト。

1.必要なパッケージがインストールされているかどうかを確認すると、debでこの不名誉をすべてビルドすることができます。

2.カメラの可用性を監視し、責任者に通知します。

3.スクリプトのローカライズ。

4. debパッケージと通常のman / texinfo。

5.おそらく&> / dev / nullにある多くのメッセージの出力を削除する価値がありますが、まだわかりません。

6.依存関係をチェックするコードとそれらをインストールするリクエストを追加します(条項4との通信が可能です)

7. sambaはドメインと統合されているため、従業員のログインを使用してアクセスを整理することは可能ですが、ドメインログインを備えたカメラはうまく機能しないため、再び意味があります。

8.カメラへのリンク(ping)の有効性に関するカメラの監視はまだ実装されていません。

9.監視が実装されるまで、カメラがリセットされるか、ntpで時間を取得できず、2010年にビデオの書き込みを開始しました。



最後の2段階-異なる言語での変数のローカライズ、通常のドキュメント、およびパッケージでも十分ではありません。スクリプトが実際に自動的に実行され、月に1度であればサーバーに行きます-操作アルゴリズム全体が完全に成熟した場合、およびそれに応じてエラーをチェックすると、オペレーターの介入は実質的に不要になり、今日サーバーは数か月で稼働可能になり、サーバーをActive Diにバインドするカーネル、samba、Kerberosを更新するために最初の再起動が実行されました レクトリー。



気になるのは、ログファイル内のメッセージを除き、すべての出力を抑制する必要があるためです。



そのおかげで、私はあなたを助けたと思います。

今後、スクリプトを最適化し、アイデアを開発するためのレシピを喜んで受け入れます。



ソースはここから入手できます: GitHubで



All Articles