GStreamer勉強会 第3回 RTSP配信のストリーミング映像をUnityで表示してみよう!
こんにちは!本記事は「GStreamer勉強会」シリーズの第3回です。
今回は、RTSPで配信された映像をUnity上に表示する方法を解説します。
まだ第1回を読んでいない方は、先にインストール編からご覧いただくのがおすすめです!
- 第1回 : https://qiita.com/segur/items/2585dbf5a51ce7acec3b
- 第2回 : https://qiita.com/segur/items/e88a293cf9dc49ed08ec
- 第3回 : 本記事
本記事の想定読者
UnityやC#には慣れているけれど、GStreamerやRTSPは初めてという方向け
RTSP映像をJPEGに変換してTCP送信する
残念ながらUnityは標準でRTSPを受信できません。
UnityでのRTSP受信には、AVPro Videoという高機能な有料アセットが定番として使われています。
しかし、コーデック等の制約があり、パフォーマンス調整が難しい場面もあります。
一方、GStreamerは柔軟なパイプライン構成が可能で、映像処理のチューニングがしやすいため、今回はGStreamerベースの方法を紹介します。
本記事では映像のみを対象とし、音声の扱いには対応していません。
構成図
[カメラ]
↓
[GStreamer] カメラ映像を MJPEG で RTSP 配信
↓
[GStreamer] RTSP を受信して JPEG をデコードしTCPで配信
↓
[Unity] JPEGを Texture2D に表示
GStreamer側 – MJPEGをRTSPで配信
RTSPの配信は前回と同じです。
以下のスクリプトを実行すれば、RTSPサーバーが起動して、カメラ映像の配信が開始します。
python rtsp_mjpeg_server.py
スクリプトが成功すれば、以下の URL で配信されます。
rtsp://localhost:8554/stream
うまく起動しない場合は、前回の記事をご参照ください。
TCPでJPEGストリーム送信
別のコマンドプロンプトで以下を実行すれば、RTSP配信された映像をTCPに変換してUnityへ送信できます。
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/stream latency=0 ! decodebin ! videoconvert ! videoscale ! video/x-raw,width=320,height=240 ! jpegenc ! tcpserversink host=127.0.0.1 port=5050
latency=0
は低遅延化が目的です。
データ量を削減するため、解像度を320x240にしています。
Unityで扱いやすい形式にするため、jpegenc
で各フレームをJPEG画像としてエンコードし、TCPで送信しています。
使用エレメントの解説
GStreamer では、エレメントと呼ばれる小さな処理単位をパイプラインでつなぎます。
エレメント | 役割 |
---|---|
rtspsrc |
RTSPストリームを受信するソースエレメント。ネットワーク越しにRTSP配信された映像を受信します。 |
decodebin |
入力ストリームのフォーマットを自動的に判別・デコードするエレメント。圧縮された映像・音声を生データに変換します。 |
videoconvert |
映像フォーマット変換。後続エレメントが扱える形式に整えます(ピクセルフォーマットなど)。 |
videoscale |
映像の解像度を変更できるようにします。 |
jpegenc |
映像をJPEGに変換します。 |
tcpserversink |
JPEG などのデータを TCP 経由でクライアントに送信するためのシンク(出力)エレメントです。Unity などのクライアントから直接接続できます。 |
UnityでTCPを受信する
Unityプロジェクトを開き、 Assets/_MjpegReceiver/Scripts
フォルダを作成してください。
(フォルダパスはなんでもよいのですが、以後の説明を簡単にするため、上記フォルダパスを前提にします。)
Assets/_MjpegReceiver/Scripts
フォルダの中に以下の4つのスクリプトを配置してください。
次に、 Assets/_MjpegReceiver
フォルダ直下に MjpegReceiver
という名前でシーンを作ってください。
シーン内に Quad
を設置し、名前を ScreenQuad
に変更してください(以下の図を参照)。
この ScreenQuad
に Assets/_MjpegReceiver/Scripts/MjpegReceiver.cs
をアタッチしてください。
再生すると、 ScreenQuad
に映像がリアルタイムに表示されるはずです。
もし表示されなければ
rtsp_mjpeg_server.py
や gst-launch-1.0
側の処理が止まっていないか確認してください
さいごに
以上で、GStreamer 勉強会は終了です!
RTSPで受信した映像をUnityで表示するための方法を調査した際に、まったく情報が見つからなかったため、自力で調査してみたのが勉強会のキッカケです。
もし本記事が参考になった場合は、いいねやコメントをいただけると励みになります!
おつかれさまでした!