m3u8の紹介
M3U8 これはUnicodeバージョンです M3UUTF-8でエンコードされています。「M3U」ファイルと「M3U8」ファイルはどちらも、Appleが使用するHTTP Live Streaming(HLS)プロトコル形式の基礎であり、iPhoneやMacBookなどのデバイスで再生できます。
上記のテキスト定義はウィキペディアご覧のとおり、m3u8 ファイルは実際には HTTP Live Streaming (HLS と略される) プロトコルの一部であり、HLS は Apple が提案した HTTP ベースのストリーミング メディア ネットワーク伝送プロトコルです。
HLSは、ストリーム全体を小さなHTTPベースのファイルに分割してダウンロードすることで機能します。一度にダウンロードするファイルは少数です。メディアストリームの再生中、クライアントは複数の異なるソースから同じリソースを異なるレートでダウンロードすることを選択できるため、ストリーミングセッションはさまざまなデータレートに適応できます。ストリーミングセッションを開始すると、クライアントは利用可能なメディアストリームを見つけるためのメタデータを含む拡張M3U(m3u8)プレイリストファイルをダウンロードします。
HLSは基本的なHTTPメッセージのみを要求します。リアルタイムトランスポートプロトコル(RTP)とは異なり、HLSはHTTPデータの通過を許可するあらゆるファイアウォールを通過できます。プロキシサーバーコンテンツ配信ネットワークを使用してメディア ストリームを送信することも簡単です。
簡単に言えば、HLSは新世代のストリーミングメディア伝送プロトコルです。その基本的な実装原理は、大規模なメディアファイルをセグメント化し、セグメント化されたファイルのリソースパスをm3u8ファイル(プレイリスト)に記録し、さらにいくつかの追加情報(リソースのマルチバンド情報など)をクライアントに提供するというものです。クライアントはm3u8ファイルに基づいて対応するメディアリソースを取得し、再生することができます。
したがって、クライアントは主に m3u8 ファイルを解析することによって HLS ストリーム ファイルを取得します。
それでは、m3u8 ファイルについて簡単に紹介しましょう。
M3U8ファイルの紹介
m3u8ファイルは実際にはプレイリストであり、メディアプレイリストまたはマスタープレイリストのいずれかになります。プレイリストの種類に関わらず、ファイル内のテキストはUTF-8でエンコードされます。
m3u8ファイルをメディアプレイリストとして使用する場合、その内部情報には一連のメディアセグメントリソースが記録されます。セグメントリソースを順番に再生することで、マルチメディアリソースを完全に表示できます。フォーマットは以下のとおりです。
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXTINF:9.009,
http://media.example.com/first.ts
#EXTINF:9.009,
http://media.example.com/second.ts
#EXTINF:3.003,
http://media.example.com/third.ts
オンデマンド再生の場合、クライアントは上記のセグメントリソースを順番にダウンロードし、1つずつ再生するだけで済みます。ライブストリーミングの場合、クライアントは定期的にm3u8ファイルを再リクエストし、ダウンロードして再生する必要がある新しいセグメントデータがあるかどうかを確認する必要があります。
m3u8をマスタープレイリストとして使用すると、同じメディアリソースの複数のストリームリストリソース(バリアントストリーム)が提供されます。その形式は以下のとおりです。
#EXTM3U
#EXT-X-STREAM-INF:帯域幅=150000、解像度=416x234、コーデック=「avc1.42e00a,mp4a.40.2」
http://example.com/low/index.m3u8
#EXT-X-STREAM-INF:帯域幅=240000、解像度=416x234、コーデック=「avc1.42e00a,mp4a.40.2」
http://example.com/lo_mid/index.m3u8
#EXT-X-STREAM-INF:帯域幅=440000、解像度=416x234、コーデック=「avc1.42e00a,mp4a.40.2」
http://example.com/hi_mid/index.m3u8
#EXT-X-STREAM-INF:帯域幅=640000、解像度=640x360、コーデック=「avc1.42e00a,mp4a.40.2」
http://example.com/high/index.m3u8
#EXT-X-STREAM-INF:帯域幅=64000、コーデック=「mp4a.40.5」
http://example.com/audio/index.m3u8
バックアップ ストリーム リソースは、異なるビット レートと形式のさまざまなメディア プレイリストを指定します。また、異なる言語のオーディオ ファイル、異なる角度で撮影されたビデオ ファイルなど、異なるバージョンのリソース コンテンツを同時に提供することもできます。お客様は、さまざまなネットワーク状況に応じて適切なビット ストリームのリソースを選択できるため、ユーザーの好みに応じて適切なリソース コンテンツを選択するのが最適です。
上記がm3u8ファイルの一般的な内容です。次に、m3u8コンテンツフォーマットについて説明します。
m3u8ファイル形式
m3u8 ファイル形式には、主に次の 3 つの側面があります。
ファイルプレイリスト形式の定義:プレイリスト(m3u8ファイルとも呼ばれます)の内容は、仕様定義の要件を厳密に満たす必要があります。遵守すべき主な条件は次のとおりです。
m3u8 ファイルは UTF-8 でエンコードする必要があり、バイト オーダー マーク (BOM) バイト オーダーは使用できません。また、UTF-8 制御文字 (U+0000 ~ U_001F および U+007F ~ u+009F) を含めることはできません。
m3u8ファイルの各行はURI、空白行、または#で始まる行のいずれかです。弦明示的な宣言要素を除き、空白文字は使用できません。
m3u8ファイル内の#で始まる文字列は、コメントまたはタグのいずれかです。タグは#EXTで始まり、大文字と小文字が区別されます。
属性リスト:特定のタグの値は属性リストです。タグの後の属性リストでは、複数の属性/値のペアをスペースなしで区切るために、カンマを区切り文字として使用します。
属性/値のペアの構文は次のとおりです。
属性名=属性値
で:
属性AttributeNameは、[A..Z]、[0..9]、および-で構成される引用符なしの文字列です。したがって、属性AttributeNameには大文字のみ使用でき、小文字は使用できません。また、AttributeNameと=の間にスペースを入れることはできません。同様に、=とAttributeValueの間にもスペースを入れることはできません。
AttributeValue の値は、次のタイプのみになります。
10 進整数: [0..9] で構成される引用符なしの 10 進文字列。範囲は ~ (18446744073709551615)、文字長は 1 ~ 20。
16進シーケンス:[0..9]と[A..F]からなる引用符なしの文字列で、先頭に0xまたは0Xが付きます。シーケンスの最大長は、属性名AttributeNamesによって異なります。
符号付き 10 進浮動小数点数: [0..9]、-、および . で構成される引用符で囲まれていない文字列。
文字列 (引用符で囲まれた文字列): 二重引用符で囲まれた文字列。文字列には 0xA、0xD、および二重引用符 " は使用できません。文字列では大文字と小文字が区別されます。
列挙文字列: AttributeName で定義された、引用符で囲まれていない一連の文字列。文字列には二重引用符、カンマ、空白文字を含めることはできません。
小数点解像度: 文字 x で区切られた 2 つの小数点整数。最初の整数は水平幅を表し、2 番目の整数は垂直高さを表します (単位: ピクセル)。
タグ: タグは、m3u8 ファイルのグローバル パラメータまたは後続のスライス ファイル/メディア プレイリストの一部の情報を指定するために使用されます。
タグには、基本タグ、メディアセグメントタグ、メディアプレイリストタグ、マスタープレイリストタグ、プレイリストタグの5種類があります。具体的な内容は以下のとおりです。
基本タグ: メディアプレイリストとマスタープレイリストの両方に適用されます。具体的なタグは次のとおりです。
EXTM3U: ファイルがm3u8ファイルであることを示します。各M3Uファイルの最初の行にこのタグを配置する必要があります。
EXT-X-VERSION: HLSプロトコルのバージョン番号を示します。このタグはストリーミングメディアの互換性に関連します。このタグはグローバルスコープであり、m3u8ファイル全体を有効とします。各m3u8ファイルには、このタグの定義が最大1つまで記述できます。m3u8ファイルにこのタグが含まれていない場合、プロトコルの最初のバージョンがデフォルトで使用されます。
メディアセグメントタグ: 各セグメントURIの前には、そのセグメントを説明する一連のメディアセグメントタグが付きます。一部のセグメントタグは、後続のセグメントリソースに対してのみ有効です。また、一部のセグメントタグは、同じタグが見つかるまで後続のすべてのセグメントに対して有効です。メディアセグメントタイプタグは、マスタープレイリストには使用できません。具体的なタグは以下のとおりです。
EXTINF: 後続のURLで指定されるメディアセグメントの長さ(秒数)を示します。このタグは、各URLメディアセグメントの前に指定する必要があります。このタグの形式は次のとおりです。
#EXTINF:,[]<br>
で:</p>
<p>期間: 10 進整数または浮動小数点型にすることができ、その値は EXT-X-TARGETDURATION で指定された値以下である必要があります。<br>
注:継続時間を指定する際は、常に浮動小数点値を使用することをお勧めします。これにより、クライアントはストリームの位置指定時に丸め誤差を削減できます。ただし、互換性のあるバージョン番号 EXT-X-VERSION が3未満の場合は、整数値を使用する必要があります。<br>
EXT-X-BYTERANGE: このタグは、次のスライスリソースが、後続のURIで指定されるメディアセグメントリソースのローカル範囲であることを示します(つまり、URIメディアリソースの内容が次のスライスとして取得されます)。このタグは、次のURIに対してのみ機能します。形式は次のとおりです。</p>
<p>1TP5テキストXバイト範囲:<n>[@<o>]<br>
で:</p>
<p>n は、インターセプトされたセグメントのサイズ (バイト単位) を示す 10 進整数です。<br>
オプション パラメータ o も 10 進整数で、インターセプションの開始位置を示します (バイト単位で表され、URI で指定されたリソースの先頭からバイト位置を移動した後にインターセプションが実行されます)。<br>
o が指定されていない場合、インターセプトの開始位置は、前のタグ インターセプトの次のバイト (つまり、前の n+o+1) からになります。<br>
このタグが指定されていない場合、セグメンテーションの範囲は URI リソース フラグメント全体になります。<br>
注意: EXT-X-BYTERANGE タグを使用するには、互換性のあるバージョン番号 EXT-X-VERSION が 4 以上である必要があります。<br>
EXT-X-DISCONTINUITY: このタグは、前のスライスと次のスライスの間に不連続性があることを示します。形式は次のとおりです。</p>
<p>1TP5テキスト-X-不連続性<br>
次のいずれかの条件が変更された場合、このタグを使用する必要があります。</p>
<p>ファイル形式<br>
トラックの数、種類、識別子<br>
タイムスタンプシーケンス<br>
このタグは、次のいずれかの条件が変化する場合に使用する必要があります。</p>
<p>エンコードパラメータ<br>
コード配列<br>
注:EXT-X-DISCONTINUITYの典型的な使用シナリオは、ビデオストリームに広告を挿入することです。ビデオストリームと広告ビデオストリームは同じリソースではないため、EXT-X-DISCONTINUITYは2つのストリームが切り替わるタイミングを示すために使用されます。クライアントはこのタグを認識すると、切り替えによる中断の問題に対処し、より優れたエクスペリエンスを提供します。<br>
詳細については、「プレイリストに広告を組み込む」をご覧ください。</p>
<p>EXT-X-KEY: メディア セグメントを暗号化することができ、このタグで復号化方法を指定できます。<br>
このタグは、次の EXT-X-KEY に遭遇するまで、タグ EXT-X-MAP によって宣言されたすべてのメディア セグメントとそれらの周囲のすべてのメディア初期化ブロック (メディア初期化セクション) に対して有効です (m3u8 ファイルに EXT-X-KEY タグが 1 つしかない場合は、すべてのメディア セグメントに対して有効です)。<br>
複数の EXT-X-KEY タグが同じキーを生成する場合、同じメディア セグメントに複数の EXT-X-KEY タグを適用できます。<br>
このタグの形式は次のとおりです。</p>
<p>1TP5テキストXキー:<attribute-list><br>
プロパティ リストには次のキーを含めることができます。</p>
<p>METHOD: この値は、暗号化方法を指定する列挙可能な文字列です。<br>
このキーは必須パラメータです。値はNONE、AES-128、SAMPLE-AESのいずれかになります。<br>
で:<br>
NONE: スライスが暗号化されていないことを示します (この時点では他の属性は表示されません)。<br>
AES-128: 暗号化に AES-128 が使用されていることを示します。<br>
SAMPLE-AES: メディアセグメントに、AES-128で暗号化されたオーディオやビデオなどのサンプルメディアが含まれていることを意味します。この場合、IV属性は存在する場合と存在しない場合があります。</p>
<p>URI: キーパスを指定します。<br>
キーは16バイトのデータです。<br>
METHOD が NONE でない限り、このキーは必須のパラメータです。</p>
<p>IV: この値は 128 ビットの 16 進数値です。<br>
AES-128では、暗号化と復号に同じ16バイトのIV値を使用する必要があります。異なるIV値を使用することで、暗号の強度を高めることができます。<br>
属性リストに IV が表示される場合はその値を使用します。表示されない場合は、ビッグエンディアン バイト順序を使用し、シーケンス番号が 16 バイト (128 ビット) になるまで 0 を残してパディングし、メディア セグメント シーケンス番号 (つまり EXT-X-MEDIA-SEQUENCE) をデフォルトで IV 値として使用します。</p>
<p>KEYFORMAT: キーがキー ファイルにどのように格納されるかを識別する二重引用符で囲まれた文字列 (キー ファイル内の AES-128 キーは、バイナリ形式で格納される 16 バイトのキーです)。<br>
この属性はオプションであり、デフォルト値は「identity」です。<br>
この属性を使用するには、互換性のあるバージョン番号 EXT-X-VERSION が 5 以上である必要があります。</p>
<p>KEYFORMATVERSIONS: / で区切られた 1 つ以上の正の整数値で構成される引用符で囲まれた文字列 (例: "1"、"1/2"、"1/2/5")。<br>
1 つ以上の特定の KEYFORMT バージョンが定義されている場合、この属性を使用して、どの特定のバージョンに対してコンパイルするかを示すことができます。<br>
この属性はオプションであり、デフォルト値は「1」です。<br>
この属性を使用するには、互換性のあるバージョン番号 EXT-X-VERSION が 5 以上である必要があります。</p>
<p>EXT-X-MAP: このタグは、メディア初期化セクションを取得する方法を指定します。<br>
このタグは、別の EXT-X-MAP タグが検出されるまで、後続のすべてのメディア セグメントに対して有効です。<br>
形式は次のとおりです。</p>
<p>#EXT-X-MAP:<attribute-list><br>
属性リストの値の範囲は次のとおりです。</p>
<p>URI: メディア初期化ブロックを含むリソースへのパスを指定する、引用符で囲まれた文字列。この属性は必須パラメータです。</p>
<p>BYTERANGE: URI で指定されたリソース内のメディア初期化ブロックの場所 (フラグメント) を指定する引用符で囲まれた文字列。<br>
この属性で指定される範囲には、メディア初期化ブロックのみを含める必要があります。<br>
この属性はオプションのパラメータです。指定されていない場合は、URIで指定されたリソースがメディア初期化ブロック全体であることを意味します。</p>
<p>EXT-X-PROGRAM-DATE-TIME: このタグは、絶対日付/時刻を使用して、最初のサンプル セグメントがサンプリングされた日時を示します。<br>
形式は次のとおりです。</p>
<p>#EXT-X-プログラム-日付-時刻:<date-time-msec><br>
その中でも、date-time-msecは <a href="https://uzbox.com/ja/%e3%82%bf%e3%82%b0/-334" class="st_tag internal_tag" rel="tag" title="アイソ">ISO</a>IEC 8601:2004 で規定されている日付形式は、YYYY-MM-DDThh:mm:ss.SSSZ です。</p>
<p>EXT-X-DATERANGE: このタグは、一連の属性/値のペアで構成される日付範囲を定義します。<br>
形式は次のとおりです。</p>
<p>#EXT-X-日付範囲:<attribute-list><br>
属性リストには次の値があります。</p>
<p>ID: 日付範囲を指定する、二重引用符で囲まれた一意の識別子。<br>
この属性は必須のパラメータです。</p>
<p>CLASS: 顧客が定義した一連の属性と対応するセマンティック値。二重引用符で囲まれています。<br>
同じ CLASS 属性を持つすべての日付範囲は、対応するセマンティクスに準拠する必要があります。<br>
この属性はオプションです。</p>
<p>START-DATE: 二重引用符で囲まれた日付範囲の開始値。<br>
この属性は必須のパラメータです。</p>
<p>END-DATE: 二重引用符で囲まれた日付範囲の終了値。<br>
この属性値は START-DATE 以上である必要があります。<br>
この属性はオプションです。</p>
<p>期間: 日付範囲の期間は、10 進浮動小数点値 (単位: 秒) です。<br>
このプロパティ値は負の値にできません。<br>
即時の時間を表現する場合は、プロパティ値を 0 に設定するだけです。<br>
この属性はオプションです。</p>
<p>PLANNED-DURATION: この属性は、日付範囲の予想期間です。<br>
値は 10 進浮動小数点数値型 (単位: 秒) です。<br>
このプロパティ値は負の値にできません。<br>
実際の期間が事前にわからない場合は、このプロパティを日付範囲の予想期間の見積もりとして使用できます。<br>
この属性はオプションです。</p>
<p>X-<client-attribute>: X- プレフィックスは、クライアント定義のプロパティ用に予約された名前空間です。<br>
クライアントが属性名をカスタマイズすると、逆の <a href="https://uzbox.com/ja/%e3%82%bf%e3%82%b0/dns" class="st_tag internal_tag" rel="tag" title="DNS">DNS</a>競合を避けるための (逆 DNS) 構文。<br>
カスタム属性値は、二重引用符で囲まれた文字列、16 進数のシーケンス、または 10 進浮動小数点数である必要があります (例: X-COM-EXAMPLE-AD-ID="XYZ123")。<br>
この属性はオプションです。</p>
<p>SCTE35-CMD、SCTE35-OUT、SCTE35-IN: SCTE35 データを伝送するために使用されます。<br>
この属性はオプションです。</p>
<p>END-ON-NEXT: この属性値は列挙可能な文字列であり、その値は YES である必要があります。<br>
この属性は、範囲の終了、つまり後続の範囲の開始位置START-DATEに達したことを示します。後続の範囲とは、同じCLASSを持つタグのSTART-DATEよりも後の、最も早いSTART-DATE値を持つ日付範囲を指します。<br>
この属性はオプションです。</p>
<p>メディア プレイリスト タイプ タグ: メディア プレイリスト タグは、m3u8 ファイルのグローバル パラメータ情報です。<br>
これらのタグは、m3u8 ファイル内に最大 1 回出現できます。<br>
メディア プレイリスト タグはマスター プレイリストに表示できません。<br>
メディア プレイリストの具体的なタグは次のとおりです。</p>
<p>EXT-X-TARGETDURATION: 各ビデオ セグメントの最大継続時間 (秒単位) を示します。<br>
このタグは必須です。<br>
形式は次のとおりです。</p>
<p>#EXT-X-TARGETDURATION:<s><br>
ここで、パラメータ s はターゲット期間 (単位: 秒) を表します。</p>
<p>EXT-X-MEDIA-SEQUENCE: プレイリスト内の最初の URL フラグメント ファイルのシーケンス番号を示します。<br>
各メディア セグメント URL には、一意の整数シーケンス番号があります。<br>
各メディア セグメントのシーケンス番号は、出現順に 1 ずつ増加します。<br>
このタグが指定されていない場合、デフォルトのシーケンス番号は 0 から始まります。<br>
メディア セグメント シーケンス番号は、セグメント ファイル名とは関係ありません。<br>
形式は次のとおりです。</p>
<p>1TP5テキストXメディアシーケンス:<number><br>
そのうち、パラメータ番号はスライスのシーケンス番号です。</p>
<p>EXT-X-DISCONTINUITY-SEQUENCE: このタグは、EXT-X-DISCONTINUITY タグを使用して、同じストリームの異なるレンディションと異なるバックアップ ストリームの同期を可能にします。<br>
形式は次のとおりです。</p>
<p>1TP5テキストX不連続シーケンス:<number><br>
その中で、パラメータ番号は 10 進整数値です。<br>
プレイリストが EXT-X-DISCONTINUITY-SEQUENCE タグを設定しない場合、最初のセグメントの割り込みシーケンス番号は 0 になる必要があります。</p>
<p>EXT-X-ENDLIST: m3u8 ファイルの終わりを示します。<br>
このタグは m3u8 ファイル内のどこにでも出現できますが、通常はファイルの最後に出現します。<br>
形式は次のとおりです。</p>
<p>#EXT-X-ENDLIST<br>
EXT-X-PLAYLIST-TYPE: ストリーミングメディアの種類を示します。これはグローバルに適用されます。<br>
このタグはオプションです。<br>
形式は次のとおりです。</p>
<p>1TP5テキスト-X-プレイリストタイプ:<type-enum><br>
そのうち、type-enumのオプション値は次のとおりです。</p>
<p>VOD: ビデオ オン デマンド。ビデオ ストリームがビデオ オン デマンド ソースであることを意味します。<a href="https://uzbox.com/ja/%e3%82%bf%e3%82%b0/-848" class="st_tag internal_tag" rel="tag" title="サーバ">サーバ</a>m3u8 ファイルは変更できません。</p>
<p>イベント: ビデオストリームが<a href="https://uzbox.com/ja/%e3%82%bf%e3%82%b0/zhiboyuan" class="st_tag internal_tag" rel="tag" title="ライブソース">ライブソース</a>したがって、サーバーはファイルのどの部分も変更または削除できません (ただし、ファイルの末尾に新しいコンテンツを追加することはできます)。<br>
注:VODファイルはオンデマンドソースであり、変更されないため、通常はEXT-X-ENDLISTタグが付けられます。一方、EVEVTファイルは初期化時にEXT-X-ENDLISTタグが付けられないのが一般的で、新しいファイルはプレイリストの末尾に追加されます。そのため、クライアントはEXT-X-ENDLISTタグにアクセスするまで、新しいメディアセグメントリソースを取得するために定期的にm3u8ファイルを取得する必要があります。</p>
<p>EXT-XI-FRAMES-ONLY: このタグは、各メディアセグメントがIフレームであることを示します。Iフレームは、他のフレームの数に依存しないビデオエンコーディングであるため、高速再生や高速フリップなどに使用できます。<br>
このタグはグローバルに有効です。<br>
形式は次のとおりです。</p>
<p>1TP5テキスト-XI-フレームのみ<br>
プレイリストが EXT-XI-FRAMES-ONLY に設定されている場合、スライスの継続時間 (EXTINF タグの値) は、現在のスライスの I フレームの開始から次の I フレームの出現までの継続時間になります。<br>
メディア リソースに I フレーム スライスが含まれている場合は、クライアントがこれらの I フレーム スライスを任意の順序でロードしてデコードできるように、メディア初期化ブロックを提供するか、EXT-X-MAP タグを通じてメディア初期化ブロックへのアクセスを提供する必要があります。<br>
I フレーム スライスに EXT-BYTE_RANGE が設定されている場合は、メディア初期化チャンクを提供してはなりません。<br>
EXT-XI-FRAMES-ONLY を使用するには、互換性のあるバージョン番号 EXT-X-VERSION が 4 以上である必要があります。</p>
<p>マスター プレイリスト タイプ タグ: マスター プレイリストは、バックアップ ストリーム、多言語翻訳ストリーム、およびその他のグローバル パラメータを定義します。<br>
マスター プレイリスト タグは、メディア プレイリストに表示されてはなりません。<br>
具体的なタグは以下のとおりです。</p>
<p>EXT-X-MEDIA: 同じコンテンツに対して代替の多言語翻訳再生メディア リスト リソースを指定するために使用されます。<br>
たとえば、3 つの EXT-X-MEIDA タグを使用して、英語、フランス語、スペイン語で同じ内容のオーディオ リソースを提供したり、2 つの EXT-X-MEDIA タグを使用して、2 つの異なる撮影アングルのビデオ リソースを提供したりできます。<br>
形式は次のとおりです。</p>
<p>1TP5テキスト-X-メディア:<attribute-list><br>
属性リストの値の範囲は次のとおりです。</p>
<p>タイプ: 属性値は列挙可能な文字列です。<br>
値は、AUDIO、VIDEO、SUBTITLES、CLOSED-CAPTIONS の 4 つです。<br>
通常はクローズドキャプションが使用されます。<br>
この属性は必須のパラメータです。</p>
<p>URI: 二重引用符で囲まれたメディア リソース プレイリストのパス。<br>
TYPE 属性値が CLOSED-CAPTIONS の場合、URI は提供されません。<br>
この属性はオプションです。</p>
<p>GROUP-ID: 多言語翻訳フローが属するグループを示す、二重引用符で囲まれた文字列。<br>
この属性は必須のパラメータです。</p>
<p>LANGUAGE: ストリームで使用される言語を指定する二重引用符で囲まれた文字列。<br>
この属性はオプションです。</p>
<p>ASSOC-LANGUAGE: 多言語ストリームの言語バージョンの 1 つを提供する言語タグを含む二重引用符で囲まれた文字列。<br>
このパラメータはオプションです。</p>
<p>NAME: 翻訳ストリームの人間が読める説明を提供するために使用される二重引用符で囲まれた文字列。<br>
LANGUAGE 属性が設定されている場合は、NAME 属性も設定する必要があります。<br>
この属性は必須のパラメータです。</p>
<p>デフォルト: プロパティ値は列挙可能な文字列です。<br>
可能な値は YES と NO です。<br>
この属性が指定されていない場合のデフォルト値は NO です。<br>
このプロパティが YES に設定されている場合、クライアントは他のオプション情報がない場合でも、翻訳されたストリームを再生する必要があります。<br>
この属性はオプションです。</p>
<p>AUTOSELECT: プロパティ値は列挙可能な文字列です。<br>
有効な値は YES または NO です。<br>
指定しない場合は、デフォルトは NO になります。<br>
このプロパティを YES に設定すると、システム言語の選択など、現在の再生環境をクライアントが構成できるため、ユーザーが明示的に設定していない場合でも、翻訳ストリームを再生することを選択できます。<br>
このプロパティが設定されている場合、DEFAULT が YES に設定されているときは、このプロパティも YES に設定する必要があります。<br>
この属性はオプションです。</p>
<p>FORCED: 属性値は列挙可能な文字列です。<br>
有効な値は YES または NO です。<br>
指定しない場合は、デフォルトは NO になります。<br>
このプロパティは、TYPE が SUBTITLES に設定されている場合にのみ設定できます。<br>
このプロパティがYESに設定されている場合、翻訳ストリームに重要なコンテンツが含まれていることを意味します。このプロパティが設定されている場合、クライアントは現在の再生環境に最も適した翻訳ストリームを再生するように選択する必要があります。<br>
この属性が NO に設定されている場合、翻訳ストリーム コンテンツはユーザーの表示要求に応答するために使用されることを示します。<br>
この属性はオプションです。</p>
<p>INSTREAM-ID: スライスの言語 (レンディション) バージョンを示す二重引用符で囲まれた文字列。<br>
TYPE が CLOSED-CAPTIONS に設定されている場合は、この属性を設定する必要があります。<br>
使用可能な値は、「CC1」、「CC2」、「CC3」、「CC4」、「SERVICEn」(nの値は1〜63)です。<br>
その他の TYPE 値の場合、このプロパティを設定しないでください。</p>
<p>特性: カンマで区切られ、二重引用符で囲まれた 1 つ以上の UTI で構成される文字列。<br>
各 UTI は翻訳フローの特性を表します。<br>
この属性にはプライベート UTI を含めることができます。<br>
この属性はオプションです。</p>
<p>チャンネル: バックスラッシュ / で区切られ、二重引用符で囲まれたパラメータの順序付きリストで構成される文字列。<br>
すべてのオーディオ EXT-X-MEDIA タグには CHANNELS 属性が設定されている必要があります。<br>
マスター プレイリストに、同じエンコーディングでチャネル数が異なる 2 つの翻訳ストリームが含まれている場合は、CHANNELS 属性を設定する必要があります。それ以外の場合、CHANNELS 属性はオプションのパラメーターです。</p>
<p>EXT-X-STREAM-INF: この属性はバックアップソースを指定します。属性値はバックアップソースに関する情報を提供します。<br>
形式は次のとおりです。</p>
<p>#EXT-X-ストリーム-INF:<attribute-list><br>
<uri><br>
で:</p>
<p>URI で指定されたメディア プレイリストには、このタグで指定された翻訳バックアップ ソースが含まれます。<br>
URI は必須のパラメータです。</p>
<p>EXT-X-STREAM-INF タグ パラメータ属性リストには次のオプションがあります。</p>
<p>帯域幅: この属性は、1秒あたりに送信されるビット数(帯域幅とも呼ばれます)を表します。これは、バックアップストリームのピークレートを表します。<br>
この属性は必須のパラメータです。</p>
<p>AVERAGE-BANDWIDTH: この属性は、バックアップ ストリームの平均スライス転送速度です。<br>
この属性はオプションです。</p>
<p>CODECS: カンマで区切られた形式のリストを含む二重引用符で囲まれた文字列。<br>
各 EXT-X-STREAM-INF タグは CODECS 属性を持つ必要があります。</p>
<p>解像度: この属性は、バックアップ ストリーム ビデオ ソースの最適なピクセル解像度を表します。<br>
この属性はオプションのパラメータですが、ビデオ ソースを含むバックアップ ストリームにこの属性設定を追加することをお勧めします。</p>
<p>FRAME-RATE: この属性は、10 進浮動小数点値を使用して、バックアップ ストリーム内のすべてのビデオの最大フレーム レートを表します。<br>
フレーム レートが 30 フレーム/秒を超えるバックアップ ストリーム内のビデオ ソースの場合は、このプロパティ設定を増やす必要があります。<br>
この属性はオプションのパラメータですが、ビデオ ソースを含むバックアップ ストリームにこの属性設定を追加することをお勧めします。</p>
<p>HDCP-LEVEL: この属性値は列挙可能な文字列です。<br>
有効な値はTYPE-0またはNONEです。<br>
TYPE-0 の値は、出力が高帯域幅デジタル コンテンツ保護 (HDCP) によって保護されていない限り、バックアップ ストリームの再生に失敗する可能性があることを示します。<br>
値が NONE の場合、ストリーム コンテンツには出力コピー保護が必要ないことを示します。<br>
異なるレベルの HDCP 暗号化を使用するバックアップ ストリームでは、異なるメディア暗号化キーを使用する必要があります。<br>
この属性はオプションであり、HDCP がないため再生が失敗する可能性がある場合に提供する必要があります。</p>
<p>AUDIO: 属性値は二重引用符で囲まれ、メイン プレイリストのどこかに定義されている、TYPE 属性が AUDIO に設定された EXT-X-MEDIA タグの GROUP-ID 属性値と一致する必要があります。<br>
この属性はオプションです。</p>
<p>VIDEO: 属性値は二重引用符で囲まれ、メインプレイリストのどこかに定義されている、TYPE 属性が VIDEO に設定された EXT-X-MEDIA タグの GROUP-ID 属性値と一致する必要があります。<br>
この属性はオプションです。</p>
<p>SUBTITLES: 属性値は二重引用符で囲まれ、メインプレイリストのどこかに定義されている TYPE 属性が SUBTITLES に設定された EXT-X-MEDIA タグの GROUP-ID 属性値と一致する必要があります。<br>
この属性はオプションです。</p>
<p>CLOSED-CAPTIONS: この属性値は、二重引用符で囲まれた文字列または NONE にすることができます。<br>
値が文字列の場合、マスター プレイリストのどこかに定義されている TYPE 属性が CLOSED-CAPTIONS に設定された EXT-X-MEDIA タグの GROUP-ID 属性の値と一致する必要があります。<br>
この属性の値がNONEの場合、すべてのext-x-stream-infタグでもこの属性をNONEに設定する必要があります。これは、メインプレイリスト内のバックアップストリームにクローズドタイトルがないことを示します。1つのバックアップストリームにクローズドタイトルがある場合、もう1つのバックアップストリームにはクローズドタイトルがない可能性があり、再生が中断される可能性があります。<br>
この属性はオプションです。</p>
<p>EXT-XI-FRAME-STREAM-INF: このタグは、メディア プレイリスト ファイルに複数のメディア リソースの I フレームが含まれていることを示します。<br>
形式は次のとおりです。</p>
<p>#EXT-XI-フレーム-ストリーム-INF:<attribute-list><br>
このタグの属性リストには、EXT-XI-FRAME-STREAM-INFタグと同じ属性リストオプションが含まれます(FRAME-RATE、AUDIO、SUBTITLES、CLOSED-CAPTIONSを除く)。その他の属性には以下が含まれます。</p>
<p>URI: この属性値は二重引用符で囲まれた文字列で、Iフレームメディアプレイリストファイルへのパスを示します。メディアプレイリストファイルにはEXT-XI-FRAMES-ONLYタグが含まれている必要があります。<br>
EXT-X-SESSION-DATA: このタグにより、メイン プレイリストで任意のセッション データを伝送できるようになります。<br>
このタグはオプションです。<br>
形式は次のとおりです。</p>
<p>#EXT-X-セッションデータ:<attribute-list><br>
このうち、パラメータ属性リストの値のオプションは次のとおりです。</p>
<p>DATA-ID: 特定のデータ値を表す、二重引用符で囲まれた文字列。<br>
このプロパティは、逆DNSを使用して命名する必要があります(例:com.example.movie.title)。ただし、中央レジストリが存在しないため、競合が発生する可能性があります。<br>
この属性は必須のパラメータです。</p>
<p>VALUE: 属性値は、DATA-ID で指定された値を含む二重引用符で囲まれた文字列です。<br>
LANGUAGE が設定されている場合、VALUE にはその言語で人間が読める文字列が含まれている必要があります。</p>
<p>URI: 二重引用符で囲まれたURI文字列。URIで示されるリソースはJSON形式である必要があります。そうでない場合、クライアントは解析に失敗する可能性があります。</p>
<p>LANGUAGE: VALUE で使用される言語を示す言語タグを含む二重引用符で囲まれた文字列。</p>
<p>EXT-X-SESSION-KEY: このタグにより、マスタープレイリストはメディアプレイリストの暗号化キーを指定できます。これにより、クライアントはメディアプレイリストから暗号化キーを取得することなく、事前にキーをロードできます。<br>
このタグはオプションです。<br>
形式は次のとおりです。<br>
#EXT-X-セッションキー:<attribute-list><br>
属性リストは EXT-X-KEY と同じですが、METHOD 属性の値は NONE であってはなりません。<br>
プレイリスト タイプのタグ: 次のタグは、マスター プレイリストとメディア プレイリストの両方で設定できます。<br>
ただし、マスター プレイリストに設定されたタグは、マスター プレイリストが指定するメディア プレイリストに再度設定しないでください。<br>
両方のプレイリストに出現する同じタグは、同じ値を持つ必要があります。これらのタグは、プレイリスト内で複数回出現することはできません(一度しか使用できません)。具体的なタグは以下の通りです。</p>
<p>EXT-X-INDEPENDENT-SEGMENTS: このタグは、メディア セグメント内のすべてのメディア サンプルが、他のメディア セグメント情報に依存せずに独立してデコードできることを示します。<br>
このタグは、リスト内のすべてのメディア セグメントに対して有効です。<br>
形式は次のとおりです。</p>
<p>1TP5テキストX独立セグメント<br>
このタグがマスター プレイリストに表示されている場合、すべてのメディア プレイリスト内のすべてのメディア クリップに適用されます。</p>
<p>EXT-X-START: このタグはプレイリストの開始位置を示します。<br>
デフォルトでは、クライアントが再生セッションを開始すると、このタグで指定された位置を使用して再生されます。<br>
このタグはオプションです。<br>
形式は次のとおりです。</p>
<p>#EXT-X-START:<attribute-list><br>
パラメータ属性リストの値の範囲は次のとおりです。</p>
<p>TIME-OFFSET: この属性値は、符号付き 10 進浮動小数点数 (単位: 秒) です。<br>
プレイリストの開始からの時間オフセットを表す正の数値。<br>
負の数は、プレイリスト内のメディア セグメントの最後の位置の前の時間オフセットを表します。<br>
この属性の絶対値はプレイリストの長さを超えてはなりません。超過した場合、ファイルが末尾(正の値)または先頭(負の値)に達したことを意味します。<br>
プレイリストに EXT-X-ENDLIST タグが含まれていない場合、TIME-OFFSET 属性値は再生ファイルの末尾の 3 スライス以内にあってはなりません。</p>
<p>PRECISE: 値は列挙可能な文字列です。<br>
有効な値は YES または NO です。<br>
値が YES の場合、クライアントは TIME-OFFSET を含むメディア セグメントを再生する必要がありますが、そのチャンク内の TIME-OFFSET に先行するサンプル チャンクをレンダリングする必要はありません。<br>
値が NO の場合、クライアントはメディア フラグメント内のすべてのサンプル チャンクのレンダリングを試みる必要があります (SHOULD)。<br>
この属性はオプションであり、指定されていない場合は NO と見なされます。</p>
<p>この時点で、m3u8 関連のタグの導入は完了です。</p>
<p>次に、リソースファイルを取得する具体的な操作について簡単に紹介します。</p>
<p>前述の通り、m3u8ファイルはメディアプレイリストまたはマスタープレイリストのいずれかです。プレイリストの種類に関わらず、その有効なコンテンツは次の2つの構造で構成されます。</p>
<p>#EXT で始まる情報はタグ情報であり、メディア リソースの詳細な説明として使用されます。<br>
残りはリソース情報で、フラグメント リソースのパス (メディア プレイリスト) または m3u8 リソースのパス (マスター プレイリスト) のいずれかになります。<br>
まず、m3u8 ファイルのメディア フラグメントの表現方法を簡単に紹介します。</p>
<p>m3u8ファイルでは、メディアセグメントはフルパスで表すことができます。以下のように記述します。<br>
#EXTINF:10.0,<br>
<a href="http://example.com/movie1/fileSequenceA.ts" rel="nofollow">http://example.com/movie1/fileSequenceA.ts</a><br>
このように、リソースフラグメントを取得するためのパスは、m3u8ファイルに指定されたパス、つまりhttp://example.com/movie1/fileSequenceA.tsになります。</p>
<p>m3u8 ファイルでは、次に示すように、メディア セグメントを相対パスを使用して表すこともできます。<br>
#EXTINF:10.0,<br>
ファイルシーケンスA.ts<br>
これは、フラグメントファイルのパスがm3u8ファイルのパスを基準としていることを意味します。つまり、m3u8の現在のパスがhttps://127.0.0.1/hls/m3u8であると仮定すると、フラグメントファイルfileSequenceA.tsのパスはhttps://127.0.0.1/hls/fileSequenceA.tsとなります。</p>
<p>m3u8ファイル内のメディアフラグメントリソースパスの指定には絶対パスも使用できますが、相対パスを使用することをお勧めします。相対パスは絶対パスよりも軽量で、m3u8ファイルのURLを基準とします。一方、絶対パスを使用すると、m3u8ファイルの内容(文字数の増加)が増加し、ファイルサイズも大きくなり、ネットワーク転送量も増加します。</p>
<p>その他の注意事項<br>
m3u8 プレイリストをリクエストする方法は 2 つあります。1 つは m3u8 URI 経由でリクエストする方法で、その場合ファイルは .m3u8 または .m3u で終わる必要があります。<br>
2つ目はHTTP経由でリクエストを行い、リクエストヘッダーに<a href="https://uzbox.com/ja/%e3%82%bf%e3%82%b0/-253" class="st_tag internal_tag" rel="tag" title="コンテンツ">コンテンツ</a>-Type は application/vnd.apple.mpegurl または audio/mpegurl に設定する必要があります。</p>
<p>解析中は空白行とコメント行は無視されます。</p>
<p>メディア プレイリスト内のストリーミング リソースの合計継続時間は、各スライス リソースの継続時間の合計です。</p>
<p>各スライスのビット レートは、スライスのサイズを対応する継続時間 (EXTINF で指定された継続時間) で割った値です。</p>
<p>同じ属性 AttributeName は、タグの属性リストに 1 回だけ出現できます。</p>
<p>EXT-X-TARGETDURATION で指定された期間は変更できません。通常、この値は10秒の期間を指定します。</p>
<p>EXT-X-FRAMES-ONLY を指定し、そのリソースがメディア初期化ブロックを直接伝送しないスライスの場合、メディア初期化ブロックの取得方法を指定するために EXT-X-MAP タグを追加する必要があります。</p>
<p>EXT-XI-FRAMES-ONLY タグを含む EXT-X-MAP タグを使用するために必要な互換性バージョン番号 EXT-X-VERSION は 5 以上である必要があります。また、EXT-X-MAP のみを使用するために必要な互換性バージョン番号は 6 以上である必要があります。</p>
<p>EXT-X-MAPタグで宣言されたメディア初期化ブロックは、AES-128方式で暗号化できます。この場合、EXT-X-MAPタグに作用するEXT-X-KEYタグはIV属性を設定する必要があります。</p>
<p>END-ON-NEXT=YES属性を持つEXT-X-DATERANGEタグにはCLASS属性が必要ですが、DURATION属性とEND-DATE属性は必要ありません。同じCLASS属性を持つ他のEXT-X-DATERANGEタグで、重複する日付範囲を指定することはできません。</p>
<p>日付範囲に DURATION、END_DATE、END-ON-NEXT=YES 属性が指定されていない場合、PLANNED-DURATION 属性が設定されていても、その期間は不明です。</p>
<p>プレイリストで EXT-X-DATERANGE タグを設定する場合は、EXT-X-PROGRAM-DATE-TIME タグも設定する必要があります。</p>
<p>プレイリストに同じ ID 属性値を持つ 2 つの EXT-X-DATERANGE タグが設定されている場合、同じ属性名に対する 2 つの EXT-X-DATERANGE タグ内の対応する値は一致している必要があります。</p>
<p>EXT-X-DATERANGE が DURATION 属性と END-DATE 属性の両方を設定する場合、END-DATE 属性値は START-DATE 属性値と DURATION 属性値の合計と等しくなければなりません。</p>
<p>EXT-X-MEDIA-SEQUENCE タグは、プレイリストの最初のセグメントの前に表示されなければなりません。</p>
<p>EXT-X-DISCONTINUITY-DEQUENCE タグは、プレイリストの最初のセグメントの前に表示されなければなりません。</p>
<p>EXT-X-DISCONTINUITY-DEQUENCE タグは、すべての EXT-X-DISCONTINUITY タグの前に出現する必要があります。</p>
<p>m3u8ファイルにEXT-X-PLAYLIST-TYPEタグが設定されていない場合、プレイリストはいつでも変更できます。例えば、プレイリスト内のメディアセグメントを更新したり削除したりできます。</p>
<p>各 EXT-XI-FRAME-STREAM-INF タグには、BANDWIDTH 属性と URI 属性が含まれている必要があります。</p>
<p>各 EXT-X-SESSION-DATA タグには、VALUE 属性または URI 属性のいずれかを含める必要がありますが、両方を含めることはできません。</p>
<p>プレイリストには、同じ DATA-ID 属性を持つ複数の EXT-X-SESSION-DATA タグを含めることができますが、同じ DATA-ID と同じ LANGUAGE 属性を持つ複数の EXT-X-SESSION-DATA タグを含めることはできません。</p>
<p>EXT-X-SESSION-KEY が設定されている場合、その METHOD、KEYFORMAT、および KEYFORMATVERSIONS 属性値は、同じ URI の任意の EXT-X-KEY タグの値と同一である必要があります。</p>
<p>複数の代替ストリームまたは複数の言語ストリームが同じ暗号化キーと形式を使用する場合は、EXT-X-SESSION-KEY タグを設定する必要があります。</p>
<p>マスター プレイリストでは、同じ METHOD、URI、IV、KEYFORMAT、および KEYFORMATVERSIONS 属性値を持つ複数の EXT-X-SESSION-KEY タグを設定してはなりません。</p>
<h3 class="typography-headline"><span id="HTTP"><a href="https://developer.apple.com/streaming/"><span>HTTPライブストリーミングとは何かを理解する</span></a></span></h3><div class="kk-star-ratings kksr-auto kksr-align-center kksr-valign-bottom" data-payload="{"align":"center","id":"9800","slug":"default","valign":"bottom","ignore":"","reference":"auto","class":"","count":"0","legendonly":"","readonly":"","score":"0","starsonly":"","best":"5","gap":"5","greet":"评分","legend":"0\5 - (0 votes)","size":"24","title":"m3u8 格式是什么文件?","width":"0","_legend":"{score}\{best} ({count} {votes})","font_factor":"1.25"}">
<div class="kksr-stars">
<div class="kksr-stars-inactive">
<div class="kksr-star" data-star="1" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="2" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="3" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="4" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" data-star="5" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
</div>
<div class="kksr-stars-active" style="width: 0px;">
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
<div class="kksr-star" style="padding-right: 5px"><div class="kksr-icon" style="width: 24px; height: 24px;"></div>
</div>
</div>
</div><div class="kksr-legend" style="font-size: 19.2px;">
<span class="kksr-muted">スコア</span>
</div>
</div>