[UPDATE] Amazon IVSの新機能Multiple Hostsについてユースケースや動作の仕組みを確認してみた

複数のスマホデバイスからの映像を合成したものをライブストリーミングできるAmazon IVSの新機能Multiple Hostsについて、そのユースケースや動作の仕組み、機能を使うために必要なStageリソースなどを確認してみました。
2023.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。AWSのマネージド型ライブストリーミングソリューションであるAmazon Interactive Video Service (Amazon IVS)で複数のホストからのビデオをライブストリームのソースに統合できるMultiple Hosts機能が利用可能になりました!(2023/03/23付でポストされたアップデート情報となります。)

IVSのMultiple Hosts機能を使用することで、複数のスマホデバイスからの映像を合成したものをIVS経由でライブストリーミングすることができます。スマホデバイスではAmazon IVS Broadcast SDKで開発されたアプリだけあればよく、他に特別なアプリなどは不要です。スマホデバイスの所有者、つまりライブストリーミングへの参加者を仮想的なステージに上げてそのもようを配信するイメージであることから、このMultiple Hosts機能を使うためのリソースはStageと称されています。

このような複数のオンライン参加者からの映像を合成してライブストリーミングを行おうとした場合、Web会議ツール(Google MeetやZoom Meetingsなど)を使っていちど映像として合成して、それをライブストリーミングするという手段が取られてきました。Web会議ツールがRTMP Ingestに対応していればその機能を利用し(例えばZoom MeetingsではプランによってRTMP Ingestが可能です。ZoomミーティングをAmazon IVSでライブ配信してみた | DevelopersIO)、またWeb会議ツールの映像にさらに手を加えたいのであればOBS Stuidoなどと連携するというかたちですね。(Amazon WorkSpacesでAWS re:Invent 2020 Keynoteの副音声配信をしてみた話 #reinvent | DevelopersIO)AWSのサービスではAmazon Chime SDKのlive connector機能を使ってRTMP ingestを行うことでこれが可能でした。(Amazon Chime SDK launches live connector for streaming | Business Productivity

いろいろなやり方が考えられる複数参加者のライブストリーミングですが、参加者の管理をどうするか、また参加者に別途Web会議ツール用のスマホアプリ等を導入してもらう必要がある(参加のために必要なアプリが視聴するアプリと必ずしも同一ではない)、といった課題がありました。

IVSのMultiple Hosts機能を使えば、スマホアプリ内にこれらの機能をまとめることができ、複数参加者によるライブストリーミングがよりシンプルに実現できます。一般の視聴者がアプリ内でライブストリーミングを視聴しながら、突発的に参加者となりライブストリーミングに参加する(ステージに上る)ということがこの機能を使うことで簡単に実現可能になります。

本エントリでは、このIVSのMultiple Hosts機能についてドキュメントなどからそのユースケースや動作の仕組みを確認してみました。またStageリソースについて実際に作成して使用する雰囲気を掴んでみます。実際にMultiple Hosts機能を試すことができればよかったのですが、現在のところ使用にはAmazon IVS Broadcast SDKで開発したスマホアプリが必須であり、筆者がアプリ開発に疎くこちらに対応できなかったためこのような内容にとどまっています。

IVS Multiple Hostsのユースケース

まずはIVS Multiple Hosts機能でどのようなことができるのか、改めて確認してみましょう。AWS Media Blogからの引用となりますが、以下がわかりやすい例かと思います。

Add multiple hosts to live streams with Amazon IVS | AWS Media Blog

個人がライブストリーミングを発信したり、そのライブストリーミングを視聴できるスマホアプリを想像してみましょう。1つのデバイス(スマホ端末)からのライブストリーミング発信ができるのは当たり前ですが、ここで他のユーザ(他のスマホデバイス)がこのライブストリーミングに参加できると面白いですよね。これがIVS Multiple Hostsで可能になります。

ユースケース例として、以下の3つが挙げられています。

  1. ストリーマーが視聴者をライブストリーミングに参加させるゲストスポット(真ん中の例)
  2. ストリーマー同士が(その歌唱力など)何かしらの課題で競い合う対決モード(左の例)
  3. 複数の話者の会話を多くの視聴者に届けるグループブロードキャスト(右の例)

なお、上記ユースケース例ではスマホアプリにチャット機能も実装されていますね。ここはAmazon IVS Stream Chat機能で実現が可能です。

このMultiple Hosts機能ですが、現在のところ使用にはAmazon IVS Broadcast SDKが必要です。このSDKを使用したスマホアプリ(iOS/Android)で利用可能となるわけですね。サンプルコードとしてiOS/AndroidそれぞれのものがGitHubにて公開されています。

ドキュメントからMultiple Hostsの動作の仕組みを読み解いてみる

続いてドキュメントからこのMultiple Hostsの動作の仕組みをわかる範囲で読み解いてみます。Amazon Interactive Video Service User Guide内、新たに新設された「Enabling Multiple Hosts on an Amazon IVS Stream」の項目を確認していきましょう。

ドキュメント上のデモシナリオとしては次のようになります。Alice (A)はAmazon IVS Channelを用いてライブストリーミングをしています。その中で、Bob (B)をAliceのライブストリーミング中のStageにゲストとして招待するというかたちです。Bobが招待されると、ライブストリーミングの視聴者はAliceとBob、両方の映像をみることができます。画像の左側の状態ですね。

Add multiple hosts to live streams with Amazon IVS | AWS Media Blog

まずはAmazon IVSでStageというリソースを作成します。またこのStageリソースには、参加者トークン(Participant Token)が紐付きます。Satgeへの参加にはこの参加者トークンが必要になり、参加するユーザ(ここではAliceとBob)ごとにトークンを発行します。

続いてAmazon IVS Broadcast SDKで開発されたアプリで参加者トークンを使ってStageに参加します。まずはAliceだけがStageに参加している状態です。IVS ChannelへのRTMPS経由のブロードキャストのほか、WebRTCを使ってStageへもパブリッシュしているかたちになります。

Add multiple hosts to live streams with Amazon IVS | AWS Media Blog

続いてBobをStage上に招待します。AliceのStageに、AliceとBobの双方がデバイス上のIVS Broadcast SDK経由でWebRTC通信を行っているかたちとなります。このStage上で統合された映像をAliceのデバイスを経由してRTMPSでIVSへ打ち上げるかたちとなります。

Add multiple hosts to live streams with Amazon IVS | AWS Media Blog

Stage上の通信はWebRTCを使用するというかたちなので、AliceとBobは一般的なGoogle MeetやZoom MeetingsのようなWeb会議と同程度の遅延での疎通ができるのかと考えます。また一般の(Stageに参加しない)視聴者向けには、AliceのデバイスからRTMPSでIngestしてHLSでの配信となります。ここでの遅延は通常のIVS Channelを使ったライブストリーミング同程度となるかと考えます。

Stageリソースに対する操作を確認してみる

IVS Multiple Hosts機能について、ドキュメントからその仕組みなどを簡単ですが読み解いてみました。

続いて、このMultiple Hosts機能を使うで必要となるStageリソースについて、AWSマネジメントコンソールやAWS CLIからリソースの操作を確認してみたいと思います。なお、前述のとおりMultiple HostsはIVS Broadcast SDKの利用が前提となるため、今回はStageの使用(Multiple Hostsを使ったライブストリーミング)までは実施せず、リソースの作成などの確認にとどめます。

AWSマネジメントコンソールを使った操作

まずはマネジメントコンソールから確認してみます。Amazon IVのページに進み左側メニューを確認してみるとStagesという項目が増えていますね。

[Create stage]ボタンから進んでみます。"How Amazon IVS stages work"の項目も確認しておきましょう。

Stageリソース作成時に指定する項目はStage nameだけですね。「test-stage-1」として[Create stage]します。

Stageが作成できました。ここでも"Get started"として機能説明が表示されるので確認しておきましょう。またARNとしてarn:aws:ivs:[リージョン]:[アカウントID]:stage/[ランダムな12桁の英数字]が発行されました。

実際にStageを使用する際に必要なParticipant tokenについて、マネジメントコンソールからも発行自体は可能です。ただし開発目的のみの利用、実際に本番運用する際にはAWS SDKを利用して発行するよう記載されています。

[Create a participant tokens]ボタンから進んでみましょう。ドキュメントの例を参考に各パラメータを入力してみます。User IDとAttributesについてはすべてのステージ参加者に公開されるため、個人を特定できる情報や機密情報などは使用しないほうがよいとのことです。(「Enabling Multiple Hosts on an Amazon IVS Stream - Amazon Interactive Video Service」より)

CapabilitiesについてはPublishSubscribeの2種があります。このトークンを使用するユーザがStage上で実行できる機能をここで指定します。Session durationはこのトークンの有効期限ですね。分単位で1から20160(14日間)で指定可能です。

トークン作成後、以下のようにマネジメントコンソールにそのトークンが表示されます。しかし、画面をリロードしたり別ページに遷移したりすると表示は消えてしまいました。トークンとしては一時的な確認のみ、本来SDKで発行して、その利用者(Stage参加者)のみに知らせるものである、とうことかと考えます。

なお得られたトークンですが、ぱっと見たところJSON Web Token (JWT)のように思えました。Amazon IVSではPrivate Channel用途でもJWTを使用していることもあるので、もしやと思いjwt.io で内容をデコードしてみます。(なお、トークン自体は秘匿情報となるため取り扱いには注意しましょう。)

以下のように、PAYLOAD部分にデータとしてStageのARNやlive-video.netドメインのURLなどが格納されていることが確認できました。

AWS CLIを使った操作

StageリソースについてはAWS CLIででの操作にも対応しています。IVS Channelを操作するコマンドaws ivsとは別の、Multiple Hosts関連用のコマンドaws ivs-realtimeが準備されている点に注意しましょう。(なおIVS Chatはaws ivschatコマンドとなります。ハイフンの有無で少し混乱しそうですが気をつけておきましょう。)

また本エントリ中で直接使用はしませんが、APIとしてもIVS APIとは別にIVS Stage APIとしてまとめられています。

本エントリ中でのAWS CLI aws ivs-realtimeコマンドの利用は以下の環境で行いました。

% aws --version
aws-cli/2.11.11 Python/3.11.2 Darwin/21.6.0 exe/x86_64 prompt/off

aws ivs-realtime list-stagesまたはaws ivs-realtime get-stageでStageリソースが確認できます。現状、取得できる情報に違いはないようでした。Stageが複数ある場合、前者ではリストとして返すかたちですね。また後者は引数にStageのARNが必要です。Stageの作成はaws create-stageコマンドで行います。(実行例は省略します。)

% aws ivs-realtime list-stages
{
    "stages": [
        {
            "activeSessionId": "",
            "arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/ApRSXXXXXXXX",
            "name": "test-stage-1",
            "tags": {}
        }
    ]
}
% aws ivs-realtime get-stage \
  --arn "arn:aws:ivs:ap-northeast-1:123456789012:stage/ApRSXXXXXXXX"
{
    "stage": {
        "activeSessionId": "",
        "arn": "arn:aws:ivs:ap-northeast-1:123456789012:stage/ApRSXXXXXXXX",
        "name": "test-stage-1",
        "tags": {}
    }
}

Participant Tokeの作成はaws ivs-realtime create-participant-tokenで行います。Stage ARNが必須の引数です。

% aws ivs-realtime create-participant-token \
  --attributes "{\"displayName\": \"Bob\"}" \
  --capabilities "SUBSCRIBE" \
  --duration 5 \
  --user-id "4875935192" \
  --stage-arn "arn:aws:ivs:ap-northeast-1:123456789012:stage/ApRSXXXXXXXX"
{
    "participantToken": {
        "expirationTime": "2023-04-11T11:23:11+00:00",
        "participantId": "eYKKXXXXXXXX",
        "token": "eyJhXXXXXXXXXXXXXXXXXXXXXXXXXXQifQ.eyJlXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMyJ9.MGYCXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWHfY"
    }
}

なお、AWS CLIでもParticipant Tokenを表示するというコマンドはありません。APIにもないので、先ほどのマネジメントコンソールで確認したようにParticipant Tokenを作成して参加者のデバイスに配布すること、そしてそれ以外の場合の参照はしない、という使い方になるのかと考えます。

なおParticipant Tokeに関連するコマンドとしてはaws ivs-realtime disconnect-participantというものが用意されています。こちらは指定した参加者をStageから切断するコマンドとなります。実行にはStage ARNのほか、先のaws ivs-realtime create-participant-token実行時の返り値にあるparticipantIdが必要です。

% aws ivs-realtime disconnect-participant \
  --participant-id "eYKKXXXXXXXX" \
  --stage-arn "arn:aws:ivs:ap-northeast-1:123456789012:stage/ApRSXXXXXXXX"

IVS Multiple Hostsの制限事項や料金を確認してみる

IVS Multiple Hosts機能について、そのユースケースや動作の仕組み、そしてStageリソースに対する操作などを確認してきました。

ここではIVS Multiple Hostsの制限事項やその料金について確認してみましょう。

制限事項

まずは制限事項です。このような複数参加者の映像を統合して配信するといった場合、その参加者の最大数が気になるところかと思います。現段階では参加者の最大数は12人となっています。これはAmazon Interactive Video Service User Guideの「Enabling Multiple Hosts on an Amazon IVS Stream」のページや「Amazon IVS Service Quotas」にて確認ができます。

この参加者(Stage participants)の最大数である12については、現在のところサービスクォータの引き上げ(上限緩和)が不可である点に注意しましょう。

そのほかにStageの最大数として100という上限もありますが、こちらは引き上げ可能な項目となっています。

Amazon IVS Service Quotas - Amazon Interactive Video Service

料金

続いてIVS Multiple Hostsの料金についてです。Amazon IVSの料金ページを確認すると、Multiple Hosts機能について以下の説明があります。

For the multiple hosts feature, you pay an hourly rate for the duration each host is connected to the resource called a "stage" as a participant. For example, if four hosts are connected to the stage ("on stage") for a two-hour event, you would be billed for eight participant hours (4*2=8).

Note: If only one host is on stage using the multiple host feature, you are still charged for one participant per hour.

Amazon Interactive Video Service Pricing

参加者がStageに接続している時間で料金が発生するわけですね。この料金単価は以下のとおり$0.10/時間ということです。つまり例で挙げている2時間のイベントで4人の参加者がStageに接続しているケースだと、4(人) × 2(時間) × 0.10(USD/時間) = 0.8(USD)となる計算です。

Amazon Interactive Video Service Pricing

なおこの参加者のStage接続ごとに発生する料金のほか、実際に視聴者向けにライブストリーミングを行う場合はLive Video InputとLive Video Outputの料金が発生する点に注意しましょう。

まとめ

Amazon Interactive Video Service (Amazon IVS)の新機能Multiple Hostsについて、ドキュメントAWS Media Blogの内容などをもとに、ユースケースや動作の仕組みなどをまとめてみました。またMultiple Hostsで必要となるStageリソースについて、その作成などの操作を確認してみました。

現段階ではAmazon IVS Broadcast SDKを用いたAndroidもしくはiOS上のアプリで実行できる機能となっています。スマホデバイスでのライブストリーミングの視聴、またライブストリーミングの実施がより身近になる中で、よりシンプルに複数の参加者でのライブストリーミングを実現する非常に強力な機能だと思いました。このようなライブストリーミングへの一般視聴者の参加、スマホデバイスからの行うことが多いかとは思うのですが、ちょうどAmazon IVSではWeb Broadcast SDKを使ってWebブラウザからのストリーミングも可能です。Multiple Hosts機能がこのWeb Broadcast SDKにも対応してくれると(個人的には検証がしやすくなるので)うれしいなぁと思いました。