【監視カメラ×ラズパイ】ラズパイのカメラ映像をスマホから安全にストリーミング視聴する方法(MediaMTX + SSHトンネル)
Raspberry Piのカメラ映像を外出先や別室のスマホから確認したいとき、ポート開放などのセキュリティリスクを冒さずに、SSHトンネル(ポートフォワード)を使って安全にストリーミングする方法を解説します。
今回は軽量で優秀な配信サーバー MediaMTXと、ラズパイ用カメラツール rpicam-vidを使用します。
ラズパイ側の準備:ツールのインストール
まずは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アプリを起動し、「ネットワークストリーム」を開いて以下のアドレスを入力します。
rtsp://127.0.0.1:8554/cam
次回以降
ラズパイ側(配信の開始)
ラズパイに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