
2020年4月入社の Hary です。
今回は動画ライブストリーミング配信の話をさせて頂きます。
要点
結論だけ知りたい人はここを読めば大体分かります。
HLS を使用したVOD形式の動画配信を AWS で行う場合、動画変換には Elastic Transcoder ではなく Elemental MediaConvert を使いましょう。そうしないと iOS で見た時プレイリストファイルを無限にダウンロードし続けます。
背景
ライブストリーミング配信
コロナの影響でリモートワークの必要性が再認識され、SE カレッジなどでも動画配信コンテンツ提供が多数派となりました。
動画配信には様々な形態がありますが、ライブストリーミング配信が一般的です。ビデオオンデマンド (VOD) でもライブ中継でもほぼこれ一択と言っていいでしょう。
簡単に言えば、ライブストリーミング配信は動画を時間分割したセグメントに分けて配信します。1時間の動画を1ファイルで扱えばダウンロードだけで時間がかかりますが、10秒毎に区切れば、再生に必要な直近の10秒から順にダウンロードすることでストレスなく視聴できます。これがライブストリーミング配信のキモです。
このライブストリーミング配信の主流は Apple が開発した HTTP Live Streaming (HLS) です。他にも様々な規格がありますが、デファクトスタンダードは HLS と言っていいでしょう。
AWS での動画変換
Amazon Web Service (AWS) には動画変換サービスとして Elastic Transcoder と Elemental MediaConvert があります。
大雑把に言えば
- MediaConvert の方が新しく、より多機能
- MediaConvert の方が基本的に値段が安い
です。
AWS は基本的に Mediaconvert の使用を推奨しています。Transcoder でなければできない事の方が少ないです。
値段についても、一般的な動画であれば MediaConvert の値段は Transcoder の半分と思っていいです。
動画の再生時間が短い(2分以下)場合、更に値段の差は開きます。
詳しい比較は以下を見てください。
ElasticTranscoder VS MediaConvert (Qiita)
前提条件
- 今回対象とする HLS は v3
- 出力ファイルは以下の2種類
- m3u8 ファイル:プレイリスト
- ts ファイル:時間分割されたセグメント
HLS 変換に MediaConvert を使用するべき理由
HLS の設定 EXT-X-PLAYLIST-TYPE を VOD に指定できないとライブ扱いされてプレイリストをずっと再読み込みするからです。
MediaConvert が出力する m3u8 ファイル
EXT-X-PLAYLIST-TYPE があります。値は VOD になっています。
これにより、ビデオオンデマンド方式(プレイリストの更新はありえない)として解釈されます。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:3
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXTINF:3,
movie3-sdk-hls_00001.ts
#EXTINF:3,
movie3-sdk-hls_00002.ts
#EXTINF:3,
movie3-sdk-hls_00003.ts
.
.
.
(省略)
.
.
.
#EXTINF:3,
movie3-sdk-hls_00017.ts
#EXTINF:3,
movie3-sdk-hls_00018.ts
#EXTINF:3,
movie3-sdk-hls_00019.ts
#EXT-X-ENDLIST
Transcoder が出力する m3u8 ファイル
変換元ファイルは違いますが、同じファイルから変換しても結果は同じです。EXT-X-PLAYLIST-TYPE がありません。
これにより、ライブ方式(プレイリストの更新がされる;例:ライブ中継など)として解釈されます(参考元)。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:7
#EXTINF:6.064000,
movie2-hls-vod-check00000.ts
#EXTINF:6.000000,
movie2-hls-vod-check00001.ts
#EXTINF:3.000000,
movie2-hls-vod-check00002.ts
#EXTINF:6.000000,
movie2-hls-vod-check00003.ts
#EXTINF:6.000000,
movie2-hls-vod-check00004.ts
#EXTINF:3.000000,
movie2-hls-vod-check00005.ts
#EXTINF:6.000000,
movie2-hls-vod-check00006.ts
#EXTINF:1.266667,
movie2-hls-vod-check00007.ts
#EXT-X-ENDLIST
この場合、プレイリストの更新を想定して HLS プレイヤーは一定間隔でプレイリストファイル(*.m3u8)をダウンロードしようとします。
PC などではキャッシュが働くようで特に問題は起きませんが、 iOS の Web ブラウザで見る場合、プレイリストのダウンロードを延々と繰り返します。
まとめ
- Transcoder で変換した HLS は VOD 扱いされない
- MediaConvert で変換した HLS は VOD 扱いされる
- VOD 扱いされない HLS だとプレイリストを延々とダウンロードし続ける
上の例のような小さなファイルであれば大したファイルサイズではありませんが、それが延々とダウンロードされ続ければ話は別です。
そうならないためにも、VOD 方式の動画配信を行いたい場合は MediaConvert を使用しましょう。