Vonage Video（Tokbox・Opentok） - ビデオ通信のベストプラクティス

皆さん、こんにちは。VonageのCustomer Solution Architect　アーロンです。

最近Vonage Video APIに関して面白いベストプラクティスの記事が出ましたので、紹介・補足をしたいと思います。**是非、本文も読んで下さい。[https://learn.vonage.com/blog/2021/05/24/vonage-videoのベストプラクティス/](https://learn.vonage.com/blog/2021/05/24/vonage-video%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)**

# Vonage Video APIとは
Vonage Video API（以前、Tokbox Opentokという名前で提供していました）はWebRTCで作成されたライブビデオのプラットフォームです。開発者が自分のアプリやシステムに組み込むクライアントSDKとVonage Video APIのバックエンドにおいてビデオ通話を割と簡単に実現できると思います。自分でビデオのTURN・STUNサーバを運用したり、WebRTCの中身を把握したりしなくてもビデオ通話機能をアプリに追加できると思います。



# Vonage Video APIのベストプラクティス
簡単に組み込むというものの、色々な使い方やコンフィグ・カスタマイズは可能です。デフォルトのままではビデオ通話できますが、ベストプラクティスさえ守れば、品質やユーザーエクスペリエンスの最適化ができると思います。

[本文の記事](https://learn.vonage.com/blog/2021/05/24/vonage-video%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)をそのままパクるとあれなんで、経験上一番大切なところ（又は問い合わせが多いところ→実際の開発者に聞かれていること）をサマリー・補足させて頂きます。


**下記で使う文言**
・ビデオセッション：ビデオの会議室、MTGルーム



###通信モードの選択
基本的には二つの通信モードがあります。Relayed（P2Pの通信）とRouted（Video APIバックエンド・SFU経由の通信）です。

**Relayed**：P2Pの通信（ネットワーク上純粋なP2Pが不可能な場合、TURNサーバ経由にはなりますが、SFUが利用されないため、単純な転送になります。）
以下の要件を満たす場合、Relayedモードの利用が適切です。

* レコーディングが不要
* 2〜3人の会議のみ
* 参加者間でダイレクトメディアが望ましい
* エンドツーエンドのメディアの暗号化が必要

**Routed**：SFU経由の通信。自動画像品質調整や大人数の対応ができるので、特別な理由がなければ、**こちらはオススメします**。
以下のいずれの要件があれば、利用した方が良いです。

* 3人以上の参加者
* アーカイブ（録画）が必要
* メディア品質コントロールが必要（オーディアフォールバックとビデオリカバリ）
* SIP相互接続が必要
* インタラクティブまたはライブストリーミングブロードキャストが必要



###トークンに関して
ビデオ端末がセッション（会議室）に入るための認証方法はトークンです。以下はベストプラクティスです。

* トークンを発行するサーバは、安全かつ認証されたエンドポイントの背後に設置　（*補足：トークンを発行するのはアプリのサーバ・バクエンドです。サーバもサーバレスも可能です。*）
* 参加者ごとに必ず新しいトークンを発行　（*補足：トークンの発行は計算コストが安くて、アプリのサーバ（API叩かなくても）だけで完結できます。*）
* トークンを保存または再利用しない
* デフォルトでは、トークンの有効期限は24時間となっており、接続時に確認されます。ユースケースやアプリケーションに応じて、有効期限を調整　（*補足：有効なトークンがあればセッションに入れるので、有効期限をなるべく短くした方が良いです。接続する時しか使わないので、通話時間と関係なく有効期限を短くできます。*）
* （データパラメータを使用して）トークンにユーザー名や参加者を特定できる情報を追加することができますが、個人情報は入れない　（*補足：トークン発行するとき、自由にデータパラメータを設定できます。ユーザーIDなど入れれば、トークンが使っている端末は誰か把握できます。しかし、全参加者がこのデータを見れるので、個人情報等入れない方が良いです。*）
* モデレーター、パブリッシャー、サブスクライバーなど、必要に応じてロールを設定　（*補足：トークン毎に権限付与ができます。モデレータ：会議室の管理者、パブリッシャー：発表者--自分のビデオを配信できる、サブスクライバー：閲覧者--他人のビデオが見れるが、自分のビデオを配信できない*）



###デバイスのパフォーマンス（CPU）
携帯からパソコンまで、色々なデバイスは対応しているんですが、セッションに参加する人数が多くなれば多くなるほど、デバイスのCPUやネットワークの負担が増えます。特に重いのは表示されているビデオ（のDecoding・表示）です。以下はダバイスのCPUから考えると同時に表示できる参加者の人数ですが、あくまでのガイドラインです。

* モバイル端末：4人まで表示
* ノードパソコン：10人まで表示
* デスクトップパソコン：15人まで表示

**補足**
できれば、同時にしゃべる（自分のビデオ・オーディオを配信）人数を上記にした方が良いんですが、少なくとも同時に表示される人数にしても良いと思います。例えば、モバイル端末では画面上、4人まで表示させて、残りの参加者に関して`subscribeToVideo(false);`を設定します。

そして、経験上、上記の人数は問題なくできるかと思いますが、ビデオのResolutionを減らした方が良いと思います。またモバイルの例ですが、携帯で4人のHDビデオのDecode・表示は携帯に負担がかかって、スムーズに通話ができない可能性があります。そもそも、携帯の画面が小さいので、HDビデオにする意味がないと思います。



###ブロードキャスト
Vonage Video APIは1-1も数人-Nのブロードキャストも対応しています。現在、5,000人の参加者まで対応しています。発表者が増えれば増えるほど、マックスの参加者が減りますので、詳細に関して[https://tokbox.com/developer/guides/broadcast/live-interactive-video/](https://tokbox.com/developer/guides/broadcast/live-interactive-video/)を参考してください。利用しているプロトコールはWebRTCだから、リアルタイムのビデオになります。

5,000人の参加者を超える場合、追加プロトコールとしてHLSとRTMPを対応しています。しかし、HLSとRTMPにおいて、遅延が発生するので、リアルタイムではないです。多くのお客さんは5,000人までWebRTCを使いながら、5,000人を超えるオーバーフローはHLSを使います。

**RTMP：**（Real Time Messaging Protocol）第三者のストリーミングプラットフォームと接続するプロトコルです。多くのストリーミングプラットフォーム（Youtube Live、Facebook Liveなど）が対応しています。

**HLS：**（Https Live Streaming）一般的なプロトコルで、Vonage Video APIが使っているCDN経由でビデオを見ます。

**HLS vs RTMP**

* RTMPは、RTMPデリバリプラットフォームによってサブスクライバー数が制限されているのに対して、HLSでは無制限にサポートしています。
* HLSの遅延が15-20秒なのに対して、Vonageプラットフォームを活用したRTMPの遅延は5秒です。これにはRTMPデリバリプラットフォームによる遅延は含まれていません。なぜなら、ビデオの処理方法による遅延もこれに加味されるためです。
* HLS再生機能は、全てのブラウザでサポートされているわけではありませんが、フロープレイヤーとして使用できるプラグインが用意されています。再生では、ビデオスクラブ（巻き戻し／早送り）で、ライブ配信を最初まで戻したり、現在のライブ配信に戻ったりすることができます。
* HLS/RTMPの最大継続時間は2時間に設定されています。2時間以上のブロードキャストは、最大継続時間のプロパティを変更してください（最大10時間）。
* HLS/RTMPストリームは、最後のクライアントがセッションから退出してから60秒後に自動停止します。
* *補足*：HLSは`<video>`タグやフロープレイヤーなどで視聴ができるので、アプリに組み込んだ状態で視聴できます。ということは、統一のユーザーエクスペリエンスになります。
* *補足*：RTMPは第三者のプラットフォームとの連携にはなるので、別アプリで視聴します。例えば、開発者のアプリからYouTubeに飛ばして、YouTubeで視聴します。個人的には工数をかけてアプリを開発すれば、YouTubeではなく開発したアプリでビデオを見て欲しいので、HLSは良いと思います。



###セキュリティ・コンプライアンス・プライバシー
Vonage Video APIは、最高レベルのセキュリティ基準を遵守するようにカスタマイズすることができます。VonageのプラットフォームはGDPRを遵守しており、HIPAAにも準拠しています。ヨーロッパの顧客に対しては拡張アドオンを提供しており、KBV認定（ドイツ）や安全なデータの所有と保護を目的としたその他のプライバシー法（欧州全域）など、ローカルの認証やスタンダードを遵守できるようにしています。

NDAの締結を元に、SOC2などのレポートや、Vonageのビデオプラットフォームが満たしている高度なセキュリティ基準を証明する、第三者機関によるペネトレーションテストを提供することができます。



###ビデオ通話のGithubサンプルコード
沢山のサンプルはGithubで公開しています。シンプルの単体なサンプルも、アプリケーションに近くて複雑なものもあります。以下はかなり活躍されているサンプルです。他にもあるので、[記事の本文](https://learn.vonage.com/blog/2021/05/24/vonage-video%E3%81%AE%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9/)を参考してください。

* 一般的なビデオ会議プラットフォーム： [https://github.com/opentok/opentok-rtc](https://github.com/opentok/opentok-rtc)　このコードはライブになっているので、お試しを。[https://freeconferencing.vonage.com/](https://freeconferencing.vonage.com/)
* ブロードキャスト：[https://github.com/opentok/broadcast-sample-app/](https://github.com/opentok/broadcast-sample-app/)　数人-Nをライブビデオ（WebRTC）もHLSもRTMPも対応しているサンプルです。
* 講演会やセミナー：[https://github.com/nexmo-se/townhall](https://github.com/nexmo-se/townhall)　発表者達とモデレーターの役があります。インタラクションを向上させるために、参加者をライブに持ってくる（一時的にステージに登場させて、質問・感想を伝えたりする）機能も入っています。
* DeepARを使って、背景やアバターのフィルターをビデオに加える：[https://github.com/DeepARSDK/vonage-web-js](https://github.com/DeepARSDK/vonage-web-js)
* （iOS）ビデオコールが来ると、電話と同じように携帯が鳴る：[https://github.com/opentok/CallKit](https://github.com/opentok/CallKit)