web-dev-qa-db-ja.com

IPカメラからRTSPストリームをキャプチャして保存する

RTSP(h264 mpeg4)ストリームを出力するIPカメラがいくつかあります。

VLC経由でローカルでURLを押す:rtsp://192.168.0.21:554/mpeg4

カメラをストリーミングして(デスクトップ上の)ディスクにダンプできます。ただし、これらのファイルをNAS(FreeNAS)に保存したいのですが。 RTSPストリームをキャプチャしてディスクにダンプする方法を探していましたが、見つけることができません。

FreeBSDまたはLinux(RaspberryPi)でストリームをキャプチャし、ストリーミングコンテンツをLinuxまたはFreeBSDのローカルディスクにダンプすることができますか?できれば30分ごとに?

編集:NASはヘッドレス(HP N55Lか何か)で、RaspberryPiもヘッドレスです。

私はすでにZoneMinderを調べましたが、小さいものが必要です。私はおそらくMotionを使ってストリーム上の動きを検出することを望んでいましたが、それは後になるでしょう。

16
Keerthi

IPカメラの品質はさまざまですが、私の経験では動作が不安定になることがあります。 RTSPストリームを処理するには、ある程度のフォールトトレランスが必要です。

Live555プロジェクトは、CLI経由でRTSPオーディオ/ビデオストリームをプルするための比較的フォールトトレラントなRTSPクライアント実装、openRTSPを提供します。 http://www.live555.com/openRTSP/

たとえば、カメラのRTSPオーディオ/ビデオをQuickTime形式(AVIおよびMP4も使用可能)のファイルに保存するには、15分ごとに1つのファイルを使用します。

$ openRTSP -D 1 -c -B 10000000 -b 10000000 -q -Q -F cam_eight -d 28800 -P 900 -t -u admin 123456 rtsp://192.168.1.108:554/11

これらのオプションは以下を意味します。

-D 1 # Quit if no packets for 1 second or more
-c   # Continuously record, after completion of -d timeframe
-B 10000000 # Input buffer of 10 MB
-b 10000000 # Output buffer 10MB (to file)
-q   # Produce files in QuickTime format
-Q   # Display QOS statistics 
-F cam_eight  # Prefix output filenames with this text
-d 28800      # Run openRTSP this many seconds
-P 900        # Start a new output file every -P seconds
-t            # Request camera end stream over TCP, not UDP
-u admin 123456  # Username and password expected by camera
rtsp://192.168.1.108:554/11  # Camera's RTSP URL

-tオプションを削除すると、openRTSPはデフォルトでUDPになります。これにより、ネットワークトラフィックを少し減らすことができます。あなたはあなたに合った組み合わせを見つけるためにオプションで遊ぶ必要があるでしょう。

率直に言って、カメラ自体は時々信頼できないか、単に実装されているように​​違うのようにソケットを予期せず閉じることはそれほど珍しいことではありません。

時々openRTSPクライアントはこれらの不具合を捕らえません。それで、私はそれぞれのopenRTSPクライアントインスタンスの標準出力を呼び出しそしてモニターするために 'subprocesses'モジュールを使用してPythonでコントローラをコーディングすることを選択し、そしてまたファイルが拡大し続けていることをチェックします。

これは、CCTV業界のローエンドが規格に即していないため、RTSPとONVIFが最も頻繁に悪用されていることの副産物のようです。

幸い、通常これらの問題を回避することができます。あなたのIPカメラとコントローラがすべて一緒にうまく遊ぶように設計されていない限り、一度だけ発見と設定管理のためにONVIFを使うだけです。

私はRaspbianを実行しているいくつかのRaspberry Pi B +でopenRTSPを使用します。各1280 x 1024ストリームはCPU時間の約8〜10%を占め、RPiごとに最大8台のカメラを実行し、ファイルをNASストレージに書き込みます。別のRPiはffmpegを使って完成したファイルを処理し、動きを探し、それらのフレームのインデックスPNGを生成して、侵入を見つけやすくします。

この後者の部分を行うZoneMinderと呼ばれるオープンソースの取り組みがありますが、私はそれを私のカメラで動作させることができませんでした。 ZMでは、ONVIFのサポートが新しくて初期段階にあります。100ドル以下のIPカメラという私の話題によって生み出されたむらのあるRTSPストリームとうまく対抗できないようです。

24
Kevin-Prichard

私はちょうど2セントを追加し、BjornRの答えを補完すると思った。

定期的にVLCプロセスを強制終了するためにcronジョブを実行する代わりに、指定された時間実行してその後閉じるようにVLCに指示することができます。

これは私が自分のマシンで実行するコマンドです。

/usr/bin/vlc -vvv rtsp://192.168.1.128:1554/11 --sout=file/ts:/media/path/to/save/location/recording-$(date +"%Y%m%d%H%M%S").ts -I dummy --stop-time=480 vlc://quit

これは指定された時間の間VLCを実行し、後で終了します。 VLCは録画を停止し、開いたままにするため、vlc:// quitパラメータが必要です。このコマンドはループの内側に置く必要があります。

私がこれまでに見つけた唯一の問題はそれが新しい記録が始まるたびにそれが数秒を逃すかもしれないということです。

7
Juanpi

VLCはあなたのストリームを処理するのに理想的な候補のように見えます。 ストリームをキャプチャするための基本的な方法 はVideolanのWebサイトで説明されています。次のコマンドを使用して、D-Link DCS-5222ネットワークカメラの出力を正常に記録しました。

vlc rtsp://user:password@ip/play1.sdp --sout=file/ogg:mystream.ogv

あなたの場合、これは出力をローカルに保存するために働くかもしれません:

vlc rtsp://192.168.0.21:554/mpeg4 --sout=file/ts:mystream.mpg

VLCがこれを実行できるかどうかわからないので、このvlcプロセスを終了するスクリプトを実行して30分ごとに新しいインスタンスを起動することをお勧めします。

NASへの保存に関しては、ローカルのファイルシステムにマウントするだけです。

5
BjornR1989

私があなたの質問に正しく従っているなら、Linuxシステム(RPi)で次のコマンドを試してみませんか。

ffmpeg -i rtsp://192.168.0.21:554/mpeg4 -vcodec copy -acodec copy -map 0 -f segment -segment_time 300 -segment_format mp4 "ffmpeg_capture-%03d.mp4"

これにより、300秒単位でビデオが保存されます。 (クリップの長さは入力と出力のフレームレートによって異なります)

4
Aldo