0. 前提
新型コロナの影響で、リモートワークが増えており、配信もリモートで行う機会が増えていると思います。 本レシピでは、ビューイング配信を行う上で、リモートから全出演者が参加する場合の配信システムを構築したいと思います。 SRT という聞きなれないプロトコルを駆使することで、低遅延かつ高品質で信頼性の高いシステムを目指します。
尚、DISCORD、OBS Studio、vMix、その他配信に関する基本的な知識、PCの知識があることを前提とします。
1. 要件定義
- 出演者はクリーンフィードを視聴しながらコメントする。
- 出演者が 2 名。それぞれリモートから配信に参加し、お互いにボイスコミュニケーションが可能とする。
- 配信オペレーターは 1 名、出演者とは別の場所(スタジオ)で配信を実施する。
- 配信オペレーターからトークバックで出演者に指示を出せる。トークバックは配信には乗せないこと。
- 出演者 2 名は顔出し。それぞれから Webcam 映像(+マイク音声)を受け取って、スタジオで合成して配信する。
- 出演者 2 名に、クリーンフィードの絵音を遅延なく返す。
- 出演者 2 名は自分の配信機材を使用する。運営から特別な機材を用意しない。
2. 用意するもの
2.1. スタジオ側
- DISCORD(サーバーも)
- vMix(HD エディション以上)
- PARSEC と、PARSEC を動かす PC (出来ればキャプボ付き、無ければ NDI tools導入)
- ポートフォーワーディング可能なポート番号 2 つ
- パスワード(10 文字以上 79 文字以下)
- アップロード・ダウンロード共に 100 Mbps 以上出る光インターネット回線
2.2. 出演者側
- DISCORD
- OBS Studio
- PARSEC
- Webcam
- その他、出演者がいつも使ってる配信機材
- アップロード・ダウンロード共に 50 Mbps 以上出る光インターネット回線
3. システム図
4. SRT とは
まず、本レシピの中核をなす「SRT」というプロトコルについて説明します。
SRT とは、Secure Reliable Transport の略で、セキュアで信頼性のある伝送路を目的としたストリーミングプロトコルです。 TCP伝送(信頼性)やUDP伝送(低遅延)の良いとこ取りを目指し、エラーリカバリやパスワード保護・暗号化等の機能を追加した物で、 更に低遅延であるという特徴を有しています。
SRT は、RTMP と違ってまだまだマイナーで、対応している配信プラットフォームは 未だありません。 もう一度言います 未だ1つもありません。
「そんなもん何に使えるんや」という疑問はもっともですが、実は今回みたいな要件には結構使えるんです。 今回は、システム図で示した通り、出演者2名の自宅からスタジオまで絵音を伝送するのに使います。
SRT を使う理由は、以下の通りです。
- ストリーミング(中継)サーバーがいらない。P2P で直接 vMix へ送信できる(ポートは開ける必要あり)
- パスワード設定と暗号化が出来て安全。
- 遅延が少ないか、予測可能である。通常は 1 秒以下に収まる。
- 安定かつ伝送品質が(TS や RTMP に比べて)マシ。
- OBS Studio が対応している(重要)
SRT には、3つのモード(mode というパラメータで指定)があります。
mode | 動作 |
---|---|
caller | ストリームを送信する |
listener | ストリームを受信する |
rendezvous | ハンドシェイクによって caller となるか listener となるかが決まる |
デフォルトは caller モードになるため、送信側はパラメータを省略可能です。 今回は OBS Studio を送信側エンコーダーとして使用します。 他には下記のパラメータがあります。
パラメータ | 内容 |
---|---|
passphrase | 暗号化パスワード。10 文字以上 79 文字以下。(任意) |
latency | 遅延をマイクロ秒で指定。大きいほどパケロスに対する強度が増し、安定した伝送が可能になります。送信側、受信側双方で同じ時間を設定します。諸説有りますが vMix では少なくとも ping 値の 4 倍以上が必要とされています(例: ping 値が 30ms なら 120ms 以上にする)。デフォルトは 120ms(120000μs)です。全体の遅延は、エンコーダーとデコーダーのオーバーヘッドに依存しますが、通常は両端の latency 値を合計したよりも短い時間で収まります。 |
pbkeylen | 暗号化キーの長さ。0,16,24,32 のいずれかを指定できます。0 にすると暗号化無しになります(デフォルト)。送信側のみの設定で受信側は必要がありません。また、passphrase を使用する場合は 0 以外にしなければなりません。 |
SRT の詳細はこちらのページに分かりやすくまとまっています
5. PARSEC とは
さて、ビューイング配信では出演者が遅延なくクリーンフィードを視聴出来る環境が重要です。 その為、本レシピでは PARSEC という画面共有ツールを使用します。
PARSEC は本来、オフライン対戦(1 PC対戦)しか出来ないゲームを、インターネットを介してマルチプレイするためのソフトで、クラウドゲーミングの様に少ない遅延で画面共有しつつ、リモートからゲーミングコントローラーで操作できるという物です。今回は「少ない遅延で画面共有」という部分を、出演者がクリーンフィードを視聴するために活用します。
PARSEC がうまく機能しなかった場合は?
代用策としては、DISCORD の画面共有やその他のビデオ通話アプリがありますが、画質が悪いデメリットがあります。 DISCORD は課金してサーバーブーストを行えばある程度品質を上げられます。
その他にも代用策は有りますが、長くなるのでここでは紹介を割愛します。
6. レシピ
レシピ詳細は、以下の GitHub リポジトリにて公開しています。