every Tech Blog

株式会社エブリーのTech Blogです。

IVSを用いたライブ配信

はじめに

エブリーでソフトウェアエンジニアをしている本丸です。この記事は every Tech Blog Advent Calendar 2023 の 23 日目の記事となります。
DELISH KITCHENでは、2023年12月12日(火)にアプリ内での初めてのライブ配信を行いました。アプリ内のライブ配信では、AWSのIVS(Interactive Video Service)の低レイテンシーストリーミングを利用しています。
今回はライブ配信にIVSを使う上で、どのようなことをおこなったのかなどについてお話しできればと思います。

対象読者

  • IVSを用いたライブ配信に興味があるエンジニア

本記事の目的

  • IVSの概要を知ってもらうこと
  • IVSでライブ配信を行う上で何をしたかを知ってもらうこと

本記事の対象外

  • IVSでのライブ配信のフロントエンドの実装について
  • IVSでのリアルタイムストリーミングについて
  • IVSの具体的な設定

IVSとは

Amazon Interactive Video Service (Amazon IVS) は、低レイテンシーやリアルタイムでライブ配信を行うことができるAWSのマネージドなライブストリーミングサービスです。

また、IVSの低レイテンシーストリーミングの特徴として、AWSのドキュメントからの引用ですが、次のようなことが挙げられています。

  • チャネルを作成して数分以内にストリーミングを開始する。
  • 魅力的でインタラクティブな体験を、超低レイテンシーのライブビデオと併せて構築できる。
  • さまざまなデバイスやプラットフォーム向けに大規模に動画を配信する。
  • ウェブサイトやアプリに簡単に統合できる。

IVSがやってくれること

ライブ配信の映像に関わるところはIVSが全てやってくれると言っても過言ではないです。
従来のAWS Elemental Media Serviceでは変換・保存・配信などそれぞれのサービスが用意されていて、それを組み合わせる必要があったようですが、IVSは変換から配信まで全て行ってくれます。

今回はIVSが条件に合っていたので選択しましたが、従来のAWS Elemental Media Serviceを使うとIVSを使うよりもより細かい制御ができるなどのメリットがあるため、ユースケースによって使い分ける必要がありそうです。

また、DELISH KITCHENのライブ配信にはチャット機能が必要だったのですが、IVSにはIVS ChatというIVSに付随するマネージド型のチャット機能もありました。

自分で用意が必要なこと

どのような配信を行いたいかの仕様によって異なる部分があると思いますが、弊社の場合には下記のようなことを準備する必要がありました。

  • チャットトークンを発行するためのサーバの用意
  • リアクション機能
  • 同時接続数の表示

同時接続数やリアクション機能はIVSの機能である時間指定メタデータを使用しています。
IVSでは専用のIVS Player SDKが用意されていて、メタデータをイベントとして受け取ることができます。 フロントエンドでこのイベントと連携するアクションを実装することで、任意のタイミングで同時視聴者数の更新などを可能にしています。   https://docs.aws.amazon.com/ja_jp/ivs/latest/LowLatencyUserGuide/player.html

ブログに載せるために簡略化したものになりますが、同時接続数を取得して時間指定メタデータを送信する場合、下記のようなコードになります。
これを一定間隔で実行し、フロントエンドでそのデータを使用することで同時接続数を表示できるようになります。

func sendViewerCount() error{
  // ivsのリソースを操作するクラアント
  client := ivs.NewFromConfig(config)

    streamInput := ivs.GetStreamInput{
        ChannelArn: aws.String(in.ChannelARN),
    }
  // 配信しているチャンネルのARNからストリム情報を取得
    stream, err := client.GetStream(ctx, &streamInput)
  if err != nil {
    return err
  }

  // 送信するメタデータを作成する
  metadata := map[string]interface{}{}
  metadata["viewer_count"] = stream.ViewerCount
  jsonData, err := json.Marshal(metadata)
    if err != nil {
        return err
    }

  metadataInput := ivs.PutMetadataInput{
        ChannelArn: aws.String(channelARN),
        Metadata:   aws.String(jsonData),
    }
  // metadataを送信する
    err = client.PutMetadata(ctx, &metadataInput)
    if err != nil {
    return err
  }

  return nil
}

IVSを使って良かったこと

他のライブ配信サービスに関わったことがないため比較はできないのですが、実装のコストは低いように感じました。動画の配信はもちろんですが、同時接続数のようなライブ配信に使用する他の機能に関しても時間指定メタデータなどを用いることで比較的簡単に実装することができたと思います。
フロントエンドでIVS Player SDKを使わなければならないという制約はあるようなのですが、3秒程度の遅延で配信ができているようでした。ライブ配信中のコメントへの反応も少ない遅延で行えているようでした。

まとめ

ライブ配信にIVSを使用してみて、実装のコストも低く、実際の配信の面でも遅延が少なく便利だと感じました。
IVSを使ったライブ配信を考えている人の参考になれば幸いです。
ここまで読んでいただきありがとうございました。

参考資料