GStreamer勉強会 第2回 カメラ映像をRTSPサーバーでストリーミング配信してみよう!
こんにちは!本記事は「GStreamer勉強会」シリーズの第2回です。
今回は、 PCに接続されたカメラ映像をRTSPサーバーでリアルタイム配信 してみます。
まだ第1回を読んでいない方は、先にインストール編からご覧いただくのがおすすめです!
- 第1回 : https://qiita.com/segur/items/2585dbf5a51ce7acec3b
- 第2回 : 本記事
RTSPとは
RTSPは、動画などのストリーミングを制御するために使用される通信プロトコルです。
HTTP は HTML や動画ファイルのダウンロードには適していますが、リアルタイムでの映像配信にはあまり向いていません。
RTSP(Real Time Streaming Protocol)は、そうしたリアルタイム配信に適したプロトコルです。
インストール手順
RTSP 配信には gst-rtsp-server
という追加パッケージが必要です。
WindowsとmacOSでインストール手順が異なります。
Windowsの場合
残念ながら、コマンドプロンプトやPowershellで動作する gst-rtsp-server
のビルドは存在しないようなので、MSYS2が必要になります。
MSYS2 を未インストールの場合は、以下の手順を参考にインストールしてください。
インストールが完了したら、 MSYS2 UCRT64
を起動して、以下のコマンドを入力してください。
pacman -Syu
[Y/n]
と表示されて止まっていたら、すべて y
を入力してください。
pacman -Syu
を初回に実行すると、MSYS2 のウィンドウを再起動するように指示されることがあります。
その場合は一度 MSYS2 UCRT64
を閉じて再度開き、もう一度 pacman -Syu
を実行してください。
pacman -S mingw-w64-ucrt-x86_64-gst-rtsp-server mingw-w64-ucrt-x86_64-python-gobject
こちらも [Y/n]
が表示されていたら、 y
を入力してください。
これで、 gst-rtsp-server
のインストールは完了です!
次は、実際にRTSPサーバーを立ち上げてみましょう。
macOSの場合
ターミナルで以下のコマンドを実行してください。
brew install gst-rtsp-server
加えて、Python のバインディングが必要です。
brew install pygobject3 gst-python
これで、 gst-rtsp-server
のインストールは完了です!
次は、実際にRTSPサーバーを立ち上げてみましょう。
RTSP サーバーを立ち上げる
構成図
[カメラ] → GStreamer → RTSPサーバー(ポート: 8554)→ クライアントが視聴
rtsp_server.py
の設置
以下のファイルをお好きなフォルダに設置してください。
import platform
from gi import require_version
require_version('Gst', '1.0')
require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GLib
Gst.init(None)
class MJPEGFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self):
super().__init__()
system = platform.system()
if system == "Darwin": # macOS
video_src = "avfvideosrc"
elif system == "Windows":
video_src = "ksvideosrc device-index=0"
else: # Linux など
video_src = "v4l2src device=/dev/video0"
pipeline = (
f"{video_src} ! videoconvert ! videoscale "
"! video/x-raw,width=640,height=480,framerate=15/1 "
"! jpegenc ! rtpjpegpay name=pay0 pt=96"
)
self.set_launch(pipeline)
self.set_shared(True)
server = GstRtspServer.RTSPServer()
factory = MJPEGFactory()
server.get_mount_points().add_factory("/stream", factory)
server.attach(None)
print("RTSPサーバー起動: rtsp://localhost:8554/stream")
GLib.MainLoop().run()
RTSPサーバー起動
Windowsの場合は、 MSYS2 UCRT64
を起動してください。
macOSの場合は、 ターミナル
を起動してください。
rtsp_server.py
を保存したフォルダに移動し、以下のコマンドを実行してください。
python rtsp_server.py
※Python 3.x の使用を推奨します。Python 2.x では動作しません。
macOSで複数のPython環境を使っている場合、python コマンドが正しくリンクされていない可能性があります。その場合は以下のように、Homebrew でインストールされた Python のパスを明示して実行してください。
/opt/homebrew/bin/python3 rtsp_server.py
スクリプトが成功すれば、以下の URL で配信されます!
rtsp://localhost:8554/stream
RTSPクライアントで視聴する
本当に配信されているか確認してみましょう!
別のターミナルで以下のコマンドを実行してください。
こちらは MSYS2 UCRT64
でなくても大丈夫です。
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/stream latency=100 ! decodebin ! videoconvert ! queue ! autovideosink
latency=100
は状況に応じて0〜300
程度で調整可能です。
カメラ映像が画面に表示されれば成功です!
gst-launch-1.0
がインストールされていない場合は、第1回の手順をご参照ください!
映像が表示されないときの対処法
- Zoom, OBS, Teams等の他のアプリがカメラを使用中でしたら、止めてください。
-
gst-launch-1.0
の後に-v
オプションをつけて実行すると、詳細なログが表示されます -
rtsp_server.py
のvideo_src
の設定が合っていない場合もあります。例えば Windows でカメラが複数あるときはdevice-index=1
のように番号を変更してみてください。
使用エレメントの解説
GStreamer では、エレメントと呼ばれる小さな処理単位をパイプラインでつなぎます。
エレメント | Windows | macOS | 役割 |
---|---|---|---|
ksvideosrc |
✅ | ❌ | カメラ入力(ソース)。Windows の DirectShow を使用して内蔵カメラから映像を取得します。 |
avfvideosrc |
❌ | ✅ | カメラ入力(ソース)。macOS の AVFoundation を使用して内蔵カメラから映像を取得します。 |
videoconvert |
✅ | ✅ | 映像フォーマット変換。後続エレメントが扱える形式に整えます(ピクセルフォーマットなど)。 |
videoscale |
✅ | ✅ | 映像の解像度を変更できるようにします。 |
jpegenc |
✅ | ✅ | 映像をJPEGに変換します。 |
rtpjpegpay |
✅ | ✅ | JPEG 映像を RTP パケットに分割・ペイロードします。RTSP配信用。 |
Windowsでは mfvideosrc
が ksvideosrc
より新しいGStreamerのビデオ入力プラグインですが、 mfvideosrc
は MJPEG 圧縮やRTSP 配信との相性問題が報告されているようなので、ここでは採用しませんでした。
さいごに
次回は、GStreamer を使ってカメラ映像を Unity 上でリアルタイムに表示する方法を紹介する予定です。お楽しみに!