はじめに
IP カメラを購入し、自宅の防犯カメラとして7年使用していました。
FTP や HTTP でカメラ本体に録画したファイルをダウンロードできるという自由度の高いカメラで、
24時間・365日の連続録画モードで稼働させ、cron で定期的にダウンロードしていました。
ハードウェアが老朽化し、同メーカの新型に買い換えましたが、
クラウド対応(というか、何をするにもクラウド経由)のカメラになっており、
クラウドの利用料で収益化するビジネスモデルのカメラになっていました。
ONVIF には対応していたので、ffmpeg を使って連続録画をするコマンドのメモです。
ffmpeg コマンドの動作概要
- ONVIF カメラの RTSP 制御
- カメラから配信されるストリームの再エンコードは無し
- 一定間隔で録画・ファイル保存していく
- ファイル切り替わり時にタイムスタンプをリセット
語句説明
ffmpeg とは
Wikipedia によると、以下のように記載されています。
FFmpeg(エフエフエムペグ)は動画と音声を記録・変換・再生するためのフリーソフトウェアである。Unix系オペレーティングシステム(OS)生まれであるが現在ではクロスプラットフォームであり、コーデックライブラリ、コンテナライブラリ、フィルタリングライブラリなどを含む。コマンドラインから使用することができる。
ONVIF とは
Wikipedia によると、以下のように記載されています。
ONVIF(オンヴィフ、Open Network Video Interface Forum)は、アクシス、ボッシュ、ソニーが立ち上げたネットワークカメラ製品のインターフェース規格フォーラムである。ネットワークカメラの機能をWebサービスとして公開するのが特徴。ネットワークカメラの利用に必要な一通りのインターフェイスを定義している。
録画方法
ffmpeg は様々なコーデックに対応しているだけでなく、さまざなま入力にも対応しています。
ONVIF でカメラに接続する場合、RTSP というプロトコルを使用しますが、
ffmpeg でも対応しており、以下のコマンド引数で録画することが可能です。
ffmpegのコマンド
ffmpeg -i rtsp://<IPアドレス>:554/mpeg4
-vcodec copy
-acodec copy
-map 0
-f segment
-segment_time 20
-segment_format mp4
-reset_timestamps 1
-t 20
"ffmpeg_capture-%03d.mp4"
ffmpeg コマンド説明
入力ソースの指定(-i)
command
-i rtsp://<IPアドレス>:554/mpeg4
ファイルや ONVIF カメラ RTSP サーバーの URL を直に指定できます。
動画・音声コーデックの指定(-vcodec, -acodec)
command
-vcodec copy -acodec copy
copy を指定することで、入力されたコーデックでそのまま出力する(再エンコードなし)。
ストリームマッピングの指定(-map)
command
-map 0
音声トラックのマッピングを指定できます。
変換フォーマットの指定(-f)
command
-f segment
一定間隔で出力するため、segment を指定します。
セグメントの設定(-segment_time, -segment_format)
command
-segment_time <秒> -segment_format mp4
「一定間隔」を<秒>で指定します。出力フォーマットは MP4 を指定。
分割ファイルごとの PTS をリセット(-reset_timestamps)
command
-reset_timestamps 1
セグメントで保存する場合、分割ファイルごとのタイムスタンプをリセットします。
リセットしなかった場合、2つ目以降のファイルを再生した場合に再生ポジションがおかしくなります。
duration の指定(-t)
command
-t <秒>
指定した秒数だけ、入力ソースからの動画を出力します。
出力ファイルの指定
command
"ffmpeg_capture-%03d.mp4"
segment を指定している場合は、フォーマット %03d などを指定して、
000, 001, 002 ・・・のように、分割ファイル名を指定することが可能です。