ffmpegでTS-NA220WからRTSPでカメラ映像を取得する
TS-NA220Wという防犯カメラを使っているが…
TS-NA220W | ネットワークカメラ | IODATA アイ・オー・データ機器
本体の録画機能に不満な点(連続録画に失敗していつの間にか録画されていなくなったり)があり、嫌になったのでRTSPから直接動画を保存することにした。
なおネットワークカメラがほしい人も今更TS-NA220Wという値段の高いものを買う必要はなく、ATOM CAM2やTapo C310あたりを買う方が良いと思う(どちらも防水防塵の屋外仕様でTapo C310はRTSP対応も公式ブログで説明されている)
Tapoを使用したRTSPライブストリーミングの利用方法 | TP-Link 日本
ffmpegでRTSPで映像取得する
本題。
本体の録画機能がたびたび止まるのでLinux(ラズパイ)から直接RTSPで取得することにした。
ffmpegのバージョンは以下の通り
$ ffmpeg -version
ffmpeg version 4.3.3-0+rpt2+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Raspbian 10.2.1-6+rpi1)
以下のコマンドでRTSPで動画をファイルに落とし込める。
ffmpeg -i rtsp://$USERNAME:$PASSWORD@$NA220W_IPADDR:$NA220W_PORT/ipcam_h264s1.sdp -strftime 1 -segment_time 900 -segment_atclocktime 1 -segment_format mp4 -reset_timestamps 1 -nostdin -f segment /path/to/files/%Y%m%d_%H%M%S.mp4
ffmpegのオプションは公式ページに書いてあるが、オプションが膨大な上、バージョンによって使えるオプションが結構変わっているっぽいのでよく調べたほうが良さそう。
strftime
- 1にすると保存書式にstrftime形式が使えるようになる(%Yとか使えるようになる)
segment_time
- ファイルあたりの録画時間。今回は900秒ごとに1ファイルを作成する
segment_atclocktime
- 0:00からスタートして segment_timeで指定した秒数ごとに時計の時間通りに分割する。
segment_format
- ファイルフォーマット
reset_timestamps
- 分割されたファイルごとのタイムスタンプが0に戻る
nostdin
- 標準入力を無効化する。nohupなどでバックグラウンドで動かす場合は必須のオプション(らしい)
-f 対象ファイルの指定。今回はstrftime 1で%Yなどの書式が使えるので%Y%m%d_%H%M%S.mp4としている。
注意点
ffmpegを長期(数時間~数日)で連続稼働させると何らかの理由で落ちることがあるので、今の所2時間に一回プロセスを立ち上げ直すスクリプトを組んで対応している。 また(後述するが)TS-NA220Wは連続稼働(数日~十数日)しているとカメラ自体がハングすることがあるが、その場合にもffmpegのプロセスが落ちるのでプロセスを立ち上げ直す必要がある。
TS-NA220W/IODATAへの愚痴
TS-NA220Wは映像常時録画機能が本体にあるがたびたび止まったりそもそもカメラ自体がハングすることがあり、おそらくソフトかハードにバグがあると思われる(2台持っているがそのどちらも同じような症状があるため個体差ではない可能性が高い)
カメラ自体がハングした場合は電源を抜き挿しするしかなく、とても面倒なのでファームアップデートされないかなと思っているが発売からしばらく経っておりもうファームアップデートはされないだろう。 またAPIがあることをウリの一つにしているがそのAPIの説明文書についてはなぜかPDF形式で、ダウンロードに必要な個人情報を入力させた上でのみ取得可能となっている点もいまいち。APIはWEB公開くらいしていてほしい。