[UPDATE] Amazon IVSのS3への自動録画でrendition filteringができるようになりました!

Amazon IVSでS3にライブストリームを録画する際、特定の解像度のストリームのみを保存するrendition filteringが可能になりました。すべてのrenditionが不要な場合にストレージコストを最適化した録画が可能になります。
2023.07.20

はじめに

清水です。本エントリでお伝えするアップデート情報はこちら!AWSのマネージド型ライブストリーミングソリューションであるAmazon Interactive Video Service (Amazon IVS)で録画機能(Record to S3: R2S3)が強化され、renditionのフィルタリングができるようになりました!(2023/07/17付でAWS What's Newにポストされたアップデート情報となります。)

なお、上記AWS What's Newのポストでは、このIVS R2S3のrendition filtering機能に加え、サムネイル画像の取得間隔短縮(高頻度サムネイル)についても扱っていますが、本ブログエントリではrendition filtering機能のみを扱います。高頻度サムネイルについてのアップデートは以下エントリを参照ください。

IVSでS3に録画する際のrenditionが選択できるようになった!

IVSのS3への自動録画機能(Record to S3: R2S3)について

迅速かつ簡単に超低遅延なライブストリーミングが可能なAmazon IVS、リリース当時の2020/07/15の段階ではライブストリームの録画機能はなく、例えばAWS Elemental MediaLiveなどと連携させて録画させる必要などがありました。

このAmazon IVSにS3への自動録画機能が追加されたのが2021/04/07のことです。

それ以降もライブ入力中断時のストリームのマージ機能のサポートなど、自動録画機能に対してアップデートが行われてきました。

なおこのS3への自動録画機能(Auto-Record to Amazon S3)、IVS User GuideではR2S3(Record to S3の略と理解しています)と称されていたので、本エントリでもこちらの略称を使用していきたいと思います。(Document History - Amazon Interactive Video Serviceの今回のアップデートの箇所で記載を確認しました。)

これまでのIVS R2S3で録画されていたrenditionについて

本エントリで扱うIVS R2S3のrendition filtering機能アップデートを確認する前に、これまでのR2S3で録画されていたrenditionについて確認しておきましょう。

前提として、IVSではStreaming SoftwareなどからIVS Channel向けに打ち上げた映像を複数の解像度とビットレートに変換し、Adaptive Bitrate (ABR) Streamingとして配信します。例えばフルHD(1080p)で映像を打ち上げた場合、1080pの映像に加えて、720p、480p、360p、160pがトランスコードされ、クライアント側に適した解像度・ビットレートの映像が再生されます。この異なる解像度、ビットレートがまとまったものをABR ladderと呼び、トップレベルマニフェスト(再生の起点となるマニフェストファイル)にそのビットレート、解像度、そして対応するマニフェストファイルへのパスが記載されている、というかたちですね。(ただしこのABR StreamingはBasic Channelには適用されません。Basic Channelについては、打ち上げた映像がトランスコードされずそのままストリーミングされます。)

一つ一つの映像をrenditionと呼びます、ABR ladderでは複数のrenditionが含まれていますが、それぞれ異なる解像度、ビットレートを持つというわけですね。なおIVSのABR ladderでは同じ解像度で異なるビットレート、というrenditionはありませんがこのようなABR ladderも可能です。Apple Developerの「Examples - HTTP Live Streaming」にはこのようなABR ladderの様々な例が記載されています。またIVSのABR ladderでは同じ解像度で異なるビットレートというrenditionがない、ということから本エントリ内ではrendition=解像度、というような表現も使っています。

さて、IVSでR2S3を行うと、これまではこのABR ladderすべてのrenditionがS3に保存されていました。ライブストリーミング実施時のABRストリーミングがそのまま再現できるかたちです。

不要なrenditionは保存しない!rendition filtering

IVSでストリーミングを行ったときと同様のABR ladderが自動録画したファイルでも再現できる、という点、これはこれで良いのですが、録画したアーカイブの使用用途によってはこれが適さない場合があります。例えば録画したアーカイブは基本的にフルHD(1080p)で参照するとしましょう。この場合、720p以下の解像度のrendtionは不要となります。ほかにも、アーカイブはフルHDまでの解像度は不要、一律720pのみで良い、という場合は、720p以外のrenditionは不要です。

R2S3自体の利用に料金はかからないので不要なrenditionを保存すること自体は問題ないのですが、問題は保存先ストレージとなるS3です。不要なrenditionを保存することでストレージ使用量は増え、その分ストレージ保存の料金コストが発生します。

R2S3ではrenditionごと、フォルダ分けされて保存されているので、不要なrenditionのセグメントファイルの格納されているフォルダは削除する、ということも可能ではあるのですが、生成されているマニフェストファイル(m3u8ファイル)の修正も必須と考えます。このマニフェストファイルの対応も考えるとなかなか大変そうですよね。

今回のアップデート、rendition filteringが可能になったことで、録画する際のrendtion(解像度)を指定することができます。フルHDで映像を打ち上げて、録画先のS3ストレージコストを最適化するため例えば720pのみを録画する、ということが設定するだけで簡単にできるようになりました。

IVS R2S3のrendition filteringを使って特定の解像度のストリームだけを録画してみた

アップデート内容が確認できたところで、実際にrendition filteringを使って、特定の解像度のストリームだけを保存してみましょう。

recording configurationの作成

まずはrecording configurationの作成から進めます。IVSのマネジメントコンソール、Recording configurationsのページから[Create recording configuration]ボタンで進みます。

Setupでrecording configuration nameを入力、「Default configuration」ではなく「Custom configuration」を選択します。各設定項目が現れますので、Recorded renditionsの項目に注目しましょう。以下3種から選択可能になっています。

  • All renditions
    • すべての録画可能なrenditionsを保存(デフォルト)
  • No renditions
    • renditionsを保存しない。サムネイル画像のみを保存する場合に使用
  • Custom renditions
    • 録画するrenditionsを選択

Custom renditionsを選択します。続いて「Custom renditions」という項目が現れるので、どのrenditionsを録画するか選択します。今回はFull HD (1080p)SD (480p)を選択しました。

rendition filteringの設定ができました。なおマネジメントコンソールの注意書きの通りrendition filteringはBasic Channelには適用されず、custom renditionsが設定されたrecording configurationはBasic Channelにアタッチできません。これはBasic Channelがそもそもトランスコードを行わず、複数のrenditionを作成しないため、と理解しています。

そのほかの設定項目、Thumbnail recordingとMerge fragmented streamsはデフォルトで進めます。Storageの項目で保存先となるS3バケットを指定して[Create recording configuration]ボタンでrecording configurationを作成します。

rendition filteringを設定したrecording configurationが作成できました。

なお、動作確認用にデフォルト状態のrecording configurationも作成しておきました。以下の内容となります。

Channelを作成してライブストリーミングと自動録画を実施

recording configurationが作成できたら、そのconfigurationを使用するChannelを作成します。rendition filtering機能を有効にしたもの、無効のデフォルト状態の2つのrecording configurationを作成したので、Channelも2つ作成しました。

こちらがデフォルトのrecording configurationを使用したChannelです。

続いて、rendition filteringを設定したrecording configurationを使用したChannelです。

Channelが作成できたら、それぞれのChannelに向けて映像を打ち上げます。今回Streaming SoftwareはiPhone XS上のLarix Broadcasterを使用しました。Resolutionでは「1920x1080」、Frame rateは「30 fps」、Orientationは「Landscape」を選択します。ENCODINGの項目で、Bitrateを「8,000 Kbps」としました。Keyframe frequencyは「2 sec」に、またH.264 profileは「Main」にしています。

それぞれのChannelに向けて4分と少しの間、映像を打ち上げていました。その間、マネジメントコンソールからライブストリーミングができていることを確認します。

録画したストリームのrenditionがfilteringされていることの確認

デフォルトのrecording configurationのrenditionを確認

ライブストリーミング後に実際に録画された内容を確認してみます。まずはデフォルトのrecording configuration(rendition filtering無効)で録画したストリーミングです。録画についてのJSONメタデータファイルのうちrecording_started.jsonを確認してみましょう。録画保存に指定したS3バケットの以下のパスから辿っていきます。

  • /ivs/v1/<aws_account_id>/<channel_id>/<year>/<month>/<day>/<hours>/<minutes>/<recording_id>

JSONメタデータはこのパスのevents/に格納されます。(Auto-Record to Amazon S3 - Amazon Interactive Video Service

以下がデフォルトのrecording configurationで録画した際の実際のrecording_started.jsonです。(参照しやすいようにjqコマンドで整形をしています。)

{
  "version": "v1",
  "recording_started_at": "2023-07-18T02:22:24Z",
  "channel_arn": "arn:aws:ivs:ap-northeast-1:123456789012:channel/MzeSxxxxxxxx",
  "recording_status": "RECORDING_STARTED",
  "media": {
    "hls": {
      "path": "media/hls",
      "playlist": "master.m3u8",
      "byte_range_playlist": "byte-range-multivariant.m3u8",
      "renditions": [
        {
          "path": "360p30",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 640,
          "resolution_height": 360
        },
        {
          "path": "160p30",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 284,
          "resolution_height": 160
        },
        {
          "path": "1080p",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 1920,
          "resolution_height": 1080
        },
        {
          "path": "720p30",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 1280,
          "resolution_height": 720
        },
        {
          "path": "480p30",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 852,
          "resolution_height": 480
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolution_height": 1080,
      "resolution_width": 1920
    }
  }
}

renditionは以下の5つですね。(解像度の高い順に並べ直しています。)

  • 1080p
  • 720p30
  • 480p30
  • 360p
  • 160p

この5つのrenditionからなるABR ladderは、以前IVSのマニフェストファイルを確認した際の内容とも合致しています。(Amazon IVSのマニフェストファイルを眺めてみた | DevelopersIO)ライブストリーミングのABR ladderがすべて保存されている、という状態となりますね。

再生に必要なプレイリストファイル、master.m3u8media/hls/master.m3u8)も確認してみます。JSONメタデータファイルと同様、5つのrenditionが含まれていますね。

#EXTM3U
#EXT-X-SESSION-DATA:DATA-ID="net.live-video.content.id",VALUE="MzeSxxxxxxxx"
#EXT-X-SESSION-DATA:DATA-ID="net.live-video.customer.id",VALUE="123456789012"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="1080p",NAME="1080p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=8727600,CODECS="avc1.4D0028,mp4a.40.2",RESOLUTION=1920x1080,VIDEO="1080p"
1080p/playlist.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="720p30",NAME="720p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2406600,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=1280x720,VIDEO="720p30"
720p30/playlist.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="480p30",NAME="480p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1461599,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=852x480,VIDEO="480p30"
480p30/playlist.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="360p30",NAME="360p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=630000,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=640x360,VIDEO="360p30"
360p30/playlist.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="160p30",NAME="160p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=230000,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=284x160,VIDEO="160p30"
160p30/playlist.m3u8

デフォルトの録画設定では、フルHDで映像を打ち上げた際に5つのrendtionが保存されることが確認できました。

rendition filteringを設定して録画した内容の確認

それでは続いて、本題となるrendition filteringを設定したrecording configurationを使って録画したストリーミングについて確認してみます。

先ほどと同様、JSONメタデータファイルrecording-started.jsonを確認してみましょう。

{
  "version": "v1",
  "recording_started_at": "2023-07-18T02:27:39Z",
  "channel_arn": "arn:aws:ivs:ap-northeast-1:123456789012:channel/FUt6xxxxxxxx",
  "recording_status": "RECORDING_STARTED",
  "media": {
    "hls": {
      "path": "media/hls",
      "playlist": "master.m3u8",
      "byte_range_playlist": "byte-range-multivariant.m3u8",
      "renditions": [
        {
          "path": "480p30",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 852,
          "resolution_height": 480
        },
        {
          "path": "1080p",
          "playlist": "playlist.m3u8",
          "byte_range_playlist": "byte-range-variant.m3u8",
          "resolution_width": 1920,
          "resolution_height": 1080
        }
      ]
    },
    "thumbnails": {
      "path": "media/thumbnails",
      "resolution_height": 1080,
      "resolution_width": 1920
    }
  }
}

renditionはrecording configurationでFull HD (1080p)SD (480p)と指定した通り、以下の2つのみでした。

  • 1080p
  • 480p30

master.m3u8(media/hls/master.m3u8)にも、2つのrenditionしか記載はありませんね。

#EXTM3U
#EXT-X-SESSION-DATA:DATA-ID="net.live-video.content.id",VALUE="FUt6xxxxxxxx"
#EXT-X-SESSION-DATA:DATA-ID="net.live-video.customer.id",VALUE="123456789012"
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="1080p",NAME="1080p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=8853600,CODECS="avc1.4D0028,mp4a.40.2",RESOLUTION=1920x1080,VIDEO="1080p"
1080p/playlist.m3u8
#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="480p30",NAME="480p",AUTOSELECT=YES,DEFAULT=YES
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1461599,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=852x480,VIDEO="480p30"
480p30/playlist.m3u8

実際にS3バケット内、tsファイルが保存されているフォルダ/media/hls配下を確認してみても、1080p480p30の2つのフォルダのみです。

rendition filteringを設定することで、指定したrendition(今回であればFull HD (1080p)SD (480p))のみが録画保存されることが確認できました。

まとめ

Amazon IVSのR2S3(Record to S3、S3への自動録画機能)でrendition filteringをサポートしたアップデートについてお届けしました。不要なrenditionは保存しないという選択をすることで、保存先となるS3のストレージコストの最適化が行なえます。自動録画機能は嬉しいけれどストレージコストがかさんでしまっていたり、ストレージコストを心配して録画をしていなかった、という場合、これまでよりも安価なストレージコストで録画が可能になります。またすべてのrenditionが保存されるという条件から、Standard Channelではなくトランスコードを行わないBasic Channelを使っていた、というケースもあるかもしれません。これからはライブストリーミングは多数のrenditionからなるABR ladderで配信し、保存は単一のrenditionということも簡単に実現できます。大変うれしいアップデートだなと思いました。