ラズパイ Zero2 Wで映像をSRT受信(GStreamer)
目的
本記事では、Raspberry Pi Zero 2 W を用いて、無線映像伝送(ストリーミング)をSRTというプロトコルで実装します。
UDPベースなので低遅延で受信することができます。
今回はWi-Fi上で伝送することになります。
環境
受信側:
・Raspberry Pi Zero 2 W
-OS: Raspberry Pi OS Desktop 64bit (Bookworm)
※以降、Bullseyeより最新のOSバージョンの手順です。
-GStreamer version 1.22.0
・microSDカード
・HyperPixel 4.0 - Hi-Res Display for Raspberry Pi(Non-Touch)
・ラズパイの電源関連
-Micro USBケーブル
-5V/2.5Aくらい供給できるアダプター
配信側:
・Windows 11
・OBS 31.0.3
ラズパイのデスクトップが映ることを確認
OSのインストール
Raspberry Pi Imager https://www.raspberrypi.com/software/ にてmicroSDカードにOSをインストールします。
このとき、キーボード無しリモート操作するためのカスタム設定を編集します。
SSHでラズパイの設定をするので、サービスからSSH有効化し、一般>Wi-Fiの欄にモバイルホットスポットの情報を入力します。
※Windowsの設定から、ネットワークとインターネット>モバイルホットスポットで、ネットワークプロパティを各自変更でき、これがSSIDとパスワードになります。
ファイルの編集
OSを書き込んだmicroSDカードの中身に含まれる、config.txtの最終行にエディタで以下を追記します。
dtoverlay=vc4-kms-dpi-hyperpixel4
完了したら、ラズパイにディスプレイを慎重に接続します。
Micro USBケーブルをPWR INと書いてある方に繋いで電源を入れます。
数十秒後、無事デスクトップが表示されたら完了です。
※モバイルホットスポット有効化してからでないと起動しないかも。
リモート接続
Windowsのモバイルホットスポットを有効化
Windowsの設定から、ネットワークとインターネット>モバイルホットスポットを有効化します。
ラズパイ側のVNC設定
WindowsのコマンドプロンプトからラズパイのIPアドレスにSSH接続します。
ssh username@192.168.X.X -p XXXX
※ラズパイのIPアドレスは、モバイルホットスポットの設定ページ内で確認できます。
sudo raspi-config で設定に入った後、Interfacing Options>VNC>Enableにします。
I2C,SPIが有効になっていたら無効化します。(おそらくデフォルトではOFFになっている)
SSHのポート番号も適宜変更するとよいと思います。
ラズパイを再起動してアップデートもしておきましょう。
WindowsからVNC接続
RealVNCをインストールします。
2.下部のUse RealVNC Viewer without signing inをクリック
3.上部のバーにラズパイのIPアドレスを入力して接続
4.ユーザー名とパスワードを入力しOKをクリック
ラズパイのデスクトップが表示されたら成功です。
Windows上からマウス操作等できます。
以降、VNC上から映像を確認しながら作業を進めていきます。
ラズパイ側の受信準備
今回、受信した映像を再生するのにGStreamerというマルチメディアフレームワークを使用します。
画面の回転
今回は縦型で使用します。(縁がギリギリまである短辺が下)
以下の編集で短辺の枠が薄い方を下になるように画面を回転できます。
/boot/firmware/config.txt内の
dtoverlay=vc4-kms-dpi-hyperpixel4 の行(3.2で追加した行)を
dtoverlay=vc4-kms-dpi-hyperpixel4,rotate=180
に変更して再起動します。
GStreamerインストール
SRTプラグインはplugins-badに含まれます。
sudo apt install gstreamer1.0-tools <-コマンドライン用
gstreamer1.0-plugins-base <-既に入ってる
gstreamer1.0-plugins-good <-既に入ってる
gstreamer1.0-plugins-bad <-既に入ってる
gstreamer1.0-plugins-ugly <-x264encプラグイン用
gstreamer1.0-libav <-既に入ってる
# SRTのプラグインの確認
gst-inspect-1.0 | grep srt
GStreamerの表示/SRTテスト
====表示のみテスト====
gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink
====ラズパイ内でSRT送受信テスト====
送信(Listener(サーバー)設定、先に実行しておく必要がある。)
gst-launch-1.0 videotestsrc ! videoconvert ! x264enc tune=zerolatency key-int-max=15 ! mpegtsmux ! srtserversink uri="srt://:15000"
→最後の行が0:00:00.0 / 99:99:99.で止まっていたらOK
受信(Caller設定、接続先のIPアドレスを指定)
VLCで再生もしくは、
gst-launch-1.0 -v srtclientsrc uri="srt://192.168.X.X:15000" latency=100 ! decodebin ! videoconvert ! autovideosink sync=false
※192.168.X.XはラズパイのIPアドレス
参考:SRT(Secure Reliable Transport)について色々ためす(1)
5.4 ラズパイにSRTの導入(ない場合の手動ビルド)libsrt
# aptから
sudo apt install libsrt
または、
# 依存関係
sudo apt install tclsh pkg-config cmake libssl-dev build-essential git
git clone https://github.com/Haivision/srt.git
cd srt
./configure
make
参考:
WindowsからSRT配信
Windows11からSRTにてキャプチャ映像を配信(OBSを使用)
SRT配信用OBS設定(Windows側)
こちらからOBSをインストールしてください。
OBSは、「Caller」として使用します。画面右下の「設定」→ウィンドウの左タブで「配信」→サービスに「カスタム」を指定→サーバーにラズパイのIPアドレス「srt://192.168.X.X:15000?mode=caller」
次に配信画面を設定する。
メイン画面のソースウィンドウの+→画面キャプチャ→ディスプレイを選択→OK
設定→映像から、キャンバス,スケーリングをディスプレイに合わせて480x800に調整しました。
ラズパイでSRT受信
OBS配信開始より先に、ラズパイで「Listener(サーバー)」を起動しておく。
gst-launch-1.0 -v srtserversrc uri="srt://:15000" latency=100 ! decodebin ! videoconvert ! autovideosink sync=false
※今回は、autovideosinkで自動的にxvimagesinkが選択されています。
Windowsから配信開始
OBSメイン画面→右下の「配信開始」
デフォルトの設定でざっと5秒くらいの遅延でした。
受信映像のフルスクリーン化
# ツールのインストール
sudo apt install wmctrl
別ターミナルから受信しているウィンドウの確認
wmctrl -l
ウィンドウのタイトルバーと同じ名前が表示されていたらOKです。
「gst-launch-1.0」
上記の名前を -r の後に指定して、フルスクリーン化
wmctrl -r gst-launch-1.0 -b add,fullscreen
これで見事、受信画面以外の邪魔なものがなくなりました。
フルスクリーン解除はAlt+Tabで、ターミナルに戻ってから、
wmctrl -r gst-launch-1.0 -b remove,fullscreen
最適化
現在の設定では、OBSから送信FPSを上げても30FPS程度しか出ていないことがわかります。
60FPSで送信した場合、フレームドロップなしで30FPSで表示されているのでスローモーションみたいになってしまいます。
そこでラズパイ側、OBS側の設定を変更して、FPS/画質/色味を調整していきます。
詳しくは、以下の記事をご覧ください。
以上となります。
Discussion