Genvidで配信するゲーム動画へOBSから映像・音声をミキシングするツール郡


# Genvidによる動画配信システムにおいて、外部ソースの映像音声を使う方法
「インタラクティブなライブストリーミング」を実現するGenvid SDKにおいて、通常のゲーム配信のようにOBSを使って外部ソースと映像合成を行う際には、専用のRTMPサーバーとミキシングツールのプロセスを実行する必要があります。
忘れがちなので1記事にまとめました。

## Genvidについて
Genvidは、インタラクティブな動画ライブ配信を実現するSDKです。
https://www.genvidtech.com/ja/

Genvidはクラウドサーバー上で動かすサーバミドルウェアと、ブラウザ側で動画と同期した通信処理を行うJavaScriptライブラリで構成されています。
ゲームなどのリアルタイムコンテンツをクラウドサーバー上で動作させ、Twitchに描画結果をストリームで渡して動画としてブロードキャストします。動画の再生環境では、「動画視聴者が触れるUI」をブラウザで動画の上から重ねて表示し、そのデータをクラウドサーバーで集計し、視聴しているリアルタイムコンテンツに影響を与えます。
jsライブラリが動作できる環境であれば配信アプリやプラットフォームは問わず使用でき、主にFacebookとTwitch上で使用されています。

最近では、Facebook Gamingで配信されている『PAC-MAN COMMUNITY』のなかで、視聴者をゲームに招待できるゲーム配信者向けの機能「Play with Streamer」で使用されています。
https://www.facebook.com/fbgaminghome/blog/pac-man-community

## Genvidの配信システムで、どうやってカメラ映像を加えるのか？

Genvidをゲームで使う場合のサーバー構成図は以下になります。TwitchやYouTubeに渡す動画データはクラウドサーバー上で動作するゲームから描画して渡します。

![How It Works - JP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/b2cfa9a7-e63a-0712-c5f1-a2a68802a6d3.png)

ここで疑問として出てくるのは、ゲーム実況配信でやっているような音声の重ね合わせや演者のワイプはどうやればいいのでしょうか？
通常のゲーム実況では、演者のPCでOBSなど配信ツールを実行して、そのときカメラなどからの映像をミックスしてから動画配信サービスに渡しています。
Genvidの場合はそもそもゲームが動作するPC（図の左下の「ゲームクライアント」にあたる）にキャプチャ環境を必要としないので、このままでは別の映像ソースと組み合わせることができません。

## 映像音声のミキシングツールが同梱
結論から言うと、Genvid SDKに同梱のツールでミキシングが可能になります。
まず、OBS Studioからカメラ映像やマイク音声を渡すための「Genvid Ingest」というツールがあります。
また、Genvid Ingestで渡されてきた映像音声を加工・ミキシングするGenvid Studioというツールもあります。この2つで、従来通りのゲーム実況を行いながら、
Genvidならではのインタラクティブな体験が可能です。

## Genvid Ingest
Genvid Ingestをひとことで言えばOBSからの映像・音声ソースをGenvidの映像とミックスさせるための仕組みです。
https://www.genvidtech.com/doc/ja/SDK-1.33.1/genvid_tools_integrations/ingest/ingest.html

![ingest_timing-diag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/7a5fb205-7632-0c40-19c1-dece19c63f74.png)

「Ingest」とは動画ストリーミング配信における工程の名前で、動画を撮影してPCなどでエンコード処理を行ったあと、配信を行うサーバーにデータをアップロードする部分を指します。「ファーストマイル」とも言うようです。

Genvidでは、Genvidシステムを起動しているクラウドサーバーのなかでRTMP Ingestサーバー（Real Time Messaging Protocol）を立て、そこにPCで撮影した映像音声ソースをOBSからRTMPソースとして流し、後述するGenvid Studio上で映像合成の操作を行います。

### Genvid Ingestの設定方法
あらかじめ用意されたpythonスクリプトを実行するだけで、
Cluster UI（ブラウザで操作するGenvid設定画面）にジョブとして登録されます。
https://www.genvidtech.com/doc/ja/SDK-1.33.1/genvid_tools_integrations/ingest/ingest.html

Cluster UI上でStartを押せばRTMPサーバーが起動します。
OBS側には、このURLを渡して通常のYouTubeやTwitchに流すのと同様にストリームソースを設定します。

## Genvid Studio
Genvid Ingest経由で渡されたビデオと、Genvidがゲームなどから生成した映像をミキシングをするツールです。Genvidサーバー内の１サービスとして起動して使用します。

リアルタイムで動画・音声配信をコントロールするための設定ツールです。映像制御で言う所のコンポジションを行います。
Webツールとして構成されており、現在はChromeのみで使用できます。

Genvid Studioは、「Studio Website」と呼ばれる、ミキシングインターフェースを提供します。
https://www.genvidtech.com/doc/ja/SDK-1.33.1/genvid_tools_integrations/studio/studio.html#the-studio-website

![studio_Dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19010/d0ccef0e-b8e5-1572-f0fa-5b3d7cdbd852.png)

オーディオ、ビデオのミキサーインターフェースがwebで提供されます。また、それぞれのリアルタイム映像ソースにおいて遅延値を設定できます。
（これハードウェアで操作できるようになるんかな…）

それぞれのソースのゲインや左右バランスを個別に設定できるほか、ビデオソースを透過で重ねたり、PIP（Picture in picuture、日本語でいう所のワイプ映像）を使うこともできます。

### Genvid Studioの設定方法
まずCluster UIのSettingsタブから「Studio」の項目を選び、enable、をtrueに設定します。また「Composition」項目においてはEnableとShow monitorオプションについてもtrueにします。
これらの設定はhclファイルとして記述し、コマンド操作からロードすることもできます。

```hcl
version = "1.7.0"

settings {
   services {
      studio {
         enable = true
      }
   }
   encode {
      composition {
         enabled = true
         has_monitor = true
      }
   }
}
```
この状態で配信を開始すると、Cluster UIのJobタブでStudioのリンクがクリックできるようになります。

# その他の支援ツール
Genvid SDKには、その他も「TICKスタック」と呼ばれる時系列のデータを監視・分析する仕組み（influxdata 社のツール群Telegraf, InfluxDB, Chornograf, Kapacitorから構成される）との連携や、負荷テストツール、Genvidで配信しているオーディオ・ビデオのミキシング状況や遅延をノードで表示する「RemoteGUI」といった支援ツールが同梱されています。