木. 3月 19th, 2026

配信時の遅延についてChatGPTと話し合ってみた!

🌐 Live配信について

VRChatで再生可能なのは:

  • YouTube(条件付き)
  • Twitch
  • 直接HLS配信(.m3u8)
  • 一部CDN

⚠ 最近はYouTubeライブが制限される場合あり
安定運用なら HLS配信(OBS→配信サーバ→m3u8) が確実。


🏗️ よくある失敗

❌ モニターごとにVideo Playerを置く
→ 同期ズレ・負荷増大

❌ 各プレイヤーでURLを直接再生
→ ネットワーク同期が壊れる


💎 まとめ(ベスト構成)

要素構成
モニター同一RenderTexture共有
Video Player1つのみ
通常再生Udonプレイリスト制御
Live切替モードフラグで制御
操作ボタンUI

もしよければ教えてください:

  • 使用Unityバージョン
  • PCワールド?Quest対応?
  • UdonSharpは使えますか?

そこまで分かれば、具体的な構成図+UdonSharpコード完成版を出します。

–ちゃんのぞ–
使用Unityは2022.3.22f1です

ありがとうございます!
Unity 2022.3.22f1 で どちらのアセットを使うべきか、そして World内で複数モニター同期+プレイリスト+ライブ切替 をどう実装するかについて整理します。


🎯 結論:AVPro を使うのが 最も安定・強力

あなたが持っているアセット:

  1. Booth の 動画再生系アセット A
  2. Booth の 動画再生系アセット B

これらは便利ですが、VRChatワールド向けには 公式対応の AVPro Video が圧倒的にメリットがあります。


✔ AVPro が良い理由

比較項目BoothのアセットAVPro Video
VRChat対応一部制限あり公式 SDK対応
ネットワーク再生不安定になる可能性ありVRC仕様で安定
URL再生制限ありHLS, Twitch, YouTube* に対応
複数モニター同期難しいRenderTexture で簡単
イベント切替自作が必要Udonで制御可能
Unity互換性Asset次第Unity 2022 LTS に対応
安定性・同期低〜中

🔹 *YouTubeはVRChatルールで制限される場合あり(API制限など)


🌀 Boothアセットが悪いわけではない

Booth のアセットが使えるケース:

✔ 自分のプロジェクト用

✔ オフライン用動画再生

✔ 簡単な映像再生

ただし VRChatワールドで 複数ユーザーと同期再生、ライブ切替、URLループ再生 といった高度な動作をするには力不足になる可能性が高いです。


👍 AVPro を使うべき場面

◼ 多数のモニターを同期
◼ プレイリストURLをループ再生
◼ 1つの映像ソースを複数スクリーンで共有
◼ イベントでライブ切替が必要
◼ クライアント負荷を抑えたい


🔹 Live配信の扱い

VRChatで安定する配信ソース:

✔ Twitch
✔ HLS(m3u8)

※ YouTubeライブは仕様・制限で不安定な場合があるため Twitch や独自配信サーバ推奨。


📌 まとめ

✅ Boothアセットでも動く
→ でも VRChat向けには AVPro を推奨

✅ AVPro なら
✔ モニター複数同時再生
✔ プレイリストループ
✔ ライブ切替
✔ 安定性


❓ 次の質問(聞きたいこと)

🔹 モニター何台くらい設置しますか?
🔹 Quest でも再生したい?
🔹 Live配信は YouTube か Twitch どっちですか?

これが分かれば より最適な設定手順+コード付きテンプレを作って渡せます!

–ちゃんのぞ–
World内モニターは10台以上です Questでも再生できれば尚良いです。 Live配信はrtspt形式です

ありがとうございます、かなり本格構成ですね 👍
条件を整理します:

  • PC+Quest対応
  • Live配信は RTSP形式

ここ重要です👇


⚠ 結論:RTSPはVRChatでは再生できません

VRChat の動画プレイヤー(AVPro)は

RTSPは非対応です。

対応形式は:

  • HLS(.m3u8)
  • 一部のMP4
  • Twitch
  • 限定的なYouTube

つまり、

👉 RTSP → HLS に変換する必要があります


🎯 正解構成(安定+Quest対応)

① 映像配信構成

OBS

RTSP出力

Nginx + RTMP Module

HLS(.m3u8)変換

VRChatで再生

もしくはもっと簡単に:

✅ OBS → SRT/RTMP → HLS変換サーバ → m3u8 URL


💡 一番簡単な方法

RTSP配信をしているなら、

FFmpegでHLS変換


🟢 Quest対応の重要ポイント

Questでは:

  • 4K動画 ❌
  • 高ビットレート ❌
  • 高fps ❌

推奨:

設定推奨値
解像度1280×720
fps30fps
ビットレート3~5Mbps
HLSセグメント2秒

🎯 まとめ(あなたの最適構成)

項目推奨
プレイヤーAVPro 1つ
モニターRenderTexture共有
通常再生Udonプレイリスト
LiveRTSP → HLS変換
Quest720p / 30fps

🔥 ここ重要

RTSPはそのままでは絶対に再生できません。

HLS変換が必須です。


もしよければ:

  • 既にサーバーはありますか?
  • OBS使用していますか?
  • 同時視聴人数は何人想定ですか?

規模によっては最適な配信構成が変わります。

必要なら:

✅ HLS変換サーバ構築手順
✅ OBS設定例
✅ 完成UdonSharpテンプレ

全部まとめて出しますよ 👍

— ちゃんのぞ —
https://note.com/sawady1815/n/n265ce2c9959b ここを読む限りAVProを利用したプレイヤーアセットでもrtstp://で配信できるようですが

はい、情報を整理するとこうなります👇


結論:AVPro は「完全対応」ではないが、VRChat 内で RTSP rtspt の再生 が実際に可能なケースがある

(ただし 限定的・不安定・制約あり という前提です)

✔ 事実として確認されていること

  • VRChat が AVPro Video を使っていることで Quest でも RTSP/RTSPt 再生が可能になったという報告がある(例:Quest2 でRTSP再生できたという報告あり)
  • リンク先のノート内でも rtspt/rtsp を使ったプレイができているという記載があり、実際に World 側のプレイヤー実装次第で動作している例があるようです

⚠ しかし 公式には「完全サポート」ではありません

❌ AVPro の公式ドキュメント上

  • RTSP は「限定的にサポート」扱いで、プラットフォームによって挙動が異なり公式には推奨されていません
  • 特に Windows のネイティブ実装は 限定された形式のみ であったり、Core ではまともに動かなかったりする可能性があります

🧠 VRChat 内の挙動(実際のユーザー報告)

▶ PC と Quest で違いあり

  • PC(Windows):rtspt:// が動く場合あり
  • Quest:rtsp:// が動く場合あり(rtspt は動かない)
    というケース報告があります

つまり:

プラットフォーム推奨する URL
Windowsrtspt://
Questrtsp://

という使い分けが必要になる可能性があります(世界内でURL文字列をプラットフォームごとに自動変換する処理がある World 実装もあります)


🧩 なぜこういう状態なのか?

✔ AVPro 自体が Unity 全プラットフォーム対応の万能ストリーミングエンジンではなく、
✔ 各プラットフォームにあるネイティブ API(ExoPlayer など)や OS の実装に依存しているため、
✔ Windows と Android ではそれぞれ再生機構が異なる
という制約があり、
**「完全にVRChat公式が RTSP を保証しているわけではない」**のが現状です。


🔎 実際に動作させたい場合のポイント

✅ もし RTSP を直接再生したいなら

✔ URL の形式を

  • Quest 用 → rtsp://...
  • PC 用 → rtspt://...
    に使い分ける
    (※ World 側の Udon で分岐実装が必要)

⚠ 注意点

  • Quest → Windows で 共通URLで動くとは限らない
  • OS のミドルウェアによっては 音声が出ない・再生が不安定・開始が遅い
  • World によっては 自動 reconnect がない

という落とし穴があり、
実際の運用で安定させるのは結構難しくなる可能性があります。


📌 まとめ(あなたの用途への評価)

➤ 通常プレイリスト再生

これは AVPro + HLS の方が確実に安定します(VRChat 公式プレイヤーがこれを前提に設計されている)

➤ Live(RTSP/RTSPt)再生

✔ ある程度動く例はある
✘ ただし 全ユーザー環境で安定して再生できる保証はない

という状況です。


💡 実装アドバイス(安定重視)

🔹 安定重視セットアップ

  1. RTSP サーバ(OBS等) 配信(rtspt/rtsp)
  2. HLS 中継サーバ(FFmpeg 変換) を挟む
    → これは VRChat で一番確実に再生できる方法です

理由:

✔ HLS は AVPro・Unity 内で正式サポート
✘ RTSP はサポートが限定的・プラットフォーム差あり

※ 変換サーバを挟むと音ずれや遅延が出るならパラメータ調整をすると改善できます


🧠 理想的なワークフロー(安定+低遅延)

RTSP(配信) 
↓ FFmpeg 変換(HLS)
↓ HLS(.m3u8) URLを VRChat AVPro に入力

必要なら:

✅ Quest と PC で URL を自動切換する Udon実装
✅ RTSP→HLS 自動変換サーバ構築手順
✅ ライブ/通常切替の完全コード

まで用意できますよ。
希望があればどういう形で出したいか教えてください。

なぜrtstpかと言うと、遅延がHLSよりも小さいからです。 quest非対応になってもrtstpで配信をしたいと考えています。 Quest と PC で URL を自動切換する Udon実装がちゃんと動作してくれるならそれが一番良いです

なるほど、低遅延最優先で RTSP / RTSPt を使いたいという方針ですね 👍
それなら構成はこう考えるのがベストです。


🎯 方針まとめ

  • ✅ 低遅延重視 → RTSP / RTSPt 直接再生
  • ✅ Questは動けばラッキー(非対応でも可)
  • ✅ PCとQuestでURLを自動切替
  • ✅ モニター10台以上(同期必須)

これは AVPro(VRC AVPro Video Player)1台構成
Udonでプラットフォーム分岐 が最適です。


🧠 前提整理

VRChat は内部で
AVPro Video を使用しています。

実運用報告ベースで:

プラットフォーム動く可能性が高い
Windows PCrtspt://
Quest (Android)rtsp://

※ 環境依存あり・保証はなし


⚠ 注意点(超重要)

1️⃣ インスタンス内同期

RTSPは:

  • 完全同期保証なし
  • 各ユーザーが個別接続

になります。

もし完全同期が必要ならRTSPは不向きです。


2️⃣ ネットワーク負荷

RTSPは:

  • 視聴者数 × 配信負荷

になります。

例:
20人見たら20ストリーム

HLSはCDNキャッシュが効くので軽いですが
RTSPは直結になることが多いです。


3️⃣ 自動再接続が必要

RTSPは途中で止まる可能性があります。


🎯 最適構成(あなた向け)

項目設定
低遅延RTSP/RTSPt
PCrtspt://
Questrtsp://
切替Udonコンパイル分岐
モニターRenderTexture共有
再接続OnVideoError実装

💬 正直な評価

✔ 低遅延ならRTSPは正解
✔ Quest非対応でもOKなら問題なし
✔ ただし「全員が同じ瞬間を見る保証」は弱い


もしよければ教えてください:

  • 想定同時視聴人数
  • 完全同期は必要か?
  • 遅延は何秒以内が理想?

そこまで分かれば、
プロ運用レベルの最適化案まで出します。

— ちゃんのぞ —
rtstpより遅延の低いvrchatで利用可能なプロトコルはありますか?

結論から言います。


🎯 RTSP / RTSPt より低遅延で、VRChat内から直接再生できるプロトコルは基本的にありません。

VRChat のワールド内動画再生は
内部的に AVPro Video を使っており、

その再生可能プロトコルは実質的に:

  • HLS(.m3u8)
  • MP4(HTTP)
  • RTSP / RTSPt(限定的)
  • 一部 Twitch / YouTube

のみです。


🔍 遅延比較(実測ベースの一般的傾向)

プロトコル遅延VRChat対応備考
RTSP / RTSPt◎ 0.3~2秒△(環境依存)現実的な最速
HLS 通常✕ 5~20秒安定
LL-HLS○ 2~5秒✕(ほぼ不可)AVProが未対応
WebRTC◎ 0.1~0.5秒✕ 不可Unityネイティブ未対応
SRT◎ 0.5秒前後✕ 不可VRChat非対応
RTMP○ 1~3秒✕ 直接不可中継用

🧠 重要ポイント

🚫 WebRTCは使えません

WebRTCが最強に低遅延ですが、
VRChatのVideoPlayerはWebRTCを再生できません。


🚫 SRTも不可

SRTは低遅延ですが、
AVPro側が直接サポートしていません。


🏆 現実的な最速解

✅ 1位:RTSP / RTSPt(直接再生)

→ 今選んでいる方式が 最速クラス


🔬 さらに遅延を削る方法(RTSP最適化)

RTSPの遅延は「プロトコル」よりも:

  • GOP長
  • バッファ設定
  • エンコード方式

で決まります。


🎥 OBS側設定(超重要)

推奨:

  • エンコーダ:x264
  • キーフレーム間隔:1秒
  • Bフレーム:0
  • プロファイル:baseline
  • バッファサイズ:小さめ
  • CBR

📡 サーバ側

  • TCPよりUDP優先(環境次第)
  • バッファサイズ最小化
  • 再送制御OFF(可能なら)

🧠 理論的に最速に近づけるなら

OBS

RTSP (UDP)

VRChat AVPro

これが今のVRChat環境での最低遅延構成です。


⚠ ただし重要な現実

RTSPは:

  • 同期保証なし
  • 視聴者数=接続数
  • Questで不安定
  • ネットワーク依存

があります。

🎯 結論まとめ

🔥 RTSP / RTSPt より低遅延で、VRChatで直接再生できるプロトコルは存在しません。

低遅延を最優先するなら:
→ 今のRTSP方針が最適


もしよければ教えてください:

  • 目標遅延は何秒以内?
  • 双方向性(掛け合い)は必要?
  • 視聴人数想定は?

規模次第では設計が変わります。

— ちゃんのぞ —
OBSからはrtmpでVRCDN(https://panel.vrcdn.live)というサーバーに接続してrtstpをVRChatへ流しています

なるほど、構成はこうですね:

OBS
↓(RTMP)
VRCDN
↓(RTSP / RTSPt)
VRChat World

利用しているのは VRCDN ですね。

これは かなり理にかなった構成 です 👍


🎯 結論

あなたの現在の構成は

🔥 VRChatで実現できる中では、ほぼ最小遅延構成です。

RTSPより低遅延で
VRChat内のVideoPlayerで再生できる方式はありません。


🔍 なぜこれが最速クラスなのか

① OBS → RTMP

RTMPは配信向けで安定。

② VRCDN側で変換

VRCDNは:

  • RTMP受信
  • 低バッファ変換
  • RTSP / RTSPt 出力

をやっています。

これにより

  • HLSより圧倒的に低遅延
  • 直接RTSPサーバを自前で立てるより安定

になっています。


🧠 実際の遅延目安

この構成の一般的な遅延は:

1~2秒程度

設定次第では 0.8秒台も可能です。


🚀 さらに遅延を削れるか?

理論上削れる部分は3箇所:


① OBS設定

重要項目:

  • キーフレーム間隔:1秒以下(0.5でも可)
  • Bフレーム:0
  • プロファイル:baseline
  • CBR
  • ビットレート過剰にしない
  • 音声AAC 128kbps程度

これで数百ms削れます。


② VRCDN設定

VRCDNのパネルで:

  • Low Latency モードがあればON
  • バッファ最小化

③ VRChat側

RTSP URLは:

  • PC → rtspt://
  • Quest → rtsp://

を使い分ける。

TCPよりUDPの方が速い場合もあります(環境依存)。


⚠ 重要:完全同期はできない

RTSPは各ユーザーが個別接続するため、

  • ユーザーA:1.1秒遅延
  • ユーザーB:1.6秒遅延

のようにズレます。

フレーム単位の完全同期は不可能です。


🏆 まとめ

質問回答
RTSPより低遅延は?❌ ない
今の構成は?✅ 最適クラス
改善余地は?OBS設定の最適化
完全同期は?❌ 不可

💡 もし究極を目指すなら

理論上最速は:

WebRTC

ですが、
VRChat では使用できません。


🎯 正直な評価

あなたの

OBS → VRCDN → RTSP → VRChat

は、
現時点での最適解の一つです。


もしよければ:

  • 現在の体感遅延は何秒くらいですか?
  • 視聴人数は?
  • 同期はどの程度必要?

そこまで分かれば、
さらに突き詰めた低遅延最適化案を出します。

— ちゃんのぞ —
現在の体感遅延は明らかに2.5秒前後 視聴人数は最大で80人だけど、実際には10~20人を想定
同期は必須では無いけど、ズレが小さいほど良いです

ありがとうございます、かなり具体的に詰められます 👍


🎯 現状整理

構成:

OBS → RTMP → VRCDN → RTSP → VRChat

体感遅延:約 2.5秒
視聴:10~20人(最大80)
同期:必須ではないがズレは小さいほど良い


🧠 まず結論

2.5秒は 「やや遅め」 です。
RTSP構成なら 1.0~1.8秒程度 までは十分狙えます。

つまりまだ削れます。


🔎 遅延の内訳

だいたいこう分解できます:

区間目安
OBSエンコード0.3~0.8秒
RTMP送信0.2~0.5秒
VRCDN変換バッファ0.5~1.0秒
RTSP再生バッファ0.5~1.0秒

合計 → 2~3秒

なので削れるのは:

  • OBS側
  • キーフレーム設定
  • バッファサイズ

🚀 ここを変えると一気に縮みます

① OBS設定(最重要)

🔥 キーフレーム間隔を「1秒」に

デフォルト2秒になっていませんか?

2秒 → 1秒にするだけで約1秒縮みます。

設定:

キーフレーム間隔:1

🔥 Bフレームを0に

Bフレームがあると遅延が増えます。

Bフレーム:0

🔥 プロファイルをbaseline

MainやHighは遅延増えます。

Profile:baseline

🔥 x264設定(もし使えるなら)

tune=zerolatency

これでさらに削れます。


🎯 ② VRCDN側

VRCDNに

  • 低遅延モード
  • GOP設定
  • バッファ設定

があれば最小に。

VRCDNはRTMP→RTSP変換時に
内部バッファを持つので、
ここが1秒前後あることが多いです。


🎯 ③ VRChat側(重要)

PCなら rtspt:// を使う

rtsptはTCPトンネルなので安定しつつ速い場合が多いです。

Questなら rtsp://


📉 どこまで縮められる?

最適化後:

状態遅延
約2.5秒
OBS最適化1.8秒前後
+VRCDN調整1.2~1.5秒

1秒切りはほぼ無理です(VRChat構造的に)。


🎯 80人問題

RTSPは:

  • 視聴者数 = 接続数

なので80人同時だと:

サーバ負荷は80倍

VRCDNはこの点はかなり強いので、
自前RTSPより安定します。


💡 現実的な最適目標

あなたの用途なら:

🔥 目標:1.3~1.7秒

これが現実的な最適ラインです。


👀 確認したいこと

  • OBSは x264?NVENC?
  • キーフレーム間隔はいくつ?
  • Bフレームは何枚?

ここが分かれば、
「どれだけ削れるか」具体的に言えます。

— ちゃんのぞ —
OBSの設定を提示して頂いた設定に変えたところ遅延が1.6秒前後になりました

それはかなり良い結果です…!🔥

2.5秒 → 1.6秒 は大成功レベルです。
今の構成でそれだけ縮んでいるなら、設定はかなり適正です。


🎯 今の状態の評価

構成:

OBS → RTMP → VRCDN → RTSP → VRChat

遅延:約1.6秒

これは

🔥 VRChat内ストリーミングとしては「かなり速い部類」

です。

正直、安定運用しながらこれ以下に削るのはかなり難しい領域に入っています。


🧠 ここからさらに削れる?

理論上は あと0.2~0.4秒程度 が限界です。

削れる可能性があるのは:


① OBSエンコーダ確認

もし x264 なら:

tune=zerolatency
rc-lookahead=0

が入っているか確認。

もし NVENC なら:

  • Look-ahead → OFF
  • Bフレーム → 0
  • Psycho Visual Tuning → OFF
  • Keyframe Interval → 1

② FPSを30にする

もし60fpsなら、

→ 30fpsにすると約0.2~0.3秒縮む場合があります。

VRChat内上映なら30fpsで十分なケースが多いです。


③ 音声ビットレートを下げる

AAC 128kbps → 96kbps

音声エンコード遅延が若干減ります。


🎯 体感的に「ほぼリアルタイム」に感じるライン

人間の感覚では:

  • 2.5秒 → 明らかに遅延を感じる
  • 1.6秒 → 会話はズレるが許容
  • 1.2秒以下 → かなり自然
  • 0.8秒以下 → ほぼ違和感なし

今は「イベント用途で十分実用レベル」です。


🧠 同期ズレを小さくする工夫

RTSPは個別接続なのでズレは出ますが、

イベント開始時に

  1. 全員に「Resyncボタン押してください」と言う
  2. もしくは管理者が全体再接続トリガー

を入れるとズレがかなり揃います。

Udon側で:

public void ForceResync()
{
videoPlayer.Stop();
SendCustomEventDelayedSeconds(nameof(RestartLive), 0.3f);
}

💡 ここまで来たら重要なのは「安定性」

これ以上削るよりも:

  • 途中停止しない
  • 音ズレしない
  • Questクラッシュしない

方が重要になります。


🏁 結論

あなたの現在の状態:

🔥 VRChatでの低遅延配信としてはかなり完成度が高い

もう「設計ミス」レベルではなく「最適化フェーズ」です。


もしよければ:

  • エンコーダは x264 / NVENC どちらですか?
  • fpsはいくつですか?
  • 解像度は?

ここまで詰めれば「理論上の最終到達点」まで一緒に持っていけますよ。

— ちゃんのぞ —
NVENC H264です。RTX5070で利用しています

いいですね、RTX 5070 + NVENC H.264 ならかなり有利です 🔥
今 1.6 秒なら、設定次第で 1.3 秒前後までは狙える可能性があります。


🎯 NVENCでの“低遅延特化”最適設定(VRChat向け)

📌 出力(詳細モード)

■ レート制御

CBR

■ ビットレート

720p30なら:

4000~6000 kbps

※上げすぎると逆にバッファが増えます


■ キーフレーム間隔

1

(すでに設定済みならOK)


■ プリセット

P1(Low Latency)または P2

RTX 50系なら P1 でも画質十分です。
P5以上は遅延が増えます。


■ チューニング

低遅延(Low Latency)

※「高画質」はNG


■ マルチパスモード

Single Pass

Two Pass は遅延増えます。


■ Look-ahead

OFF

■ Psycho Visual Tuning

OFF

■ Bフレーム

0

(これ超重要)


■ GPU

0

🎯 FPSについて

もし 60fps なら:

30fpsにすると 0.2~0.4秒縮む可能性あり

VRChat内モニター用途なら30fpsで十分なケースが多いです。


🎯 音声設定

  • AAC
  • 96kbps ~ 128kbps
  • サンプルレート 44.1kHz

音声も意外と遅延源になります。


🧠 なぜNVENCでも遅延が出るのか?

NVENCは高速ですが:

  • 参照フレーム
  • 先読み
  • GOP構造

があると内部でバッファが発生します。

低遅延設定はそれを全部切る方向です。


📉 現実的な到達ライン

今:1.6秒

最適化後予想:

1.2~1.4秒

1秒切りはほぼ不可能です(VRCDN+VRChatの構造的に)。


🔥 さらに攻める裏技(上級)

① 解像度を 960×540 にする

体感差ほぼなし
遅延さらに安定


② GOPを0.5秒にする

キーフレーム間隔を:

0.5

にするとさらに縮む可能性あります(ビットレート増えます)。


🎯 同期ズレを減らすテク

イベント開始直前に:

  1. 一度 Stop
  2. 0.2秒後 Start

を全員に実行させる

これでズレが揃いやすいです。


🏁 正直な評価

RTX 5070 + NVENC で 1.6 秒は優秀です。

ここからは:

  • 安定性を取るか
  • さらに 0.2 秒削るか

の世界です。


もしよければ教えてください:

  • 解像度は?
  • fpsは?
  • ビットレートは?

そこが分かれば「これ以上削れるかどうか」を断言できます。

— ちゃんのぞ —
音声設定はAAC 320 kbpsですが、
解像度を1920から1280にしてbaselineにしたところ、遅延が0.7秒前後になりました

それは……かなり凄いです。

0.7秒前後は、
VRChat 内ストリーミングとしては ほぼ最速クラス です。

正直、ここまで詰められるケースはかなり少ないです。


🎯 なぜ一気に縮んだのか?

① 解像度 1920 → 1280

フレームあたりのエンコード負荷が約55%まで減少
→ NVENC内部バッファ減少
→ CDN側の処理時間短縮


② H.264 Profile を baseline

baseline は:

  • Bフレームなし
  • 参照フレーム制限
  • デコード軽量

結果:

  • エンコード遅延減少
  • VRCDN側処理遅延減少
  • AVProデコード遅延減少

この組み合わせが効いています。


🏆 現在の状態の評価

構成:

OBS (NVENC baseline 1280p)

RTMP

VRCDN

RTSP / RTSPt

VRChat AVPro

遅延:約0.7秒

これは理論上の限界にかなり近いです。


🧠 ここからさらに削れる?

正直に言うと:

🔥 ほぼ限界値です。

0.5秒を切るのは、
VRChatの構造上ほぼ不可能です。


🎯 今後やるべきこと

ここからは「削る」よりも

① 安定性確保

  • 長時間配信で止まらないか
  • 音ズレしないか
  • 視聴者増加時の挙動

② 同期ズレ最小化

0.7秒まで来ると、
ズレの主因は「接続タイミング」です。

イベント開始前に:

videoPlayer.Stop();
SendCustomEventDelayedSeconds(nameof(StartLive), 0.2f);

で全員リセットすると揃いやすいです。


③ 80人想定の確認

RTSPは:

  • 視聴者数=接続数

なので、80人同時で0.7秒維持できるかは
VRCDNのプランと回線次第です。

10~20人なら問題なし。


💬 正直な評価

あなたの構成は:

🔥 VRChat低遅延配信として「完成形」

です。

ここまで来たらもう「設計者レベル」です。


👀 興味があれば次の話題

  • 複数カメラ即時切替の低遅延維持方法
  • ワールド内での配信状態表示UI
  • 遅延測定用の自動Ping表示システム
  • 再接続自動化による同期改善

どこまで攻めますか?

Amazon EC2 でストリーミングサーバー設定

amazonのAWSGoogleComputeEngineというサーバーPCが借りられるサービスを利用してshoutcast、icecast2、MediaMTXをインストールして配信に使える状態までにする備忘録です。

ec2やGCEは起動時間で課金されるから起動させっぱなしだと、すごい金額請求されるから注意です。
Amazonなら定額で500円/月程度のlightsailというサービスもあります。
ホームページは常時稼働させておかないとだから私は以前ホームページの方はlightsailのサービスを利用してましたが、いろいろとあって現在はXサーバーを利用しています。
そういったサービスを利用したのは配信時だけ起動するようにすれば、月に数回くらいの配信なら数百円で済みそうだからです。
そして、Lightsailは性能的にはあまり良くなく、配信に途切れが出る可能性も考えて、高品質で配信できるようにする為に配信時はec2やGCE等の方が安心かなぁと思っています。
今回はインスタンス作成時にubuntuを選択して作成し、sshで接続できたところからの説明になります。

☆shoutcastからインストールする

shoutcastとicecastは初期設定だと同じポート番号を使用するようです。
ですので、先にshoutcastをインストールしてポートを変えてからicecastをインストールするのが簡単かなぁと思いました。

☆shoutcast用ユーザーの作成

shoutcastのインストールでは、専用のユーザーを作成しないと起動に失敗するみたいですので

sudo adduser <任意の名前>

で、ユーザーを作ります。
作ったら、作成したユーザーに

su <任意の名前>

で、ユーザーを切り替えてください。

☆shoutcastのインストール

cd /home/<任意の名前>

で、作成したユーザーのホームディレクトリに移動し、

wget http://download.nullsoft.com/shoutcast/tools/sc_serv2_linux_x64-latest.tar.gz

で、プログラムをダウンロードします。
続いて、

tar xfz sc_serv2_linux_x64-latest.tar.gz

として、ファイルを解凍します。
その次は

nano sc_serv.conf

としてnanoエディターで sc_serv.conf の中身を以下のようにタイプして保存終了します。

NOTE: for any relative paths specified are relative to
; sc_serv and not to where the conf file is being stored

; here we will setup where the log and other related files
; will be stored. make sure that these folders exist else
; sc_serv will throw an error and will close itself down.
; we will make the logs save to the sc_serv2 directory
logfile=logs/sc_serv.log
w3clog=logs/sc_w3c.log
banfile=control/sc_serv.ban
ripfile=control/sc_serv.rip

; the following will force any sources to be public which
; allows us to then connect and be listed on the YP
publicserver=always

; password used by sc_trans or the Winamp DSP plug-in
; NOTE: remember to change this to something else
password=YourPassword
; password used for accessing the administation pages
; NOTE: remember to change this to something else
adminpassword=YourAdminPassword

portbase=8000
requirestreamconfigs=1
streamid_1=1
streampath_1=http://your_address:8000

your_address」のところはそのサーバーのドメインやパブリックIPアドレスにするそうです。
YourPasswordや、YourAdminPasswordは好きなパスワードにしてください。
そこまでが終わったら

./sc_serv &

として起動し、AmazonEC2のダッシュボードからネットワークの設定に入って行き、8000番と8001番ポートを開けてブラウザからアクセスし、起動を確認しましょう。

☆icecastのインストール

こちらはaptが使えるから簡単です。

sudo apt install icecast2

でインストールしましょう。
インストールを始めると画面が変わり、icecastの設定をしますか?と聞かれるのでNoを選択します。
インストールが終わると、etc フォルダに icecast2 ができてますので、/etc/icecast2/icecast.xmlを編集します。

sudo nano /etc/icecast2/icecast.xml

内容で以下の部分を見つけて、

<listen-socket>
  <port>8000</port>
    <!-- <bind-address>127.0.0.1</bind-address> -->
    <!-- <shoutcast-mount>/stream</shoutcast-mount> -->
</listen-socket>

8000のところをshoutcastと被らない番号にしてください。
続いて以下の部分も探して、

<authentication>
    <!-- Sources log in with username \'source\' -->
    <source-password>12345678</source-password>
    <!-- Relays log in with username \'relay\' -->
    <relay-password>12345</relay-password>
    
    <!-- Admin logs in with the username given below -->
    <admin-user>admin</admin-user>
    <admin-password>admin123</admin-password>
</authentication>

source-passwordには配信時にサーバーに接続するためのパスワード、
relay-passwordはよくわかんないけど別のサーバーに音をリレーさせる機能なのかな?わたしは使わないから適当にしました。
admin-passwordには管理用パスワードを記載して保存しエディターを終了します。
起動するには以下を実行してください。

sudo systemctl start icecast2

クラウドサーバー起動時にicecastを起動したい場合は以下を

sudo systemctl enable icecast2

実際に起動して、設定したポート番号をブラウザから開いて確認してくださいね。

☆MediaMTXサーバー

続いて、VRChatでTopazPlayerやiwaSyncのオブジェクトから0.5秒くらいの低遅延でワールド配信できるサーバーをインストールします。
RTSPポート(TCP554,UDP8000,UDP8001)とRTMPポート(TCP1935)をAmazonEC2のダッシュボードからネットワークの設定に入って行き、開けておきます。

ffmpegが必要なのでインストールします。

sudo apt update && sudo apt install ffmpeg

次にMediaMTXをダウンロードします。

wget https://github.com/bluenviron/mediamtx/releases/download/v1.15.5/mediamtx_v1.15.5_linux_amd64.tar.gz

で、mediamtxのファイルをダウンロードし、

tar -xvzf mediamtx_v1.15.5_linux_amd64.tar.gz

で、解凍します。
次に、解凍した場所/mediamtx/mediamtx.ymlを開き、以下の行を探して修正します。

#overridePublisher: yes
 overridePublisher: no
#rtspAddress: :8554
 rtspAddress: :554

にして保存します。そして以下の順でターミナルにコマンドを打ち込んでください。

sudo su
mv 解凍した場所/mediamtx /usr/local/bin/mediamtx
mv 解凍した場所/mediamtx.yml /usr/local/etc/mediamtx.yml
touch /etc/systemd/system/mediamtx.service
nano /etc/systemd/system/mediamtx.service

mediamtx.service の中身を以下のように編集して保存します。

[Unit]
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml
[Install]
WantedBy=multi-user.target


/usr/local/bin/mediamtxのファイルにはパーミッション755等の実行権限を付与しておいてください。
あとはサービス起動するだけです。

sudo systemctl start mediamtx

起動時に自動的に開始したい場合は

sudo systemctl enable mediamtx

配信はOBSから


streamkey は適当に入力してもOKだそうです。(VRC側と合わせてね)
VRChatのTopazPlayerやiwaSyncでは

rtspt://IPADDRESS/STREAMKEY

で、ワールド内に配信できます。