[MPEG-DASH] MPDのファイル構造

# はじめに
MPEG-DASHによるアダプティブストリーミングについて、JavaScriptAPIとマニフェストファイル（MPD）を紹介します。

# MPEG-DASHのデモ
- https://yunbow.github.io/sample-mpeg-dash/mpd/std/profile_live/Bullfinch.mpd

[dash.jsプレイヤー](https://reference.dashif.org/dash.js/latest/samples/dash-if-reference-player/index.html)を使ってMPEG-DASHを再生することができます。手順は次の通りです。`Stream`のURL欄にMPDファイルのURLを指定します。ここでは、上記のURLを指定してください。`Load`ボタンをクリックすると動画の再生が始まります。

# マニフェストファイル
- Meida Presentation Description（MPD）
- XMLのファイル
- セグメントファイルへのアクセス方法や再生方法が記述されている

MPEG-DASHのマニフェストファイルは、XMLフォーマットで記述されているMPDファイルです。[MPD](#mpd)、[Period](#period)、[AdaptationSet](#adaptationset)、[Representation](#representation)、[Segment](#segment) の要素で構成されています。
<img width="30%" alt="MPD" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/58092cba-61f3-3b9e-1d65-77448c82537f.png">

## MPD
- `profiles`...ライブ配信とオンデマンド配信
    - [Live](#profilelive)
    - [On-Demand](#profileon-demand)
- `minBufferTime`...必要な最小の初期バッファリング時間

MPDファイルのトップ要素は[MPD](#mpd)タグです。複数の[Period](#period)から構成されています。`profiles`属性でライブ配信やオンデマンド配信のようにストリーミングの機能を指定します。プロファイル毎に指定する要素が異なります。

```xml
<MPD mediaPresentationDuration="PT14.414S" minBufferTime="PT8.34S" profiles="urn:mpeg:dash:profile:isoff-live:2011" xmlns="urn:mpeg:dash:schema:mpd:2011">
```

### Profile:Live
- https://yunbow.github.io/sample-mpeg-dash/mpd/std/profile_live/Bullfinch.mpd
- ライブ配信のプロファイル

`profiles="urn:mpeg:dash:profile:isoff-live:2011"`を指定するとライブ配信を行うことができます。しかし、[MPD](#mpd)のプロファイルを指定しただけではライブ配信はできず、WEBサーバー側にリアルタイムにセグメントファイルを生成する機能が必要です。ライブ配信時には、[MPD](#mpd)の有効期限を指定して定期的に[MPD](#mpd)の内容を更新します。

### Profile:On-Demand
- https://yunbow.github.io/sample-mpeg-dash/mpd/std/profile_ondemand/Bullfinch.mpd
- オンデマンド配信のプロファイル

`profiles="urn:mpeg:dash:profile:isoff-on-demand:2011"`を指定するとオンデマンド配信を行うことができます。

## Period
- `start`...再生開始時刻
- `duration`...再生時間

[Period](#period)タグは、コンテンツの情報（映像＋音声の1セット）を表しています。例えば、「番組＋CM」のような組み合わせを1つのMPDファイルに記述することができます。[Period](#period)タグは、複数の[AdaptationSet](#adaptationset)から構成されます。

```xml
<Period start="PT0S" duration="PT0H0M14.421S"></Period>
```

## AdaptationSet
- `lang`...言語

[AdaptationSet](#adaptationset)タグは、言語、字幕や吹替の情報を表しています。例えば、言語毎に、字幕や音声ファイルを指定することが可能です。[AdaptationSet](#adaptationset)タグは、複数の[Representation](#representation)から構成されます。

```xml
<AdaptationSet lang="en" maxHeight="1080" maxWidth="1920" segmentAlignment="true" startWithSAP="1">
```

## Representation
- `bandwidth`...帯域幅
- `mimeType`
- `codecs`...コーデック
- `Initial Segment`...初期のセグメントファイル
- `Media Segment`...セグメントファイル

[Representation](#representation)タグは、映像や音声の帯域幅や解像度、コーデック指定を表します。

```xml
<Representation bandwidth="3992350" mimeType="video/mp4" codecs="avc1.4d401f" frameRate="216000/7207" height="1080" id="video/avc1" scanType="progressive" width="1920"/>
```

### マルチビットレート
- https://yunbow.github.io/sample-mpeg-dash/mpd/std/bitrate_multi/Bullfinch.mpd

[Representation](#representation)タグは、ビットレートが異なるセグメントファイルと帯域幅が異なる`bandwidth`を指定すると、ストリーミング再生時に帯域幅によって自動的に適切なビットレートのセグメントファイルを再生します。

```xml
<Representation bandwidth="4610934" codecs="avc1.4d401f" frameRate="216000/7207" height="1080" id="video/avc1/1" scanType="progressive" width="1920"/>
<Representation bandwidth="2272867" codecs="avc1.4d401f" frameRate="216000/7207" height="720" id="video/avc1/2" scanType="progressive" width="1280"/>
<Representation bandwidth="754112" codecs="avc1.4d401f" frameRate="216000/7207" height="360" id="video/avc1/3" scanType="progressive" width="640"/>
```

## Segment
- `t`...開始時間
- `d`...時間が指定される（計算式＝ `d` / `timescape`）
- `r`...長さが同じ場合は繰り返しが指定される

[Segment](#segment)タグは、1つのセグメントファイルで1つのタグが指定されます。

```xml
<SegmentTemplate initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number%04d$.m4s" startNumber="1" timescale="1000">
  <SegmentTimeline>
    <S d="8342"/>
    <S d="6072"/>
  </SegmentTimeline>
</SegmentTemplate>
```

# おわりに
今回、MPDについて纏めました。
メディアファイルの作成方法や再生方法は別の投稿で紹介していますので
是非ご覧ください。ありがとうございました。

# 関連リンク
- [[MPEG-DASH] 初心者のためのWEBストリーミング入門](https://qiita.com/yun_bow/items/a97ad78615c6ca3a75bb)
- [[MPEG-DASH] Fragmented MP4のファイル構造](https://qiita.com/yun_bow/items/a33266b78d5aab807c71)
- [MPEG-DASH] MPDのファイル構造（本稿）
- [[MPEG-DASH] DRMシステムの概要と種類](https://qiita.com/yun_bow/items/e573f4754579d1627a13)
- [[MPEG-DASH] Bento4でDRMパッケージを行う](https://qiita.com/yun_bow/items/77b86d75e15f245f265b)
- [[MPEG-DASH] dashJSでアダプティブストリーミングを再生する](https://qiita.com/yun_bow/items/88582964c113c8499742)
- [[MPEG-DASH] videoJSでアダプティブストリーミングを再生する](https://qiita.com/yun_bow/items/3cdcb0a4f961d6e1e06d)
- [[MPEG-DASH] パフォーマンスチューニングを行う](https://qiita.com/yun_bow/items/e4e37265643a661021ec)

## 参考リンク
- [MPEG DASHを知る](https://qiita.com/gabby-gred/items/c1a3dbe026f83dd7e1ff)
- [AbemaTV の MPEG-DASH 対応](https://qiita.com/sunfish-shogi/items/008b3da9309b08465604)

以上です。