便利ツール

ffmpegでONVIF対応IPカメラの録画

2022年5月15日

はじめに

IP カメラを購入し、自宅の防犯カメラとして7年使用していました。
FTP や HTTP でカメラ本体に録画したファイルをダウンロードできるという自由度の高いカメラで、
24時間・365日の連続録画モードで稼働させ、cron で定期的にダウンロードしていました。

ハードウェアが老朽化し、同メーカの新型に買い換えましたが、
クラウド対応(というか、何をするにもクラウド経由)のカメラになっており、
クラウドの利用料で収益化するビジネスモデルのカメラになっていました。

ONVIF には対応していたので、ffmpeg を使って連続録画をするコマンドのメモです。

SANACHAN
SANACHAN
クラウドを契約する必要がなくなったため、経済的です。

ffmpeg コマンドの動作概要

  • ONVIF カメラの RTSP 制御
  • カメラから配信されるストリームの再エンコードは無し
  • 一定間隔で録画・ファイル保存していく
  • ファイル切り替わり時にタイムスタンプをリセット

 

語句説明

ffmpeg とは

Wikipedia によると、以下のように記載されています。

FFmpeg(エフエフエムペグ)は動画と音声を記録・変換・再生するためのフリーソフトウェアである。Unix系オペレーティングシステム(OS)生まれであるが現在ではクロスプラットフォームであり、コーデックライブラリ、コンテナライブラリ、フィルタリングライブラリなどを含む。コマンドラインから使用することができる。

SANACHAN
SANACHAN
スマホアプリなど、動画/音声コーデックに関する分野で幅広く利用されています。

 

ONVIF とは

Wikipedia によると、以下のように記載されています。

ONVIF(オンヴィフ、Open Network Video Interface Forum)は、アクシス、ボッシュ、ソニーが立ち上げたネットワークカメラ製品のインターフェース規格フォーラムである。ネットワークカメラの機能をWebサービスとして公開するのが特徴。ネットワークカメラの利用に必要な一通りのインターフェイスを定義している。

SANACHAN
SANACHAN
大抵のネットワークカメラはこの規格に対応しており、外部から簡単に制御できます。

 

録画方法

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 ・・・のように、分割ファイル名を指定することが可能です。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-便利ツール
-, ,