我が家の防犯対策としてTP-LInk社製のネットワークカメラ(Tapo)を購入したのですが、カメラ映像の保存先が、クラウドサービス又は、カメラ本体に挿入したSDカードへの保存のみので、カメラ映像の視聴もスマートフォンからのみとなっていたため運用上使い勝手があまりよくないと感じたため今回古くなったノートPCを利用して格安で、ホームセキュリティシステムの環境を整えられるか検証してみました。
今回は、導入偏として、メディアサーバ、エンコードアプリ、視聴用プレーヤをインストールし、カメラ映像のライブ視聴及び、カメラの映像の録画・視聴までの検証となります。今回の記事ではアプリの作成までは行っていません。
今回の検証内容
- ネットワークカメラ映像をPCからライブ視聴する
- ネットワークカメラ映像をPCへ保存する
- ネットワークカメラの録画映像をPCから視聴する
1.導入
今回検証で利用したインストールしたアプリ及び、インストール方法について説明します。
1-1.構成
| 項目 | 名前 |
|---|---|
| OS | Windows11 Home |
| ネットワークカメラ | RTSP接続可能なネットワークカメラ※1 |
| メディアサーバ(映像配信用) | MediaMTX |
| フォーマット変換(録画用) | ffmpeg |
| 視聴用プレーヤー | VLC media player |
メモ
今回はTP-LInk社製 Tapo C210, C560WSで検証を行いました
1-2.利用アプリケーションのインストール
-
Windows ターミナル(プロファイルはPowershell V7)からwingetコマンドを利用してアプリケーションをインストールすることとします。事前にWindows ターミナルの設定及び、wingetをインストールしておいてください - 「Windows」+「R」キーで「ファイル名を指定して実行」のダイアログを表示し、「名前」のテキストボックスに
wtと入力し、「Enter」キーでターミナルを起動します
ネットワークカメラ映像の受信・送信を行う為に、MediaMTXのインストールを行います
winget install -e --id bluenviron.mediamtx
RTSPデータをトランスコードする為に、ffmpegのインストールを行います
winget install -e --id Gyan.FFmpeg
カメラ映像の視聴確認用にVLCのインストールを行います
winget install -e --id VideoLAN.VLC
インストール完了後、ターミナルのウインドを閉じてください。
1-3.インストール確認
- 「Windows」+「R」キーで「ファイル名を指定して実行」のダイアログを表示し、「名前」のテキストボックスに
wtと入力し、「Enter」キーでターミナルを起動します - 以下のコマンドを実行し、
MediaMTX及び、ffmpegのコマンドを利用できることを確認します。
MediaMTXのバージョン確認コマンドの実行
mediamtx --version
ffmpegのバージョン確認コマンドの実行
ffmpeg -version
1-4.ネットワークカメラ映像の視聴確認
事前にネットワークカメラのマニュアルを参照し、RTSP接続の設定を行ってください。ここではネットワークカメラの設定については割愛します。
注意
ネットワークカメラよってRTSP接続できない(設定非公開)機器も存在しますので利用するカメラについては事前に確認しておいてください。
「Windows」+「R」キーで「ファイル名を指定して実行」のダイアログを表示し、「名前」のテキストボックスにvlcと入力し、「OK」ボタンでVLCを起動します。
- メニューバーから「メディア」‐「ネットワークストリームを開く」を選択し、「ネットワークを開く」ダイアログを表示します
- 「ネットワーク」タブの「ネットワークプロトコル」のテキストボックスにネットワークカメラ接続用のRTSPのURLを入力し、「再生」ボタンをクリックします
- 接続が成功すると、
VLCにネットワークカメラの映像が表示されます
接続用URL例
rtsp://<ユーザ>:<パスワード>@<IPアドレス>:<ポート>/<識別子>
ネットワークカメラ視聴確認後、VLCを閉じてください。
注意
TP-LInk Tapo製品はRTSP接続が最大2ストリームまでの制約があり。検証環境では外部アプリから接続/切断を繰り返しているとRTSP接続のコネクションが残ってしまう事象が発生していました。その場合の対処として接続先のカメラ機器の再起動を行うと問題か解消されました。
2.メディアサーバの設定
メディアサーバでRTSPデータの受信・送信及び、RTSPデータをトランスコードする設定を行います。
2-1.MediaMTXのコンフィグファイルの作成
ターミナルを起動し、作業用のディレクトリを作成します。ここではC:\RtspRecを作業用ディレクトリとします。作業ディレクトリを変更したい場合は、適宜読み替えてください。
実行ディレクトリの作成
New-Item -Path C:\RtspRec -ItemType Directory
実行ディレクトリへ移動
cd C:\RtspRec
MediaMTXのコンフィグファイルの作成
New-Item -Path .\mediamtx.yml -ItemType File
2-2.ネットワークカメラの映像データの受信・送信設定
mediamtx.ymlテキストエディタで開き、以下の内容にファイルを書き換えます。
C:\RtspRec\mediamtx.ymlの編集
rtsp: yes
rtspTransports: [tcp]
paths:
Camera1:
source: rtsp://<ユーザ>:<パスワード>@<IPアドレス>:<ポート>/<識別子>
sourceOnDemand: no
編集完了後、UTF-8(BOMなし)のファイル形式でファイルを保存します。
2-3.視聴確認
MediaMTXから送信されている映像データ(RTSP)が視聴できることを確認します。
ターミナルから、以下のコマンドを実行しMediaMTXを起動します。
mediamtx .\mediamtx.yml
VLCを起動し、以下のURLで接続します。(詳しい接続手順については、1-4.コマンド実行確認を参照)
rtsp://localhost:8554/Camera1
視聴確認後、一旦以下の手順でVLCを終了します。
-
VLCの「再生の停止」ボタンをクリック又は、ウインドウを閉じる
2.-4.ffmpegで映像ファイルの作成
MediaTMXを実行した状態で、更にターミナルを起動します。
以下のコマンドを実行し、カメラ映像ファイルの保存先のディレクトリを作成します。
cd C:\RtspRec
New-Item -Path .\Contents\Camera1 -ItemType Directory
ffmpegのコマンドを実行し、RTSPのストリームから映像ファイルが作成できることを確認します。
ffmpeg -rtsp_transport tcp `
-i rtsp://localhost:8554/Camera1 `
-c:v libx264 -preset veryfast -vf scale=640:360 `
-r 15 -crf 23 -an `
-f hls -hls_time 60 -hls_list_size 10 `
-hls_flags delete_segments `
-hls_segment_filename .\\Contents\\Camera1\\%Y%m%d_%H%M%S.ts `
-strftime 1 -reset_timestamps 1 `
-avoid_negative_ts make_zero `
.\\Contents\\Camera1\\stream.m3u8
メモ
1ファイル約60秒でファイル作成する設定の為、ファイルが作成されるまで1分程度時間がかかります
※確認後、「Ctrl」+「C」キーでffmpeg終了し、作成されたファイルを削除してください。
上記ffmpegコマンドは、RTSPストリームを受信し、HLS(HTTP Live Streaming)形式で保存する設定です。以下、今回指定したパラメータについての説明です。
入力設定
- RTSPをTCPで受信
- 入力ソースとしてrtsp://localhost:8554/Camera1を指定
エンコード設定
- 映像コーデックにH.264(libx264)を使用
- エンコード速度と圧縮率のバランス設定(高速)
- 映像を 640x360 にリサイズ(画面サイズ縮小によるディスク容量の節約)
- フレームレートを 15fps に設定(帯域節約によるディスク容量の節約)
- 映像品質(CRF=Constant Rate Factor:23は標準的な品質)
- 音声を無効化(音声無効化によるディスク容量の節約)
HLS出力設定
- 出力形式をHLSに指定
- セグメントの長さを60秒(1分)に設定
- プレイリストに最大10セグメントを保持(10分間保持)
- 古いセグメントを自動削除(保持期間が過ぎたファイルを自動削除)
- セグメントファイル名に日時フォーマットを使用(例:YYYYMMDD_HHMMSS.ts)
- 各セグメントのタイムスタンプを0から開始(HLS再生の安定性向上)
- セグメントファイルの保存パスと命名規則(日時付き)
- セグメントファイルを
.\Contents\Camera1\%Y%m%d_%H%M%S.tsとして保存 - HLSプレイリストファイルを
.\Contents\Camera1\stream.m3u8として保存
検証環境のディスク容量が少ないため受信したカメラ映像を再エンコードして録画映像を保存する設定にしました。環境に応じてffmpegのパラメータを適宜変更してください。
検証環境のディスク容量に制限があり今回は、出力ファイルフォーマットとして、古いセグメントを自動削除ができるhlsで出力ファイルを作成しました。
作成された映像ファイル(m3u8、ts)はvlcで視聴可能です。
ffmpegコマンドパラメータについてはffmpeg公式サイトのドキュメントを参照してください。
2.-5.ネットワークカメラ映像の録画設定
起動しているMediaMTXを「Ctrl」+「C」キーで終了後、テキストエディタでMediaMTXの設定ファイルmediamtx.ymlを開き、以下の内容に修正します。
C:\RtspRec\mediamtx.ymlの編集
rtsp: yes
rtspTransports: [tcp]
paths:
Camera1:
source: rtsp://<ユーザ>:<パスワード>@<IPアドレス>:<ポート>/<識別子>
sourceOnDemand: no
# 以下の行を追加
runOnReady: |
ffmpeg -rtsp_transport tcp \
-i rtsp://localhost:8554/Camera1 \
-c:v libx264 -preset veryfast -vf scale=640:360 \
-r 15 -crf 23 -an \
-f hls -hls_time 60 -hls_list_size 10 \
-hls_flags delete_segments \
-hls_segment_filename .\\Contents\\Camera1\\%Y%m%d_%H%M%S.ts \
-strftime 1 -reset_timestamps 1 \
-avoid_negative_ts make_zero \
.\\Contents\\Camera1\\stream.m3u8
runOnReadyRestart: yes
2-6.MediaMTXから映像ファイル作成確認
MediaMTXのアプリを起動し、mediamtx.ymlに設定した保存用のパスにプレイリストファイル及び、録画ファイルが作成されることを確認します。
MediaMTXを起動する
mediamtx .\mediamtx.yml
続いて、プレイリストファイル又は、tsファイルをダブルクリックし、録画ファイルを視聴できることを確認してください。
メモ
MediaMTX自体にレコーディング機能が実装されていますが、ネットワークカメラの送信データの相性や、ネットワーク環境が不安定な場合、レコーディング処理エラーが発生し今回の検証環境ではエラーが多発して、長期での運用はむずかいい状況でした。
参考:MediaMTXで映像ファイルを作成する設定例
rtsp: yes
paths:
Camera1:
source: rtsp://<ユーザ>:<パスワード>@<IPアドレス>:<ポート>/<識別子>
sourceOnDemand: no
# 以下の行を追加
record: yes
recordFormat: mpegts
recordPath: .\\Contents\\%path\\%Y%m%d_%H%M%S
recordSegmentDuration: 5m
recordDeleteAfter: 1h
3.まとめ
当初、Windowsで動作するAgent DVRを使って簡単にホームセキュリティシステムを導入できないか検証したのですが用意したPCが低スペックだったためかRTSPデータの視聴ができない(接続はできているようでしたが、画面上にカメラ映像がまともに表示されない状況でした。原因の特定まではしていません)。
今回用意したTP-Link社製のカメラ(Tap)だとRTSP接続が最大2セッションしか利用できない為、ライブ視聴用+録画用(ffmpegエンコード用)で2セッション使い果たしてしまい、ネットワークの通信状態不良等の理由によりセッションが残った状態で切断されてしまいました。この状態でIPカメラへ再接続を行うとセッションが枯渇している為、カメラを再起動しない限りアプリからの接続ができませんでした(実際には調査していないためあくまで予想です)。MediaMTXを中継することにより安定的に動作することができました。また、比較的マシン負荷も少ない状態で運用できています。
今後の予定として、カメラ映像の録画機能と、ライブ、録画映像をhttpで配信しブラウザから視聴できるWindowsサービスアプリの作成を検討しています。