M3U8の仕組みを図解:HLSストリーミングを支えるプレイリストファイルの構造
行の集まりでしかないファイル
m3u8の正体は、メモ帳でも開けるただのテキストファイルです。拡張子の見た目は威圧的ですが、理解に必要な規則は実質ひとつだけで、「#で始まる行はタグ、それ以外の行はファイルの場所」と読めば済みます。
重要なのは、動画の実体がm3u8の中に含まれていない点です。書かれているのはTSセグメントと呼ばれる動画の断片への参照だけで、プレイヤーはそれを上から順に取得しては再生します。つまりm3u8は配信の「目次」兼「進行表」であり、テキストゆえにCDNで扱いやすく、配信側はリストを書き換えるだけで進行を制御できます。
マスターとメディア、2種類のプレイリスト
HLSではm3u8が二段階に分かれて登場します。1段目のマスタープレイリストは、用意された画質ごとに2段目への入り口を示す役割を持ちます。典型例がこちらです。
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2149280,RESOLUTION=1280x720
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=965000,RESOLUTION=640x360
360p/index.m3u8
このファイルは動画を一切参照しておらず、「720p版は720p/index.m3u8に、360p版は360p/index.m3u8にある」と宣言しているだけです。2段目のメディアプレイリストになってようやく、EXTINFとTSセグメントの実体が列挙されます。単一画質の配信ではマスターが省略され、メディアプレイリストだけが直接渡されることも多いです。手元のm3u8がどちらのタイプかは、開いたときにEXT-X-STREAM-INFが見えるかどうかで判別できます。
出てくるタグの読み解き方
メディアプレイリスト側でよく目にするタグを、役割順に整理します。
#EXTINF:直後のセグメントの再生秒数。この積み重ねが動画全体の尺になります。#EXT-X-TARGETDURATION:セグメント長の上限値。10とあれば各断片は原則10秒以内です。#EXT-X-MEDIA-SEQUENCE:リスト先頭セグメントの通し番号。ライブではこの値が増え続けます。#EXT-X-KEY:AES-128など暗号化ストリームの鍵取得先。復号には鍵URLへのアクセスが必須になります。#EXT-X-ENDLIST:「このリストで配信は完結」の合図。これが付くまで、リストは伸び続ける可能性があります。
画質が自動で切り替わるカラクリ
ABR(アダプティブビットレート)は特別な魔法ではなく、選び直しの繰り返しです。プレイヤーは直近のセグメントのダウンロード所要時間から実効帯域を推定し、マスターに並ぶ候補の中から「今の帯域でも間に合う最高の画質」を選びます。
ここで効いているのが、TSセグメントが断片単位で独立してデコードできる点です。そのため720pから360pへの切替は「次のセグメントから」滑らかに行えます。逆にセグメントが長いほど切替の反応は遅れます。近年はfMP4セグメントや低遅延HLSの普及もありますが、リストで進行を制御するという基本構造は変わりません。
ライブとオンデマンドで何が違うか
同じm3u8でも、挙動は両者でかなり異なります。オンデマンドでは全セグメントが最初から並び、末尾に#EXT-X-ENDLISTが付きます。一方ライブではリストに最新の数セグメントだけが載り、配信が進むにつれ古い断片から順に抜け落ちていきます。これがスライディングウィンドウと呼ばれる仕組みで、過去の部分が見られなくなるのはこのためです。
構造がわかれば、再生も検証もぐっと怖くなくなります。まずは手元のURLをオンラインプレーヤーで開いてみてください。ほかの切り口の解説はチュートリアル一覧にまとめています。