【小ネタ】CloudFront のファイル圧縮機能で HLS コンテンツが圧縮されるのか調べてみた

2020.05.01

こんにちは、大前です。

 

掲題の件について調べる機会がありましたので、ブログを投下してみます。

結論を述べてしまうと「ほぼ圧縮されない」のですが、調べた過程や情報について一通り記載しますので、今後同じ疑問を抱える方の助けになれば幸いです。

この記事のまとめ

  • CloudFront のファイル圧縮機能は HLS コンテンツに対する圧縮効果は見込めない
  • インデックスファイル(.m3u8)は圧縮可能だが、動画と比較してサイズが小さい
  • 動画ファイル(.ts)は CloudFront の圧縮対象外

前提知識

ざっくり、概要レベルで前提知識のおさらいをします。

CloudFront のファイル圧縮機能について

オリジンから CloudFront を経由してコンテンツを配信する際、CloudFront 上でコンテンツを圧縮してビューワーに返却してくれる機能となります。

コンソール上の設定項目だと、Behavior 内の Compress objects automatically を ON にする事で有効になります。

 

使用にあたってはいくつかのポイントがありますが、配信するコンテンツ容量が減るため CloudFront の利用料金を抑える事に繋がります。使える場面では有効にしたい機能ですね。

  • ビューワーからのリクエストヘッダーに `Accept-Encoding: gzip` を含める事で CloudFront にて圧縮されたコンテンツをリクエストする
  • 特定の Content-Type のみ圧縮可能
  • etc...

詳細な仕様については、下記公式ドキュメントを参照ください。

圧縮ファイルの供給

 

HLS でリクエストされるファイルについて

HLS は HTTP Live Streaming の略で、HTTP ベースでメディアコンテンツのストリーム配信を実現する仕組みです。

同様の仕組みとして、DASH というものがあったりします。

簡単に仕組みを説明すると、HLS や DASH には インデックスファイルセグメントファイル と呼ばれる 2種類のファイルが存在します。

インデックスファイル

HLS だと .m3u8 、DASH だと .mpd の拡張子を持つファイルがインデックスファイルとなります。

XML で記述されたファイルとなっており、取得するセグメントファイルが記載されています。

HLS コンテンツを視聴するクライアントは、このインデックスファイルの記載にしたがってセグメントファイルを次々に取得します。

セグメントファイル

実際に再生される動画コンテンツが格納されたファイルになります。.ts の拡張子を持つ事が多いです。

 

図にすると、HLS は以下の様なイメージで動画コンテンツを受け取っています。

調べてみる

では、本題の CloudFront におけるファイル圧縮機能を HLS に対して使う事が出来るのかという部分を考えていきます。

CloudFront は、オリジンからコンテンツが返却される際の Content-Type ヘッダーを元に圧縮可能かどうかを判断します。

対応する Content-Type 一覧については下記で確認できます。

CloudFront が圧縮するファイルタイプ

 

上記前提より、HLS では内部的に以下の 2つのファイルを CloudFront 経由でオリジンから取得する事になりますが、それぞれ以下の Content-Type で返却されます。

  • インデックスファイル(.m3u8 など)
    • application/vnd.apple.mpegurl
  • セグメントファイル(.ts など)
    • video/MP2T

この時、video/MP2T は圧縮可能なタイプに含まれていません。その為、HLS における動画ファイルの圧縮は出来ないという事になります。

一方で、インデックスファイルの Content-Type である application/vnd.apple.mpegurl は圧縮可能なタイプではありますが、動画コンテンツと比較すると小さなファイルである為、圧縮して恩恵が受けられるケースはあまりないと思われます。

上記より、HLS コンテンツ配信においては CloudFront のファイル圧縮機能を有効にしてもあまり恩恵を受けられない事がわかりました。

 

実際に確認してみる

事前にファイル圧縮機能を有効にした S3 + CloudFront の構成を作成した上で、HLS の各ファイルに curl でアクセスしてみます。

ちなみに、CloudFront にて圧縮が行われている場合には以下の様に content-encoding: gzip というレスポンスヘッダーが追加されます

 

インデックスファイル(.m3u8)

圧縮されて返却されている事がわかります。

ちなみに、3.5kバイトあった元ファイルが 410バイトほどに圧縮されていました。

 

セグメントファイル(.ts)

ヘッダーが付与されていない為、圧縮されていない事がわかります。ファイルサイズもオリジンと変わらずでした。

おわりに

CloudFront のファイル圧縮機能で HLS コンテンツも圧縮されるのか、について調べてみました。

どなたかの参考になれば幸いです。

 

以上、AWS 事業本部の大前でした。