1. はじめに
の記事を書いて早々ですが、トラブルシューティングの欄に書いた映像のカクつきが気になって仕方がないので、↓の記事を参考にMediaMTXとffmpegでストリーミングを高速化しました!
前の記事の4. AI Cameraのセットアップ~RTSP配信の自動実行まで 4.1. セットアップが完了したら、以降は下記の手順に従ってください。
2. 必要なソフトのインストール
ffmpegが必要なのでインストールします。
sudo apt update && sudo apt install ffmpeg
次にMediaMTXをインストールします。
# 作業ディレクトリにmediamtxディレクトリを作成します。
mkdir mediamtx && cd mediamtx
# WGET コマンドを使用してgithubからビルド済みのアーカイブファイルをダウンロードします。
# 環境とバージョンは32bit用の2024.12.22時点の最新版なので、実施時期のバージョンや自身の環境に合わせて都度読み替えてください。
wget https://github.com/bluenviron/mediamtx/releases/download/v1.10.0/mediamtx_v1.10.0_linux_armv7.tar.gz
# アーカイブを解凍します。
tar -xvzf mediamtx_v1.10.0_linux_armv7.tar.gz
3. MediaMTXの設定と配信実行
mediamtx
ディレクトリ内のmediamtx.yml
ファイルを開いて編集します。
以下、作業の続きで作業ディレクトリがmediamtx
にあるものとして続けます。
nano mediamtx.yml
mediamtx.yml
ファイルは最下部のpaths:
にstream1:
からの3行を追記します。
※post-process-file
のパスは各自の環境に合わせて修正してください。
paths:
# example:
# my_camera:
# source: rtsp://my_camera
# Settings under path "all_others" are applied to all paths that
# do not match another entry.
all_others:
stream1:
runOnInit: bash -c 'rpicam-vid -t 0 --post-process-file /home/{username}/imx500_mobilenet_ssd_annotate.json --camera 0 --codec yuv420 --width 1280 --height 720 --inline --listen -o - | ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 1280x720 -i /dev/stdin -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH'
runOnInitRestart: yes
3.1. runOnInit:
のコマンドオプション解説
-
bash -c
: 以降のコマンドをbashコマンドとして実行します-
rpicam-vid
コマンドのオプション-
-t 0
: 撮影時間を指定。0は無制限を意味します。 -
--post-process-file
: 画像処理設定を指定。指定したJSONファイルを使い、AIモデルや映像の注釈を適用します -
--camera 0
: 使用するカメラを指定。0はデフォルトのカメラ(通常は接続されたカメラモジュール)を示します -
--codec yuv420
: 使用する映像のエンコード形式を指定。この場合、YUV 4:2:0フォーマットでデータをエンコードします -
--width 1280 --height 720
: 出力映像の解像度を指定。幅1280ピクセル、高さ720ピクセル(720p HD解像度) -
--inline
: H.264データストリームにすべてのイントラフレーム情報を挿入。ストリーム途中からでも再生を可能にします -
--listen
: クライアントが接続されるまで映像出力を一時停止。接続がない場合、カメラの負荷を軽減します -
-o -
: 出力を標準出力(stdout)に送ります。この出力は次のコマンド(パイプ|以降)で処理されます。
-
-
ffmpeg
コマンドのオプション-
-f rawvideo
: 入力フォーマットを「生映像データ(Raw Video)」として指定 -
-pix_fmt yuv420p
: 入力映像のピクセルフォーマットを指定。ここではYUV 4:2:0フォーマット -
-s:v 1280x720
: 入力映像の解像度を指定。幅1280ピクセル、高さ720ピクセル -
-i /dev/stdin
: 標準入力から映像データを受け取る設定。rpicam-vidからのデータを受け取ります -
-c:v libx264
: 映像コーデックをH.264(libx264)に指定 -
-preset ultrafast
: エンコードの速度を最速に設定。遅延を最小限にするための設定 -
-tune zerolatency
: 低遅延モードを有効にする設定。リアルタイムストリーミングに適しています -
-f rtsp
: 出力形式をRTSP(Real-Time Streaming Protocol)に指定 -
rtsp://localhost:$RTSP_PORT/$MTX_PATH
: 出力先のRTSP URLを指定-
localhost
: ストリームを配信するローカルホスト -
$RTSP_PORT
: 使用するRTSPサーバーのポート番号(環境変数で指定) -
$MTX_PATH
: ストリームのパス(環境変数で指定)
-
-
-
-
runOnInitRestart: yes
: トラブルがあった際などに自動で再起動します
3.2. 配信映像の再生
VLCやMPC-HCなどからは下記のアドレスでRTSPストリームで再生できます。
相変わらずローカルネットワーク内で5秒程度の遅延はありますが、前の記事のcvlcを使うよりも格段にスムースです。
rtsp://<Raspberry PiのIPアドレス>:8554/stream1
さらに、WebRTCでも配信しています。こちらは以下のアドレスで再生できます。
こちらの方がスマホやタブレットなどで再生しやすいですし、遅延もほぼないのでオススメです。
IMX500の能力を活用しているとはいえ、非力なRaspberryPi Zero 2 Wでほぼ遅延なくAIでの物体認識ができ、結果がリモートで確認できるの、ちょっと感動です。
http://<Raspberry PiのIPアドレス>:8889/stream1/
左のディスプレイがRaspberryPi Zero 2 Wから直接HDMIで出力した映像、右のノートPCはWebRTCで配信された映像をブラウザで表示しているところです。
0.01秒刻みのストップウォッチ画面を撮影した結果では、ざっくりですがRaspberrypiでの映像処理と表示で0.15秒、更にWebRTCで配信先での表示に0.15秒、合計で0.3秒程度の遅延のようです。
4. 自動実行の設定方法
4.1. mediamtx.service
の作成
スクリプトをsystemd
サービスとして登録します。
sudo nano /etc/systemd/system/mediamtx.service
rpicam-stream.service
には以下を記述します。
[Unit]
Description=Raspberry Pi Camera MediaMTX
After=network.target
[Service]
ExecStart=/home/{username}/mediamtx/mediamtx /home/{username}/mediamtx/mediamtx.yml
[Install]
WantedBy=multi-user.target
4.2. サービスを有効化
デーモンをリロードし、作成したサービスを認識させます。
sudo systemctl daemon-reload
サービスを起動します。
sudo systemctl start mediamtx.service
上記コマンドの実行後に状態を確認します。
sudo systemctl status mediamtx.service
このようにActive: active
と表示されていれば正常に動作しています。
● mediamtx.service - Raspberry Pi Camera MediaMTX
Loaded: loaded (/etc/systemd/system/mediamtx.service; disabled; preset: enabled)
Active: active (running) since Sun 2024-12-22 13:01:31 JST; 7s ago
Main PID: 20456 (mediamtx)
Tasks: 19 (limit: 388)
CPU: 3.092s
CGroup: /system.slice/mediamtx.service
├─20456 /home/{username}/mediamtx/mediamtx /home/{username}/mediamtx/mediamtx.yml
├─20466 bash -c "rpicam-vid -t 0 --post-process-file /home/{username}/rpicam-stream/imx500_mobilenet_ssd.json --camera 0 --codec yuv420 --width 1280 >
├─20467 rpicam-vid -t 0 --post-process-file /home/{username}/rpicam-stream/imx500_mobilenet_ssd.json --camera 0 --codec yuv420 --width 1280 --height >
└─20468 ffmpeg -f rawvideo -pix_fmt yuv420p -s:v 1280x720 -i /dev/stdin -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8>
12月 22 13:01:35 pizero2 mediamtx[20467]: ------------------------------------------------------------------------------------------------------------------
12月 22 13:01:35 pizero2 mediamtx[20467]: NOTE: Loading network firmware onto the IMX500 can take several minutes, please do not close down the application.
12月 22 13:01:35 pizero2 mediamtx[20467]: ------------------------------------------------------------------------------------------------------------------
12月 22 13:01:35 pizero2 mediamtx[20467]: Reading post processing stage "object_detect_draw_cv"
12月 22 13:01:35 pizero2 mediamtx[20467]: Mode selection for 1280:720:12:P
12月 22 13:01:35 pizero2 mediamtx[20467]: SRGGB10_CSI2P,2028x1520/0 - Score: 2717.7
12月 22 13:01:35 pizero2 mediamtx[20467]: SRGGB10_CSI2P,4056x3040/0 - Score: 3604.7
12月 22 13:01:35 pizero2 mediamtx[20467]: Stream configuration adjusted
12月 22 13:01:35 pizero2 mediamtx[20467]: [1:38:38.173192486] [20467] INFO Camera camera.cpp:1197 configuring streams: (0) 1280x720-YUV420 (1) 2028x1520-SRGGB1>
サービスを停止させる(=カメラの撮影・画像認識・映像配信を止める)ときは下記のコマンドです。
sudo systemctl stop mediamtx.service
問題なければ、下記のコマンドで起動時に自動実行されるようサービスを有効にします。
再起動後、自動的にRTSP配信が開始されます。
sudo systemctl enable mediamtx.service
もし自動実行を中止するときは下記のコマンドです。
sudo systemctl disenable mediamtx.service
エラーや動作状況を確認する場合、以下のコマンドを使用してください:
journalctl -u mediamtx.service
以上です。
5. 参考