VRChat内のビデオプレイヤーでローカルサーバー経由でリアルタイム配信を再生する方法
TopazChatを利用することでVRChat上で低遅延での配信を行うことが可能です。この仕組みを応用することで作業配信やゲームプレイ配信をゲーム内で見られたりするのですが、 専用のPrefabとのセット運用が主な部分もあり、MEROOM 939号室などに設置されているiwaSync3 メディアプレイヤーや、 UdonSharpを開発したMerlin氏によるUSharpVideoなどでは利用しづらいといった面があります。(TopazChatの提供するエンドポイントとストリームキーを組み合わせたURLを入力すれば再生は可能なはずです)
今回はToapzChatの提供する配信システムと近いものをローカルマシン上で動作させ、そのシステムを通してVRChat上で配信を行う方法について解説します。
TopazChatの仕組み
TopazChatはAWS上に配置されたWowza Streaming Engineをコアとした配信インフラが用意されており1、RTMPで配信を受け付け、 RTSPでVRChat Wrolds SDK 3に付属するVRC AVPro Video Playerコンポーネントでそれを受信、再生するといった構成となっています。 iwaSync3やUSharpVideoもLiveモードではVRC AVPro Video Playerが利用されるため、冒頭でも触れたようにURLさえ入力してしまえば再生自体は可能なはずですが、TopazChat Player内のVRC AVPro Video Playerコンポーネントでは有効なUse Low Latencyオプションが使われていないため、3秒から5秒ほどのタイムラグが生じます。
これについてはiwaSync3やUSharpVideoを改造して、Use Low Latencyオプションの切り替えができるようにすればよさそうです。
RTMPで映像ストリームを受け付けて、RTSPで配信するという部分についてはaler9/rtsp-simple-serverというソフトウェアで実現できるため、こちらを利用してローカル配信環境の構築を行います。
ローカル配信の準備
- OBS Studio
- RTMPでデスクトップ映像などを送出可能な配信ソフトウェア
- aler9/rtsp-simple-server
- RTSP/RTMPで受けてRTSP/RTMP/HLSで配信を流すことのできるGo製プロダクト
1. rtmp-simple-serverの起動
rtsp-simple-serverをダウンロードし、任意の場所に展開します。展開した場所にある rtsp-simple-server.exe
を実行すると、RTSPがTCP 8554
ポート、UDP 8000
ポート、UDP 8001
ポートで、RTMPがTCP 1935
ポートで、HLSがTCP 8888
ポートでListenされます。
この時点でRTMPで映像を送信し、RTSPで配信する機能が有効なため、TCP 8554
ポートを外部からアクセス可能なように設定します。この部分については各ユーザーのネットワーク環境に依存するため割愛しますが、Minecraftサーバーを立てる際などに行うポート開放作業と同じなので、
Googleなどで検索するといろいろと記事が見つかるのではないかと思います。もしも自分以外のユーザーの配信も受け付ける場合、追加でTCP 1935
ポートもアクセス可能なようにしてください。
2. OBSの設定
OBS Studioを起動し、設定から配信タブを開きます。
サーバーには rtmp://localhost
、ストリームキーには任意の文字列(図中では local-streaming
)を設定します。もしも他の人からの配信を受け付ける場合、サーバー部分には rtmp://<自分のIP>
を入力してもらってください。(自分のIPが 203.0.113.123
の場合、 rtmp://203.0.113.123
)
続いて出力タブを開き、エンコード設定を行います。設定内容はTopazChatでの推奨値に合わせています。
設定項目 | 設定内容 |
---|---|
エンコーダ | NVIDIA NVENC H.264 |
レート制御 | CBR |
ビットレート | 2000 |
キーフレーム間隔 | 0 |
プリセット | Max Performance |
プロファイル | high |
Look-ahead | チェック無し |
心理視覚チューニング | チェック有り |
最大Bフレーム | 0 |
NVENCを利用しない場合は以下の設定にしてください。CPUでのエンコードになります。
設定項目 | 設定内容 |
---|---|
エンコーダ | x264 |
レート制御 | CBR |
ビットレート | 2000 |
キーフレーム間隔 | 0 |
CPU使用のプリセット | veryfast |
プロファイル | high |
チューン | なし |
3. OBSでの配信開始
配信開始を押すとローカルのrtmp-simple-serverに映像が送信され始めます。ソースに画面キャプチャやウィンドウキャプチャを追加することで、デスクトップ上の内容を配信することが可能です。
4. VRChat上での視聴
iwaSync3やUSharpVideoなどの利用できるワールドで、Liveモードに切り替えた状態で rtstp://<自分のIP>:8554/<2.で設定したストリームキー>
(自分のIPが 203.0.113.123
、ストリームキーが local-streaming
の場合、 rtspt://203.0.113.123:8554/local-streaming
) をURL入力欄に入れて再生します。
先に述べたように3秒から5秒ほどのずれがありますが、デスクトップ上の映像が再生され始めます。自分のIPについてはルーターの設定画面や、診断君などのWebサービスで確認可能です。
メリットとデメリット
TopazChatではビットレート制限がありますが、ローカルサーバー経由の場合はそういった制限が無いため、画質を良くしたいなどのケースではメリットになりえます。しかし、通常のiwaSync3やUSharpVideoを利用する場合はYouTube Liveでの配信と大差ないラグとなるため、あまり大きなメリットであるとも言えません。 Use Low Latencyオプションが有効であれば、300msから500ms程度の遅延になるので、改造されたiwaSync3やUSharpVideoのあるワールドであれば優位性が出てくるかもしれません。また、YouTube Liveはアカウント作成から24時間は配信が行えないため、そういった待機時間を回避するというケースでは使えるかもしれません。
メリットかつデメリットとして、視聴者のIPアドレスが把握できるというものがあります。デフォルト設定ではログレベルが info
となっているため、サーバーのログに表示されます。こちらについてはログレベルを error
または warn
に変更することで容易には確認できないようにすることが可能です。
デメリットとして、上りの帯域幅をかなり占有し得るというものがあります。配信ビットレートが2,000 kbpsの場合、視聴者の数×2,000 kbpsの上り通信が発生するため、人数によっては50 Mbps程の通信が常に行われる可能性があります。
まとめ
VRChatでローカルサーバーを経由してリアルタイム配信を行う方法について解説しました。デフォルトオプションそのままでの運用のため無駄なポートが開いたままであるなど、細かい部分に気になる部分はありますが、短期間での運用であれば使えるケースはあると思います。
AWS上に構築する検証なども行ったので、そちらについて別記事を上げる予定です。