* 仕様書

[REFS[
- [2] [CITE@en[RFC 8216 - HTTP Live Streaming]] ([TIME[2018-04-11 20:05:57 +09:00]]) <https://tools.ietf.org/html/rfc8216#section-2>
- [4] [CITE@en[RFC 8216 - HTTP Live Streaming]] ([TIME[2018-04-11 20:05:57 +09:00]]) <https://tools.ietf.org/html/rfc8216#section-3>
]REFS]

* 媒体セグメント (HLS)

[5] [DFN[[RUBYB[媒体セグメント]@en[Media Segment]]]]は、
[[URL]] と、
省略可能な[[バイト範囲]]によって指定されます。 [SRC[>>4]]

[3] データは [[HTTP]] で伝送する[SHOULD[べき]]ですが、
一般に[[資源]]を要求に応じて転送できる[RUBYB[[[信頼]]できる]@en[reliable]][[プロトコル]]であれば、
どんなものでも使えます。 [SRC[>>2]]

[8] [[媒体セグメント]]は、それぞれ固有の[[整数]]である[DFN[[RUBYB[媒体連番]@en[Media Sequence Number]]]]を持ちます。
[[媒体プレイリスト]]の最初の[[媒体セグメント]]の[[媒体連番]]は、
[N[0]] または[[プレイリスト]]で宣言された値です。
その他の[[媒体セグメント]]の[[媒体連番]]は、
直前の[[媒体セグメント]]の[[媒体連番]]に [N[1]] 加えたものです。 [SRC[>>4]]

[7] [[媒体セグメント]]の時間の長さ ([[duration]]) は、
[[媒体プレイリスト]]の [CODE[EXTINF]] タグで表されます [SRC[>>4]]。

** データ

[12] [[媒体セグメント]]は、[[仕様書]]で定められたいずれかの[[媒体形式]]でなければ[MUST[なりません]]。
それ以外の形式の輸送は未定義です。 [SRC[>>4]]

[13] [[媒体形式]]によっては[[媒体セグメント]]の[[構文解析]]の前に[[構文解析器]]初期化のための共通の[[バイト列]]が必要となります。
これを[DFN[[RUBYB[媒体初期化区]@en[Media Initialization Section]]]]といいます。
[[媒体初期化区]]は、
[CODE[EXT-X-MAP]] [[タグ]]で指定できます。
[[媒体初期化区]]は[[標本データ]]を含んでは[MUST[なりません]]。 [SRC[>>4]]

[9] [[媒体セグメント]]は、
前の[[媒体連番]]の[[媒体セグメント]]の末尾からの続きの符号化ビット列を伝搬しなければ[MUST[なりません]]。
ここで、[[タイムスタンプ]]や [[Continuity Counter]] のような系列は中断なく連続していなければ[MUST[なりません]]。
ただし、[[媒体プレイリスト]]の最初の[[媒体セグメント]]と、
非連続と明示的に示された[[媒体セグメント]]を除きます。
そうでない非連続性は、 [[playback error]] となります。
[SRC[>>4]]

[10] [[動画]]を含む[[媒体セグメント]]は、
[[動画]]の[[復号器]]を初期化し[[媒体セグメント]]の最終[[フレーム]]を含む連続した[[フレーム]]群を[[復号]]するに十分な情報を含む[SHOULD[べきです]]。
[[媒体セグメント]]中のすべての[[フレーム]]を[[復号]]できる十分な情報が[[媒体セグメント]]に含まれる場合に、
[RUBYB[[[ネットワーク効率性]]]@en[network efficiency]]が最適化されます。
[SRC[>>4]]

[11] 例えば [[H.264]] [[動画]]を含む[[媒体セグメント]]は、
[[IDR]] ([[Instantaneous Decoding Refresh]]) を含む[SHOULD[べき]]です。
最初の [[IDR]] までの[[フレーム]]は[[ダウンロード]]されても捨てられるかもしれません。
[SRC[>>4]]

*** MPEG2 TS

[14] [[ISO/IEC 13818]] [[MPEG-2 Transport Stream]] を使うことができます
[SRC[>>4]]。

[15] [[MPEG2 TS]] の[[媒体初期化区]]は、
[[PAT]] ([[Program Association Table]]) の後に
[[PMT]] ([[Program Map Table]]) を続けたものです。 [SRC[>>4]]

[16] [[Transport Stream Segments]] は、
[[MPEG-2 Program]] を1つだけ含まなければ[MUST[なりません]]。
[[Multi-Program Transport Streams]] の [[playback]] は未定義です。 [SRC[>>4]]

[17] 各 [[Transport Stream Segment]] は、 
[[PAT]] と [[PMT]] を含むか、または [CODE[EXT-X-MAP]] [[タグ]]を持たなければ[MUST[なりません]]
[SRC[>>4]]。

[18] [[媒体セグメント]]の最初の2つの [[Transport Stream]] パケット群は、
[CODE[EXT-X-MAP]] [[タグ]]がない場合には、
[[PAT]] と [[PMT]] である[SHOULD[べき]]です。 [SRC[>>4]]

*** 断片化 MPEG4

[19] [[ISO Base Media File Format]] の [[MPEG-4 Fragment]] を使うことができます
[SRC[>>4]]。

[20] [[MPEG-4 Fragment]] は、
(通常の [[MPEG-4ファイル]]のように [[Movie Box]] ([CODE[moov]]) と
[[Media Data Box]] ([CODE[mdat]]) を持つのではなく、)
[[Movie Fragment Box]] ([CODE[moof]]) と
[CODE[Media Data Box]] ([CODE[mdat]]) を持ちます。
[[MPEG-4 Fragment]] の利用においては初期化のため [[Movie Box]] ([CODE[moov]])
が必要ですが、 [[Movie Box]] は標本に依存しないトラックや標本の説明だけを含みます。
[SRC[>>4]]

[21] [[Fragmented MPEG-4]] ([[fMP4]]) [[媒体セグメント]]は、
[[ISO Base Media File Format]] 第3章で定義された「segment」
であって、 [[ISO Base Media File Format]] 8.16節の
[[Media Data Box]] 群の制約を含むものです。 [SRC[>>4]]

[22] [[fMP4]] [[媒体セグメント]]の[[媒体初期化区]]は、
当該[[媒体セグメント]]の[[構文解析器]]を初期化できる
[[ISO Base Media File]] です。
次の制約を持ちます。 [SRC[>>4]]

- [23] [[File Type Box]] ([CODE[ftyp]]) を含み、
その [[brand]] は [CODE[iso6]] [[以上]]と互換なものでなければ[MUST[なりません]]。
- [24] その直後は [[Movie Box]] でなければ[MUST[なりません]]。
- [25] [[Movie Box]] は[[媒体セグメント]]の全 [[Track Fragment Box]]
([CODE[traf]]) に関する ([CODE[track_ID]] の一致する) [[Track Box]] ([CODE[trak]]) 
を含まなければなりません。
- [26] [[Track Box]] は[RUBYB[標本表]@en[sample table]]を含む[SHOULD[べき]]です。
その標本数は [N[0]] でなければ[MUST[なりません]]。
- [27] [[Movie Header Boxes]] ([CODE[mvhd]]) と
[[Track Header Boxes]] ([CODE[tkhd]])
の [[duration]] は [N[0]] でなければ[MUST[なりません]]。
- [28] 最後の [[Track Box]] の次は
[[Movie Extends Box]] ([CODE[mvex]])
でなければ[MUST[なりません]]。

;; [29] [[Common Media Application Format]] ([[CMAF]]) は、
この要件をすべて満たします。 [SRC[>>4]]

[30] [[fMP4]] [[媒体セグメント]]にあっては、
[[Track Fragment Box]] は [[Track Fragment Decode Time Box]] ([CODE[tfdt]])
を含まなければ[MUST[なりません]]。
[[movie-fragment-relative addressing]] を使わなければ[MUST[なりません]]。
[[external data reference]] を使っては[MUST[なりません]]。

;; [31] [[CMAF Segment]] はこの要件を満たします [SRC[>>4]]。

[32] 
[[fMP4]] [[媒体セグメント]]は、
[CODE[EXT-X-I-FRAMES-ONLY]] [[タグ]]を含む[[プレイリスト]]にある場合には、
[[intra-coded frame]] ([[I-frame]]) [[標本データ]]に続く
[[Media Data Box]] の部分を省略できます。 [SRC[>>4]]

[33] 
[[媒体プレイリスト]]中の各 [[fMP4]] [[媒体セグメント]]は、
[CODE[EXT-X-MAP]] [[タグ]]を持たなければ[MUST[なりません]] [SRC[>>4]]。

*** Packed Audio

[34] [[Packed Audio]] を使うことができます。 [SRC[>>4]]

[35] [[Packed Audio]] の[[媒体セグメント]]は、
符号化された[[音声]]の[[標本]]と [[ID3タグ]]を含み、
最小限の [[framing]] を行い、
[[標本]]ごとの[[タイムスタンプ]]は持たないものです。 [SRC[>>4]]

[36] [[ISO/IEC 13818-7]] [[AAC]] with [[ADTS]] framing]]、
[[MP3]]、
[[AC-3]]、
[[Enhanced AC-3]]
に対応しています。 [SRC[>>4]]

[38] [[Packed Audio]] の[[媒体セグメント]]は、
最初の[[標本]]の[[タイムスタンプ]]を [[ID3 Private frame]] ([CODE[PRIV]]) 
タグで先頭に含めなければ[MUST[なりません]]。
その [[ID3 PRIV所有者識別子]] は [CODE[com.apple.streaming.transportStreamTimestamp]] で、
[[ID3 payload]] は
33ビット [[MPEG-2 Program Elementary Stream]] [[タイムスタンプ]]を[[大エンディアン]]の8バイト
(上位31ビットは [N[0]]) で表したものでなければ[MUST[なりません]]。
[SRC[>>4]]

[39] [[クライアント]]は、この [[ID3タグ]]を持たない
[[Packed Audio]] [[媒体セグメント]]を[[再生]]する[SHOULD[べきではありません]]。
[SRC[>>4]]

[37] [[媒体初期化区]]はありません。 [SRC[>>4]]

*** WebVTT

[40] [[WebVTT]] により [[subtitle]] を伝搬できます [SRC[>>4]]。

[41] [[WebVTT]] [[媒体セグメント]]は、
[[WebVTT section]] です。 
[[媒体セグメント]]の [CODE[EXTINF]] [[duration]] で示された期間に表示されることを意図した
[[subtitle cue]] をすべて含まなければ[MUST[なりません]]。
[SRC[>>4]]

[43] [[cue]] の [[start time offset]] と [[end time offset]] は、
[[cue time range]] が[[媒体セグメント]]の期間の外側にまたがる場合であっても、
表示時間全体を表すものとしなければ[MUST[なりません]]。 [SRC[>>4]]

[44] [[媒体セグメント]]に [[cue]] が含まれなくてもよく、
当該期間に [[subtitle]] が表示されないことを表します。 [SRC[>>4]]

[42] [[媒体初期化区]]は、 [[WebVTTヘッダー]]です。 [SRC[>>4]]

[45] [[WebVTT]] の[[媒体セグメント]]は、
[[WebVTTヘッダー]]から始まるか、
[CODE[EXT-X-MAP]] [[タグ]]を持たなければ[MUST[なりません]] [SRC[>>4]]。

[46] [[WebVTTヘッダー]]には、
[[音声]]や[[動画]]と [[subtitle]] の[[タイムスタンプ]]の[[同期]]のため、
[CODE[X-TIMESTAMP-MAP]] [[メタデータヘッダー]]を追加する[SHOULD[べきです]]。
これは [[WebVTT]] [[cue timestamp]] を[[変種ストリーム]]の他の [[Rendition]]
の [[MPEG-2]] ([[PES]]) [[timestamp]] に[[写像]]するものです。
[SRC[>>4]]

[47] 構文は [CODE[X-TIMESTAMP-MAP=LOCAL:<cue time>,MPEGTS:<MPEG-2 time>]]
となります。 [SRC[>>4]]

[EG[
[48] 例えば
[CODE[X-TIMESTAMP-MAP=LOCAL:00:00:00.000,MPEGTS:900000]]
のように記述します。 [SRC[>>4]]
]EG]

[49] [CODE[LOCAL]] 属性の [[cue timestamp]] は、
[[媒体セグメント]]の期間の外側であっても構いません。 [SRC[>>4]]

[50] [[クライアント]]は、 [[WebVTT]] の[[媒体セグメント]]が
[CODE[X-TIMESTAMP-MAP]] を持たない場合、
[[WebVTT]] [[cue time]] [N[0]] が
[[MPEG-2]] timestamp [N[0]]
に[[写像]]されるとしなければ[MUST[なりません]]。 [SRC[>>4]]

[51] [[クライアント]]は、[[タイムスタンプ]]の[[同期]]にあたり、
33ビット [[PES]] [[タイムスタンプ]]が wrap されており、
[[WebVTT]] [[cue timestamp]] は wrap されていない場合を考慮する[SHOULD[べきです]]。
[SRC[>>4]]




** 文脈

[6] [[媒体セグメント]]は、
[[媒体プレイリスト]]に含まれます [SRC[>>4]]。

* メモ

[1] [CITE@en[Media Source Extensions™]]
([TIME[2016-11-17 04:05:37 +09:00]])
<https://w3c.github.io/media-source/#media-segment>