HLS
映像を、小さなファイルのテキストの一覧に。Web サーバと CDN だけで配れる。
メディアプレイリスト
映像がどの塊でできているかを示す、テキストファイル。
フレーム全体
プレイリストは、映像の小片を並べただけのテキストファイルです。HLS に特別なサーバは要らず、ファイルを配れる Web サーバや CDN があれば動きます。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| ヘッダタグ | 0–7 バイト目 | #EXTM3U | プレイリストは必ず #EXTM3U で始まります。# で始まる行はタグ(指示)、# のない行はメディアの URI です。ここでは行末は LF(CRLF も可)。 |
| ターゲット長 | 8–31 バイト目 | #EXT-X-TARGETDURATION:6 | セグメントの最大の長さ(秒)。ライブのプレイリストを再取得する頻度(およそターゲット長ごとに 1 回)の目安に使います。 |
| セグメントの長さ | 32–44 バイト目 | #EXTINF:6.0, | 次のセグメントの正確な長さ(6.0 秒)。タグは必ず自分の URI の直前に置きます。 |
| セグメント URI | 45–52 バイト目 | seg0.ts | メディアの取得先。相対 URL なので、同じディレクトリから普通の HTTP GET で取ります。数秒分の MPEG-TS(または fMP4)映像です。 |
| セグメントの長さ | 53–65 バイト目 | #EXTINF:6.0, | 2 つ目のセグメントも 6 秒です。 |
| セグメント URI | 66–73 バイト目 | seg1.ts | 2 つ目のセグメント。 |
| リストの終端 | 74–88 バイト目 | #EXT-X-ENDLIST | リストが完結したことを示します。これは録画(VOD)です。ライブのプレイリストには ENDLIST がなく、伸び続けるので、プレイヤーは再読み込みを続けます。 |
概要
HTTP Live Streaming は、映像を数秒のセグメントに切り、それを並べたテキストのプレイリスト(.m3u8)を公開します。プレイヤーは HTTP でプレイリストを取り、続いてセグメントを取ります。適応ビットレートでは、マスタープレイリストが同じ映像を複数の画質で提示し、プレイヤーは回線に合わせて切り替えます。
ただの HTTP とファイルなので、どのファイアウォールも通り、どの CDN でもスケールします。代償は数秒の遅延で、Low-Latency HLS は部分セグメントを公開してこれを縮めます。
基本情報
- トランスポート
- HTTP(S) over TCP
- プレイリスト
- .m3u8 (UTF-8 text)
- セグメント
- MPEG-TS または fMP4、約 2〜10 秒
- 適応配信
- あり、セグメント単位
- 遅延
- 約 6〜30 秒(LL-HLS は 2〜3 秒)
- 規格
- RFC 8216
マスタープレイリスト
同じ映像を、複数の画質で。
フレーム全体
マスタープレイリストは、同じ映像を複数の画質で並べます。プレイヤーは中くらいから始め、回線の変化に合わせてセグメントの切れ目で画質を上げ下げします。
| フィールド | 位置 | 例の値 | 意味 |
|---|---|---|---|
| ヘッダタグ | 0–7 バイト目 | #EXTM3U | マスタープレイリストも #EXTM3U で始まります。 |
| バリアント 1 の情報 | 8–61 バイト目 | #EXT-X-STREAM-INF:BANDWIDTH=800000,RESOLUTION=640x360 | 次の URI が同じ映像の 1 つの画質であると示します。約 800 kbit/s が必要で、解像度は 640×360。プレイヤーは測定した通信速度でどれを選ぶか決めます。 |
| バリアント 1 のプレイリスト | 62–76 バイト目 | low/index.m3u8 | 低画質版のメディアプレイリスト。 |
| バリアント 2 の情報 | 77–132 バイト目 | #EXT-X-STREAM-INF:BANDWIDTH=3000000,RESOLUTION=1280x720 | 中画質版。3 Mbit/s、720p。 |
| バリアント 2 のプレイリスト | 133–147 バイト目 | mid/index.m3u8 | そのメディアプレイリスト。 |
再生と適応
HTTP リクエストだけ。ファイルを 1 つずつ。
やり取りの全体
HLS は映像を小さなファイルの連続に変え、画質の判断をプレイヤーに任せます。普通の CDN でスケールする理由であり、数秒の遅延がある理由でもあります。
1マスタープレイリストを取る
普通の HTTP GET です。ストリーミングサーバも特別なプロトコルもなく、ただのファイルです。
2画質を選ぶ
プレイヤーはバリアントを読み、控えめなものから始めて、ダウンロード速度を測ります。
3セグメント 0 をダウンロード
映像は 6 秒の塊で届き、それぞれが独立した HTTP ダウンロードです。
4再生する
セグメントは短い MPEG-TS ファイルです。プレイヤーはデコードしながら、次のセグメントを取りに行きます。
5速度に余裕があったので画質を上げる
セグメント 0 が実時間よりずっと速く落ちたので、プレイヤーは次のセグメントを、より高画質のバリアントから要求します。画質の切り替えはセグメントの切れ目だけで起きます。
6これが続く
ライブ配信では、プレイヤーはターゲット長ごとにメディアプレイリストも取り直し、新しいセグメントを見つけます。
使われる場面
- Web サイトの動画、Safari / iOS(ネイティブ対応)、多くの動画プラットフォーム
- CDN 経由での、数百万人規模のライブイベント
- FairPlay による DRM 付き配信
つまずきやすい点
- セグメントの長さは、遅延と効率のトレードオフです。短いと、リクエストが増えプレイリストも大きくなります。
- セグメントはキーフレームで始める必要があります。そうでないと、画質の切り替えで乱れが出ます。
- ブラウザでのクロスオリジン再生には、プレイリストとセグメントの両方に CORS ヘッダが必要です。
出典・規格
- RFC 8216: HTTP Live Streaming