Baud
プロトコル一覧

HLS

映像を、小さなファイルのテキストの一覧に。Web サーバと CDN だけで配れる。

メディアプレイリスト

映像がどの塊でできているかを示す、テキストファイル。

HLS メディアプレイリスト(.m3u8)・テキスト0163248648023#45E58X54T4DM33355U0ALF23#45E58X54T2D-58X2D-54T41A52R47G45E54T44D55U52R41A54T49I4FO4EN3A:3660ALF23#45E58X54T49I4EN46F3A:3662E.3002C,0ALF73s65e67g3002E.74t73s0ALF23#45E58X54T49I4EN46F3A:3662E.3002C,0ALF73s65e67g3112E.74t73s0ALF23#45E58X54T2D-58X2D-45E4EN44D4CL49I53S54T0ALFヘッダタグターゲット長セグメントの長さセグメント URIセグメントの長さセグメント URIリストの終端フィールドをクリックして中身を見る

フレーム全体

プレイリストは、映像の小片を並べただけのテキストファイルです。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 の直前に置きます。
セグメント URI45–52 バイト目seg0.tsメディアの取得先。相対 URL なので、同じディレクトリから普通の HTTP GET で取ります。数秒分の MPEG-TS(または fMP4)映像です。
セグメントの長さ53–65 バイト目#EXTINF:6.0,2 つ目のセグメントも 6 秒です。
セグメント URI66–73 バイト目seg1.ts2 つ目のセグメント。
リストの終端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

マスタープレイリスト

同じ映像を、複数の画質で。

HLS マスタープレイリスト・適応ビットレート016324864809611212814423#45E58X54T4DM33355U0ALF23#45E58X54T2D-58X2D-53S54T52R45E41A4DM2D-49I4EN46F3A:42B41A4EN44D57W49I44D54T48H3D=3883003003003003002C,52R45E53S4FO4CL55U54T49I4FO4EN3D=36634430078x3333663000ALF6Cl6Fo77w2F/69i6En64d65e78x2E.6Dm33375u3880ALF23#45E58X54T2D-58X2D-53S54T52R45E41A4DM2D-49I4EN46F3A:42B41A4EN44D57W49I44D54T48H3D=3333003003003003003002C,52R45E53S4FO4CL55U54T49I4FO4EN3D=31132238830078x3773223000ALF6Dm69i64d2F/69i6En64d65e78x2E.6Dm33375u3880ALFヘッダタグバリアント 1 の情報バリアント 1 のプ…バリアント 2 の情報バリアント 2 のプレイリストフィールドをクリックして中身を見る

フレーム全体

マスタープレイリストは、同じ映像を複数の画質で並べます。プレイヤーは中くらいから始め、回線の変化に合わせてセグメントの切れ目で画質を上げ下げします。

フィールド位置例の値意味
ヘッダタグ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 つずつ。

プレイヤーbrowser / phoneCDN / Web サーバplain HTTPGETmaster.m3u8200 OK3 variantsGETmid/seg0.ts200 OKMPEG-TS, 6 sGEThigh/seg1.ts200 OKhigher bitrate

やり取りの全体

HLS は映像を小さなファイルの連続に変え、画質の判断をプレイヤーに任せます。普通の CDN でスケールする理由であり、数秒の遅延がある理由でもあります。

  1. 1マスタープレイリストを取る

    普通の HTTP GET です。ストリーミングサーバも特別なプロトコルもなく、ただのファイルです。

  2. 2画質を選ぶ

    プレイヤーはバリアントを読み、控えめなものから始めて、ダウンロード速度を測ります。

  3. 3セグメント 0 をダウンロード

    映像は 6 秒の塊で届き、それぞれが独立した HTTP ダウンロードです。

  4. 4再生する

    セグメントは短い MPEG-TS ファイルです。プレイヤーはデコードしながら、次のセグメントを取りに行きます。

  5. 5速度に余裕があったので画質を上げる

    セグメント 0 が実時間よりずっと速く落ちたので、プレイヤーは次のセグメントを、より高画質のバリアントから要求します。画質の切り替えはセグメントの切れ目だけで起きます。

  6. 6これが続く

    ライブ配信では、プレイヤーはターゲット長ごとにメディアプレイリストも取り直し、新しいセグメントを見つけます。

使われる場面

  • Web サイトの動画、Safari / iOS(ネイティブ対応)、多くの動画プラットフォーム
  • CDN 経由での、数百万人規模のライブイベント
  • FairPlay による DRM 付き配信

つまずきやすい点

  • セグメントの長さは、遅延と効率のトレードオフです。短いと、リクエストが増えプレイリストも大きくなります。
  • セグメントはキーフレームで始める必要があります。そうでないと、画質の切り替えで乱れが出ます。
  • ブラウザでのクロスオリジン再生には、プレイリストとセグメントの両方に CORS ヘッダが必要です。

出典・規格

  • RFC 8216: HTTP Live Streaming

関連するプロトコル