【監視カメラ×ラズパイ】ラズパイのカメラ映像をスマホから安全にストリーミング視聴する方法(MediaMTX + SSHトンネル)

ラズパイでストリーミング中のカメラ映像
こんな感じに見えます。黒い線は何かのコード。監視カメラとして使う分には申し分ない画質と遅延です。

Raspberry Piのカメラ映像を外出先や別室のスマホから確認したいとき、ポート開放などのセキュリティリスクを冒さずに、SSHトンネル(ポートフォワード)を使って安全にストリーミングする方法を解説します。

今回は軽量で優秀な配信サーバー MediaMTXと、ラズパイ用カメラツール rpicam-vidを使用します。

ラズパイ監視カメラの構成図
ラズパイ監視カメラシステムの構成図。Geminiにつくってもらいました。

ラズパイ側の準備:ツールのインストール

カメラ
カメラ。アリエクで購入。本体は200円台、アクリルケースは400円弱とケースのほうが高い。カメラはv1のコピー品だとか。普通に使える。

まずはRaspberry PiにSSH接続し、必要なパッケージをインストールします。映像のエンコード処理に必要なffmpegと、カメラ制御用のrpicam-appsを入れます。

sudo apt update
sudo apt install -y ffmpeg rpicam-apps

MediaMTXの導入と最適化

ストリーミングサーバーとなるMediaMTXをダウンロードして配置します。

cd ~
# MediaMTXのダウンロードと展開(※バージョンは適宜最新版に変更してください)
wget https://github.com/bluenviron/mediamtx/releases/download/v1.9.0/mediamtx_v1.9.0_linux_arm64v8.tar.gz
mkdir -p mediamtx
tar -xvf mediamtx_v1.9.0_linux_arm64v8.tar.gz -C mediamtx
rm mediamtx_v1.9.0_linux_arm64v8.tar.gz

設定ファイルの変更(ポート競合の回避と軽量化)

展開したディレクトリに移動し、設定ファイル(mediamtx.yml)を編集します。 ここでは、他のシステムとのポート競合を防ぐためにUDPポートを変更し、今回は使用しない配信プロトコル(HLS, WebRTC, RTMP)を無効化して動作を軽くします。

cd ~/mediamtx

# RTSP用のUDPポートを8000/8001から任意のポートへ(今回は80●●/80●▼へ変更)
sed -i 's/rtpAddress: :8000/rtpAddress: :80●●/g' mediamtx.yml
sed -i 's/rtcpAddress: :8001/rtcpAddress: :80●▼/g' mediamtx.yml

# 不要なプロトコルを無効化
sed -i 's/hls: yes/hls: no/g' mediamtx.yml
sed -i 's/webrtc: yes/webrtc: no/g' mediamtx.yml
sed -i 's/rtmp: yes/rtmp: no/g' mediamtx.yml

配信の開始

準備が整ったら、実際に配信を開始します。以下の手順で実行します。

# 1. 念のため過去のプロセスをリセット(エラーが出ても無視でOK)
killall mediamtx rpicam-vid ffmpeg

# 2. MediaMTXをバックグラウンドで起動
cd ~/mediamtx
./mediamtx &

# 3. カメラ映像を取得し、MediaMTXへ流し込む
rpicam-vid -t 0 --inline --codec h264 -o - | ffmpeg -f h264 -i - -c:v copy -f rtsp rtsp://127.0.0.1:8554/cam

Point: rpicam-vidで取得したH.264の映像データを、パイプ(|)を使ってffmpegに渡し、そのままローカルのMediaMTX(ポート8554)へRTSP形式で流し込んでいます。

流し込み
こんな感じでログがドバドバ流れてきたら成功。

配信を終了する場合は、キーボードで Ctrl + C を押します。

スマホからの視聴設定(SSHトンネル)

ラズパイ内で配信されている映像(ポート8554)を、スマホに安全に引き込みます。スマホ側のターミナルアプリ(Termuxなど)を開き、以下のコマンドを実行してSSHトンネルを開通させます。

# ローカル(スマホ)の8554ポートを、ラズパイの8554ポートへ直結させる
ssh -p 22 -i /path/to/your/sshkey -L 8554:localhost:8554 user@your_pi_ip_address

(※ポート番号、鍵のパス、ユーザー名、IPアドレスは環境に合わせて書き換えてください)

VLCアプリで再生

ストアでのVLCアプリ
VLC for Android. 三角コーンが目印です。iphone版もあるはず。

スマホでVLCアプリを起動し、「ネットワークストリーム」を開いて以下のアドレスを入力します。

rtsp://127.0.0.1:8554/cam
VLCアプリで、URLを入力する場面
ここに入力すればok

次回以降

ラズパイ側(配信の開始)

ラズパイにSSH接続し、以下のコマンドを順番に実行します。

① 前回のプロセスを終了させる(念のため)

killall mediamtx rpicam-vid ffmpeg

② MediaMTX(配信サーバー)をバックグラウンドで起動する

cd ~/mediamtx
./mediamtx &

③ カメラ映像を取得してMediaMTXへ流し込む

rpicam-vid -t 0 --inline --codec h264 -o - | ffmpeg -f h264 -i - -c:v copy -f rtsp rtsp://127.0.0.1:8554/cam

スマホ側(トンネル開通と視聴)

スマホ側のターミナルアプリ(Termuxなど)とVLCアプリを操作します。

① SSHトンネルを開通させる

ターミナルアプリで以下のコマンドを実行し、ラズパイとの間に安全なトンネルを作ります。

# ローカル(スマホ)の8554ポートを、ラズパイの8554ポートへ直結させる
ssh -p 22 -i /path/to/your/sshkey -L 8554:localhost:8554 user@your_pi_ip_address

② VLCアプリで再生する

VLCアプリを起動し、「ネットワークストリーム」に以下のURLを入力して再生します。

rtsp://127.0.0.1:8554/cam
チャンネルを追加したVLCアプリのスクリーンショット
既にチャンネルを追加していた場合はこのような表示になっているはず。右のボタンを押せば、URLを入れずともすぐに映像が見れます。