どう動いているか
iPhone が送り、サーバーが中継して蓄え、ブラウザが映す。映像は WebRTC で視聴者へ中継し、位置情報は走行中1秒・停車中5秒ごと、テレメトリは15秒ごとにデータベースへ記録します。記録は配信後もグラフで確認できます。
映像経路
- iPhoneのハードウェアエンコーダでH.264に圧縮し、WebRTCでサーバーへ送る
- サーバーはSFU(Selective Forwarding Unit)として中継し、ブラウザはWebRTCで受ける
- 既定は1080p / 30fps / 6Mbps。回線に応じてAUTOで上限ビットレートを下げる
- 帯域不足時の挙動は3択: フレームレート優先 / 解像度優先 / 固定
- YouTube等へのRTMPはiPhoneから直接送出(サーバーを経由しない)
位置情報経路
- CoreLocationの測位を、走行中は1Hz、停車中は5秒ごとに間引いてREST APIへ送る
- データベースのRealtimeで視聴ページとコントロールパネルの地図へ反映
- 公開範囲は行レベルセキュリティで「配信中の配信者」に限定。配信を止めると位置は見えなくなる
停車・発進の判定条件
- 停車判定は0.5m/s未満が3秒続いたとき、発進は1.0m/s以上または停車地点から15m移動。停車・発進の瞬間は即時送信
- 速度が取れない静止時は、精度20m以内で3秒間6m円内に留まれば停車とみなす
遠隔操作の仕組み
- コントロールパネルがコマンドをテーブルに書き、iPhoneがRealtimeで購読して適用する
- 即時反映: GPS送信 / タイムスタンプ表示 / マイク音声 / 配信停止
- 次回配信から反映: 送信モード / 解像度 / フレームレート / ビットレート / AUTO / 帯域不足時の挙動 / ローカル録画
- 配信の開始はiPhone側の物理操作が必要。Webからは停止のみ
配送の詳細
- 届かない場合は5秒ごとのポーリングで拾う
- iPhone側の現在値はプロフィールに逆方向で報告され、パネルに表示される
テレメトリ
配信中、15秒ごとに次の項目を記録します。
記録項目の一覧
- 端末温度(4段階)
- バッテリー残量と充電状態
- RTT
- ジッター
- パケットロス数とロス率
- fps
- ビットレート
- 解像度
- 緯度・経度・速度
- アプリのバージョン
認証とセキュリティ
- ログインはメールアドレスに届く6桁コード(OTP)。パスワードは持たない
- 配信用のトークンはサーバーが発行し、署名鍵はiPhone側に存在しない
- ログアウトは端末単位。Webでログアウトしても現場のiPhoneは落ちない
- 視聴ページは認証不要だが、位置情報は配信中のみ公開
回線耐性
- 接続直後に映像が立ち上がらない失敗をアプリ自身が検知し、接続をやり直す。判定のしきい値はサーバー側で調整できる
- 切断時は自動で再接続。再接続後に再送出が進まない場合は接続を作り直す
- 上り専用回線を想定し、起動時と復帰時の下り通信を最小化(キャッシュがあるものはサーバーを待たない)
- 接続の各段階の時刻と失敗理由をサーバーへ記録し、あとから追跡できる
端末要件と制約
- iPhone、iOS 26以上
- バックグラウンドでの位置更新に対応。画面が消えてもGPS送信は続く