AWS Elemental MediaLiveでHLS outputのVODモードを設定してみた

AWS Elemental MediaLiveのHLS outputのVODモードについて、LIVEモードと比較しながらマニフェストファイルや動画プレイヤーでの再生時の違い、そしてアーカイブとしての活用方法などを確認してみます。
2022.02.28

はじめに

清水です。ブロードキャストグレードのライブ動画処理サービスであるAWS Elemental MediaLiveを使用してライブ動画配信を行う場合の動画のアーカイブとして、Archive output機能を使用するほか、HLS outputのVODモードを使用することが検討できます。

個人的にこのHLS outputのVODモードについて、ブログエントリなどにまとめたことがなかったので今回まとめつつ、VODモードのいろいろな確認を行ってみました。

HLS outputのLIVEモードとVODモード

MediaLiveのHLS outputを利用する際、Manifest and SegmentsのModeの箇所はデフォルトでLIVEとなっています。

これは例えば、Channel templateを使用した場合やWorkflow wizardでMediaStore (HLS output)を指定した場合も同様です。一般的なライブ配信のみを行うケースではデフォルトのLIVEモードとしておけばよいかと思います。設定項目としてはこの他にVODが選択可能です。この違いは「Info」の文字列をクリックして表示させる情報に詳しく記載があります。以下、マネジメントコンソールを日本語表記にした際のModeのInfo情報です。

"vod" の場合、すべてのセグメントがインデックス付けされ、送信先とマニフェストに永続的に保持されます。"live" の場合、keepSegments と indexNSegments で指定した番号セグメントのみが保持されます。新しいセグメントで古いセグメントが置き換わり、プレーヤーがイベントの先頭まで巻き戻されないようになります。 VOD モードでは、チャネルの実行中に EVENT の HLS EXT-X-PLAYLIST-TYPE が使用され、ストリームの完了時に "VOD" タイプのマニフェストに変換されます。

AWS Elemental MediaLive > チャネル > チャネルの作成

デフォルトのLIVEモードでライブ配信を行う場合、マニフェストファイルには最近のセグメントファイル十数個しか情報が記載されていません。またMediaLiveからみてHLS出力先のライブオリジンにもセグメントファイルは十数個しか存在せず、古いものは削除されている状況です。VODモードにするとこれらの挙動が変わるということですね。以下、実際にライブ配信を行いながらこれらの強度を確認していきます。

HLS outputのVODモードを設定する

実際にMediaLiveでHLS outputのVODモードを設定していきます。比較のため、同じChannelにLIVEモードのHLS outputも設定しました。実際の設定は先(Output groupsの1番目)にLIVEモードとしています(hls-live-mode)。こちらは出力先にMediaStoreを使用しました。

Manifest and SegmentsのModeの箇所、こちらはLIVEです。またSegment Lengthは6としています。

出力は720p、360pの2種類用意しました。解像度とコーデックをそれぞれ指定しています。

続いて、本題となるHLS outputのVODモードで出力するOutput groupです。オリジンはS3としました。CDN SettingsもこれにあわせてHLS S3を選択しています。

Manifest and SegmentsのModeの箇所でVODを選択します。Segment LengthはLIVEモードと同様に6としています。

その他、出力(2種類)と解像度、コーデックをLIVEモードと同様に設定しました。

LIVEモードとVODモードのマニフェストファイルをそれぞれ確認してみる

ライブ配信中のマニフェストファイルの確認

MediaLiveのChannelをスタートさせて、映像を打ち上げます。この状態で、LIVEモードとVODモードそれぞれのマニフェストファイルを確認してみます。まずはLIVEモードです。トップレベルマニフェストファイルから720pの実際のセグメントファイルへの記載があるマニフェストファイルを参照しました。

 % curl https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000
hls_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=30.000
hls_360p.m3u8

% curl https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:127
#EXTINF:6.00000,
hls_720p_00127.ts
#EXTINF:6.00000,
hls_720p_00128.ts
#EXTINF:6.00000,
hls_720p_00129.ts
#EXTINF:6.00000,
hls_720p_00130.ts
#EXTINF:6.00000,
hls_720p_00131.ts
#EXTINF:6.00000,
hls_720p_00132.ts
#EXTINF:6.00000,
hls_720p_00133.ts
#EXTINF:6.00000,
hls_720p_00134.ts
#EXTINF:6.00000,
hls_720p_00135.ts
#EXTINF:6.00000,
hls_720p_00136.ts

特徴として、セグメントファイル(.tsファイル)は10個のみ記載されています。上記であればhls_720p_00127.tsからhls_720p_00136.tsですね。Num Segmentsでしてした値というわけです。そしてセグメントファイルへのアクセスについても確認しましょう。こちらはKeep Segmentsで指定した21個まではアクセス可能ですが、それより以前のセグメントファイルにはアクセスができません。

% curl -I https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00115.ts
HTTP/1.1 404 Not Found
x-amzn-RequestId: VN7GJ6IFJDZ5FTHO5GHXIX7YGJEEJMI5TBRLKPHD6FDF2S2XND57ODXA6LMZQFNQLCYU5WWNW2LSODQHZ3NUILY
x-amzn-ErrorType: ObjectNotFoundException
Content-Type: application/x-amz-json-1.1
Transfer-Encoding: chunked
Date: Mon, 28 Feb 2022 07:00:26 GMT

% curl -I https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00116.ts
HTTP/1.1 200 OK
x-amzn-RequestId: QZ4AS65MSWRAK5LOMKOSSIWZNFV4GXUWKMG4ZQQOL4FNETDSVVPVON4UPJSTAKMZFIKLGOREY7TZ7VJQ5QSQQBA
Last-Modified: Mon, 28 Feb 2022 06:58:22 GMT
Cache-Control: max-age=21600
ETag: 496b920571f357c5507d2ece50e5f3f4cc3a173ab481ebae7b0e96150d1ab6fc
Content-Type: video/MP2T
Content-Length: 4045384
Date: Mon, 28 Feb 2022 07:00:27 GMT

続いてVODモードです。こちらもトップレベルマニフェストファイルから720pの実際のセグメントファイルへの記載があるマニフェストファイルを参照します。

% curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000
hls_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=30.000
hls_360p.m3u8

% curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:EVENT
#EXTINF:6.00000,
hls_720p_00001.ts
#EXTINF:6.00000,
hls_720p_00002.ts
#EXTINF:6.00000,
hls_720p_00003.ts
#EXTINF:6.00000,
hls_720p_00004.ts
#EXTINF:6.00000,
hls_720p_00005.ts
#EXTINF:6.00000,
hls_720p_00006.ts
#EXTINF:6.00000,
hls_720p_00007.ts
#EXTINF:6.00000,
hls_720p_00008.ts
#EXTINF:6.00000,
hls_720p_00009.ts
#EXTINF:6.00000,
hls_720p_00010.ts
<省略>
#EXTINF:6.00000,
hls_720p_00130.ts
#EXTINF:6.00000,
hls_720p_00131.ts
#EXTINF:6.00000,
hls_720p_00132.ts
#EXTINF:6.00000,
hls_720p_00133.ts
#EXTINF:6.00000,
hls_720p_00134.ts
#EXTINF:6.00000,
hls_720p_00135.ts
#EXTINF:6.00000,
hls_720p_00136.ts
#EXTINF:6.00000,
hls_720p_00137.ts
#EXTINF:6.00000,
hls_720p_00138.ts
#EXTINF:6.00000,
hls_720p_00139.ts
#EXTINF:6.00000,
hls_720p_00140.ts
#EXTINF:6.00000,
hls_720p_00141.ts
#EXTINF:6.00000,
hls_720p_00142.ts

途中を一部省略していますが、hls_720p_00001.tsから最新のセグメントファイル(ここではhls_720p_00142.ts)まですべてのセグメントファイルが記載されたマニフェストファイルになります。またライブオリジン側にもすべてのセグメントファイルが残っており、アクセス可能な状態です。

% curl -I https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00001.ts
HTTP/1.1 200 OK
x-amz-id-2: +KjEM2pkpHlMKiPTMEHQHV9pYKARMAv8pUlI+PlK7/qqLxrftplBVYHviPEJdqdeu3W+9kmvvYQ=
x-amz-request-id: P1SGY68Y69T9KTX2
Date: Mon, 28 Feb 2022 07:01:06 GMT
Last-Modified: Mon, 28 Feb 2022 06:46:53 GMT
ETag: "61a765b1a1e94ded889d0f8ccfe65842"
Cache-Control: max-age=21600
Accept-Ranges: bytes
Content-Type: video/MP2T
Server: AmazonS3
Content-Length: 4106860

その他LIVEモードとの違いとして、#EXT-X-MEDIA-SEQUENCEヘッダの値の違いや、#EXT-X-PLAYLIST-TYPE:EVENTヘッダの記載有無などがあります。

ライブ配信終了後のマニフェストファイルの確認

MediaLiveのStop後のマニフェストファイルも確認してみました。まずはLIVEモードです。ライブ配信中と比べるとマニフェストファイルの末尾に#EXT-X-ENDLISTがありますね。マニフェストファイル記載のセグメントファイルの数は先ほどと変わらず10個です。

% curl https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000
hls_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=30.000
hls_360p.m3u8

% curl https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:302
#EXTINF:6.00000,
hls_720p_00302.ts
#EXTINF:6.00000,
hls_720p_00303.ts
#EXTINF:6.00000,
hls_720p_00304.ts
#EXTINF:6.00000,
hls_720p_00305.ts
#EXTINF:6.00000,
hls_720p_00306.ts
#EXTINF:6.00000,
hls_720p_00307.ts
#EXTINF:6.00000,
hls_720p_00308.ts
#EXTINF:6.00000,
hls_720p_00309.ts
#EXTINF:6.00000,
hls_720p_00310.ts
#EXTINF:1.43333,
hls_720p_00311.ts
#EXT-X-ENDLIST

セグメントファイルも21個分はアクセス可能な状態で残っています。

% curl -I https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00290.ts
HTTP/1.1 404 Not Found
x-amzn-RequestId: OPA5UTCA3FDRO4M34SUJUTDFEQFVLIWOFW7MRN3OWWRCXSLARPFQP2WHM4PYTODTESLG4JJDFA76CGBNXZY5ACI
x-amzn-ErrorType: ObjectNotFoundException
Content-Type: application/x-amz-json-1.1
Transfer-Encoding: chunked
Date: Mon, 28 Feb 2022 07:20:02 GMT

% curl -I https://ze7qXXXXXXXXXX.data.mediastore.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00291.ts
HTTP/1.1 200 OK
x-amzn-RequestId: 37WUJY3PHRFWAX5KI7GVUF25F7XSNOBEBCC4BOX5RSEF3VD3ZCJAPQP32IAOQ3PSC4A4IWFZWJ7AAJD6PEUEB7I
Last-Modified: Mon, 28 Feb 2022 07:15:52 GMT
Cache-Control: max-age=21600
ETag: 5c836b47fa437f2549985a68b6532024c6b1c20eec625c3a434d21360087fe38
Content-Type: video/MP2T
Content-Length: 3971500
Date: Mon, 28 Feb 2022 07:20:04 GMT

続いてVODモードです。冒頭の#EXT-X-PLAYLIST-TYPE:EVENT#EXT-X-PLAYLIST-TYPE:VODに変わっています。またLIVEモードと同様、末尾に#EXT-X-ENDLISTが追加されています。すべてのセグメントファイルがマニフェストファイルに記載されている点、アクセス可能な点はライブ配信中と同様です。

% curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.4d401f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000
hls_720p.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=5931200,AVERAGE-BANDWIDTH=5711200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x360,FRAME-RATE=30.000
hls_360p.m3u8

% curl https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p.m3u8
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:6.00000,
hls_720p_00001.ts
#EXTINF:6.00000,
hls_720p_00002.ts
#EXTINF:6.00000,
hls_720p_00003.ts
#EXTINF:6.00000,
hls_720p_00004.ts
#EXTINF:6.00000,
hls_720p_00005.ts
#EXTINF:6.00000,
hls_720p_00006.ts
#EXTINF:6.00000,
hls_720p_00007.ts
#EXTINF:6.00000,
hls_720p_00008.ts
#EXTINF:6.00000,
hls_720p_00009.ts
#EXTINF:6.00000,
hls_720p_00010.ts
<省略>
hls_720p_00300.ts
#EXTINF:6.00000,
hls_720p_00301.ts
#EXTINF:6.00000,
hls_720p_00302.ts
#EXTINF:6.00000,
hls_720p_00303.ts
#EXTINF:6.00000,
hls_720p_00304.ts
#EXTINF:6.00000,
hls_720p_00305.ts
#EXTINF:6.00000,
hls_720p_00306.ts
#EXTINF:6.00000,
hls_720p_00307.ts
#EXTINF:6.00000,
hls_720p_00308.ts
#EXTINF:6.00000,
hls_720p_00309.ts
#EXTINF:6.00000,
hls_720p_00310.ts
#EXTINF:1.43333,
hls_720p_00311.ts
#EXT-X-ENDLIST
% curl -I https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls_720p_00001.ts
HTTP/1.1 200 OK
x-amz-id-2: hF61H9jtYUU1oNOY01EVa1BKhoJTGe/GulpiCdLov02MNQbuc7sk1qj0gt+riWaXayG1TT5OgLU=
x-amz-request-id: 2YGF3F9402NT7HTT
Date: Mon, 28 Feb 2022 07:21:23 GMT
Last-Modified: Mon, 28 Feb 2022 06:46:53 GMT
ETag: "61a765b1a1e94ded889d0f8ccfe65842"
Cache-Control: max-age=21600
Accept-Ranges: bytes
Content-Type: video/MP2T
Server: AmazonS3
Content-Length: 4106860

LIVEモードとVODモードで動画視聴に違いはあるか

LIVEモードとVODモードで違いがあるかを確認

続いてLIVEモードとVODモードのライブ配信中の視聴時に違いがあるかも確認してみたいと思います。といってもこれは動画再生環境(動画プレイヤー)によるところもあるかと思います。今回は以下2つの環境でまず確認してみました。

  • ChromeブラウザからVideoJS HTTP Streamingのサイトを使用した再生
  • macOSのSafariブラウザから直接再生(マニフェストファイルを直接参照)

なお、MediaLiveの出力先となるMediaStore/S3のマニフェストファイル、セグメントファイルをCDNを経由せず直接アクセスして確認を行っています。CORSについても適切に設定済みとなります。

結果はLIVEモードと同じように、VODモードでもライブで動画視聴ができた、となります。(そういえば、VODモードの出力先はS3でしたが問題なく視聴ができていました。結果整合性ではなく強い書き込み後の読み込み整合性がサポートされているので動作としてはライブ配信でも問題ないということとなります。あとはあとはパフォーマンスなど含めて問題ないかの検証かなと思います。)

LIVEモードのVideoJS HTTP Streamingでの再生のようすです。

続いてVODモードのVideoJS HTTP Streamingでの再生のようす、LIVEモードと同じ状態(プレイヤーのシーク部分なども含めて)であることがわかります。(今回の検証、マニフェストファイルのドメインでLIVEモードかVODモードかの区別ができます。)

LIVEモードのSafariでの再生のようすです。

同じくSafariでのVODモードでの再生です。こちらもVideoJS HTTP Streamingのときと同様、LIVEモードと同じ状態でのライブ視聴ができています。

VODモードのタイムシフト再生

マニフェストファイルの違いから、LIVEモードと同じライブでの動画視聴ができるのか気になりましたが、問題なくできるようです。そしてVODモードはマニフェストファイルに、ライブ配信開始の段階からのすべてのセグメントファイルの情報を持っている状態です。これならDVR再生(タイムシフト再生)もできるのかなと思いました。

DVR再生(タイムシフト再生)にはプレイヤー側での対応も必要です。今回は以下のブログエントリを参考にvideojs-dvrseekbarをVideo.jsプレイヤーに設定したhtmlを準備しました。これでVODモードのマニフェストファイルをsrcに指定して再生してみます。

medialive-hls-vod.html

<html>
  <head>
    <title>MediaLive HLS VOD MODE</title>
    <link href="https://vjs.zencdn.net/7.4.1/video-js.css" rel="stylesheet">
  </head>
  <body>
    <video-js id=example-video width=1280 height=720
              class="vjs-default-skin" controls>
      <source
         src="https://my-s3-bucket.s3.ap-northeast-1.amazonaws.com/medialive-hls-vod/hls.m3u8"
         type="application/x-mpegURL">

    </video-js>
    <script src="https://vjs.zencdn.net/7.4.1/video.js"></script>
    <script src="./videojs-dvrseekbar.js"></script>
    <script>
      var player = videojs('example-video');
      player.dvrseekbar();
    </script>
  </body>
</html>

ページを読み込み再生ボタンを押すとライブ配信(現時点の映像の配信)がはじまりますが、シークバーから過去にシーク可能であることがわかります。実際にシークしてみると、ライブ配信開始の段階まで任意の場所にシークが可能でした。シークバー左下の「LIVE」の文字列部分をクリックするとライブ配信(現時点の映像)に戻ります。

ライブ配信終了後のVODモードの再生

ライブ配信終了後のVODモードについても確認しておきましょう。ライブ配信開始時から終了時までの映像に対して任意の場所にシークして再生が可能です。これはまさにVOD視聴の状態と言えますね。ライブ配信後に別途VOD用のHLS素材を作成しなくても、ライブ配信を行いながらこれらのファイルを書き出せていたわけです。

VODモードの出力をアーカイブとして活用する

HLS outputのVODモード、最終的(ライブ配信終了時)にはそのままVOD用の素材として利用できることが確認できました。例えばMediaLiveのアーカイブ出力機能で書き出し、MediaConvertでVOD素材用にHLSに変換する、などしなくてもこれ(HLS outputのVODモード)をそのままVOD素材として活用する、ということが可能です。ではHLSでの配信用としてはこの構成が良さそうですが、アーカイブ用として単一のファイルにまとめたい、といった場合はどうでしょうか。

HLS形式で素材が準備されているので、MediaConvertのHLS input機能を使用するとそのままMediaConvertの入力として使用することができます。MediaConvertのHLS inputは2021年4月1日にアップデートされた機能になります。

念のためHLS inputの要件にあうかどうかの確認は必要ですが、本エントリであつかったHLS outputのVODモードの素材では問題なくMediaConvertのInputとすることができました。出力としてはSystem PresetSystem-Generic_Hd_Mp4_Avc_Aac_16x9_Sdr_1280x720p_30Hz_5Mbps_Qvbr_Vq9を使って単一のmp4ファイルとしています。

MediaConvertのStitching機能を使ってIn/Outを指定、必要な部分のみ切り出した単一アーカイブファイルの作成もできますね。

まとめ

AWS Elemental MediaLiveのHLS outputのVODモードについて、LIVEモードと比較しながらマニフェストファイルや動画プレイヤーでの再生時の違いなどを確認してみました。ライブ配信終了後にHLSファイル一式がVOD素材としてそのまま利用できる点が「VODモード」の名前そのものですが、ライブ配信中にもタイムシフト再生などセグメントファイルが残っていることを活かした活用ができそうですね。また個人的にはMediaConvertのHLS inputがサポートされたことにより、このHLS output VODモードの活用の幅が広がっているのではないかと考えています。