初めに
MediaMTXを使ってVRChat上で友人と画面共有をするために、実際に詰まったポイントをまとめた備忘録です。
手順そのものよりも、「どこでハマるか」「どこを先に決めておくべきか」を残すことを目的にしています。
この記事の対象となる人
- Windows環境で試したい人
- OBSの基本的な設定ができる人
- ポート開放や外部公開の基礎を理解している人
- VRChat側でRTSP配信を受けたい人
先に結論
構成はシンプルです。
- Windows上で
MediaMTXを動かす -
OBSで画面キャプチャとエンコードを行う -
OBSからMediaMTXに配信する -
VRChat側ではRTSPで受信する
ただし、実際には以下がハマりどころでした。
-
OBSで認証をする場合は認証情報はOBSにあるユーザー名とパスワードの欄ではなくストリームキーとして渡す必要がある -
VRChatで安定して受信するには、MediaMTX側でRTSP over TCPに固定しておく - 視聴側は認証に対応していない
構成
今回の構成は次の通りです。
- 配信PC: Windows
- 配信ソフト: OBS
- 配信サーバー: MediaMTX
- 視聴側: VRChatの
IwaSyncやYamaPlayer - 配信先: 外部公開したローカルの
RTSP(MediaMTX)サーバー
流れとしては、OBS から MediaMTX へ送信し、VRChat 側のプレイヤーで rtsp://example-domain.example:8554/live を読む形です。
ここで使っている live は固定名ではなく、任意の文字列にできます。
ただし、パス名を変更した場合は OBS のストリームキーに含めるパスも同じ名前に変更する必要があります。
ポートについて
今回の構成では、通信経路ごとに開けるポートを先に整理しておくのが重要でした。
-
UDPを使わない場合は、TCP 8554だけでよい -
HLSを使う場合は、TCP 8888も公開する -
HLSを使う場合の再生URLはhttp://example-domain.example:8888/live/index.m3u8
VRChat 側で RTSP over TCP を使う前提なら、まずは 8554/TCP を基準に考えるとわかりやすいです。
もし HLS も併用するなら、追加で 8888/TCP を開ける必要があります。
ここで使っている live も任意の文字列に置き換えられます。
MediaMTXの準備
MediaMTX は GitHub からダウンロードして解凍しました。
実行ファイルを置いて起動し、設定ファイルを編集します。
今回触ったのは authInternalUsers と rtspTransports です。
まず、RTSPの通信方式をTCPに固定します。
rtspTransports: [tcp]
デフォルトでは udp や multicast も含まれますが、VRChat側で安定して受信するためにTCPのみへ制限しました。
次に、認証設定を変更します。
authInternalUsers:
- user: example-user
pass: example-password
ips: ["127.0.0.1", "::1"]
permissions:
- action: publish
path:
- action: read
path:
- action: playback
path:
- user: any
pass:
ips: []
permissions:
- action: read
path:
- action: playback
path:
この設定の意図は次の通りです。
-
example-userはローカルからのpublishを許可する -
anyは視聴用のreadとplaybackを許可する - 視聴側に認証を求めない
認証を必要とするのは OBS からの送信側だけです。
OBSの設定
OBS の役割は画面キャプチャとエンコードです。
配信先はローカルで動かす前提なので、サーバーはループバックアドレスを使いました。
- サーバー:
rtmp://127.0.0.1 - ストリームキー:
live?user=example-user&pass=example-password
ここが最初のハマりポイントでした。
OBS の配信設定では、認証情報をストリームキーとして渡す必要があります。
つまり、単純にURLだけ入れればよいわけではなく、user と pass をクエリとして持たせる形にします。
VRChat側の受信
VRChat側では IwaSync や YamaPlayer を使って受信しました。
このときのURLは次の形式です。
rtsp://example-domain.example:8554/live
または
rtsp://自宅のIPアドレス:8554/live
ここで重要なのは、VRChat側ではRTSPをTCPで受ける前提にすることです。
URLスキームは rtsp:// のままにして、MediaMTX側の rtspTransports を tcp のみに制限します。
ハマりポイント
今回の詰まりどころは主に3つでした。
1. OBSの認証情報の渡し方
OBS の配信設定では、認証情報をストリームキーに含める必要があります。
ここをOBSのユーザー名・パスワード欄に入力しても MediaMTX に正しく届きません。
2. VRChatではRTSP over TCPを前提にする
VRChat 側のプレイヤーは TCP 前提です。
MediaMTX側をTCP固定にしたうえで、受信側のURLは rtsp://... を使います。
ローカルループバックアドレスやNICに割り当てられたアドレスへの接続だとUDPで繋がるのに、ヘアピンNATや外部への接続だと繋がらないことがありました。
私はここで1日くらい悩みました。
3. 視聴側の認証は考えない
視聴側に認証を持たせようとすると、VRChat 側の受信と噛み合いません。
今回の方針では、認証は配信側だけに寄せて、視聴側はそのまま読めるようにしました。
まとめ
MediaMTX と OBS と VRChat を組み合わせると、外部公開した RTSP 配信をVRChat上で共有できます。