TapoのRTSPだけでWindows用カメラビューアを自作した
見守りカメラのTapoは、スマホアプリからなら複数台をまとめて快適に見られます。ただ自分がほしかったのは「PCの前に座っているときに、大画面で全カメラを一望できる」環境でした。ブラウザ経由のクラウドビューアも試しましたが、遅延と画質、複数台同時表示のどれをとっても物足りませんでした。
Tapoのカメラは設定を有効化すると、RTSPでローカル配信してくれます。これを使えばクラウドを経由せず、LAN内で完結した速い映像が見られるはずだと思い、Windows用のビューアをPythonで書きました。
リポジトリはこちらです。
なお、Tapo、TP-Linkとは無関係な個人プロジェクトであることを先にお断りしておきます。商標はTP-Link Systems Inc.のもので、公式が公開しているRTSP配信を利用しているだけです。
何ができるか
複数台のカメラをグリッド、縦並び、横並びの好きなレイアウトで並べられます。回線が切れても自動で再接続するので、Wi-Fi環境でも放置しておけます。録画はffmpegでストリームをそのままコピーするだけなので画質劣化がなく、CPU負荷もほぼゼロで済みます。ほかにHD/SD切替、スナップショット、カメラのマイク音声再生あたりを一通り詰め込みました。
最近のアップデートでは、カードのサイズをS/M/Lで切り替えられるようにしたのと、録画・スナップショットの保存先を自由に変更できるようにしました。あとタイムスタンプ表示はTapo本体が焼き込む時刻と丸かぶりしていたので、デフォルトOFFにしたうえで、ONにする場合もTapoの表示と重ならない右下に出すよう位置を変えました。地味ですが、地味に困っていた部分だったので直せてよかったです。
動かしている仕組み
表示側はcustomtkinterで組んでいます。標準のtkinterよりダークテーマが作りやすく、見た目を整えるのに時間を取られませんでした。映像取得はOpenCVの cv2.VideoCapture をFFMPEGバックエンドで使い、 rtsp_transport をtcpに固定して安定させています。UDPのままだと、自宅のWi-Fi環境ではコマ落ちが頻発しました。
録画は ffmpeg -c:v copy でストリームをそのままコンテナ化するだけで、再エンコードは一切していません。音声だけはカメラ側のPCM/A-lawがMP4コンテナに対応していないため、AACに変換して埋め込んでいます。配布はPyInstallerで単一exeにまとめ、ffmpegのバイナリも imageio-ffmpeg 経由で同梱したので、使う側はPythonのインストールすら不要になりました。
つまずいたところ
一番厄介だったのは、録画停止時の処理でした。ffmpegのプロセスを強制killすると、MP4のインデックス情報(moov atom)が書き込まれないまま終わってしまい、できあがったファイルが再生できないことがありました。標準入力に q を送って正常終了させるよう変えたら直りました。地味な一行ですが、これに気づくまでに何本か壊れた録画ファイルを量産してしまいました。
もう一つは帯域の問題です。複数台を同時に高画質で受信すると、自宅のWi-Fiがすぐ詰まってしまいます。音声だけを軽量な stream2 (SD側)から取っているのはこのためで、映像と音声で使うストリームをあえて分けています。
カメラ側の準備
Tapoアプリで「カメラのアカウント」を有効化しないと、RTSPは開きません。スマホでログインしているアカウントとは別物なので、最初ここでしばらくハマりました。
設定の歯車から詳細設定、カメラのアカウントと進み、ユーザー名とパスワードを設定します。あわせてカメラのIPアドレスも確認しておきましょう。ルーター側で固定IPにしておかないと、DHCPで番号が振り直されるたびに設定をやり直す羽目になります。
セットアップ
一番手軽なのは、Releasesから TapoViewer.exe を直接ダウンロードする方法です。Pythonのインストールは不要で、ffmpegも同梱済みなので、ダブルクリックだけで動きます。
自分でビルドしたい場合は、Python 3.10以降を入れて、リポジトリ内の build_exe.bat を実行してください。詳しい手順はREADMEにまとめてあります。
映像の扱いについて
映像も音声も同一LAN内のカメラとPCの間だけで完結していて、外部サーバーには一切送っていません。カメラの認証情報は %APPDATA%\TapoViewer\ にそのまま平文で保存されるので、共有PCで使う場合はその点だけご注意ください。テレメトリや広告SDKの類は入れていません。
さいごに
同じようにTapoをWindowsから見たい人の役に立てば十分だと思い、公開しました。バグ報告や欲しい機能があれば、GitHubのIssueで教えてもらえるとうれしいです。
- リポジトリ: https://github.com/1120nm7-hub/TapoViewer
- ライセンス: MIT
