1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GStreamer勉強会 第3回|RTSP配信のストリーミング映像をUnityで表示してみよう!

Posted at

GStreamer勉強会 第3回 RTSP配信のストリーミング映像をUnityで表示してみよう!

こんにちは!本記事は「GStreamer勉強会」シリーズの第3回です。
今回は、RTSPで配信された映像をUnity上に表示する方法を解説します。

まだ第1回を読んでいない方は、先にインストール編からご覧いただくのがおすすめです!

本記事の想定読者

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 に変更してください(以下の図を参照)。

image.png

この ScreenQuadAssets/_MjpegReceiver/Scripts/MjpegReceiver.cs をアタッチしてください。

image.png

再生すると、 ScreenQuad に映像がリアルタイムに表示されるはずです。

もし表示されなければ

rtsp_mjpeg_server.pygst-launch-1.0 側の処理が止まっていないか確認してください

さいごに

以上で、GStreamer 勉強会は終了です!
RTSPで受信した映像をUnityで表示するための方法を調査した際に、まったく情報が見つからなかったため、自力で調査してみたのが勉強会のキッカケです。

もし本記事が参考になった場合は、いいねやコメントをいただけると励みになります!

おつかれさまでした!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?