AWS MediaConvert で CMAF を試す！

こんにちは！
今月発売の某誌に寄稿する記事がようやっと書き終わって開放感に浸っている streampack 木村です。

ちょっと時間が経ってしまっていますが AWS MediaConvert と MediaPackage が CMAF に対応しましたね。

[AWS Elemental MediaConvert が、CMAF 出力を追加](https://aws.amazon.com/jp/about-aws/whats-new/2018/06/aws-elemental-mediaconvert-adds-cmaf-output/)

これで以前に Bento4 で作成したのと同じことが MediaConvert でもできるようになりました。

<以前の記事>
[HLS と MPEG-DASH でメディアを共通化してみる](https://qiita.com/tomopyonsama/items/d520af4a6198da5af928)

そこで今回は MediaConvert を使って CMAF を作成し、HLS と DASH の両方で再生可能か確認してみます。

# MediaConvert

## ジョブの作成

MediaConvert のコンソールから`ジョブの作成`をクリックします。

### 入力設定

S3 にアップした適当なファイルを指定します。
テストなのでその他の設定は弄りません。

<img width="1105" alt="スクリーンショット 2018-07-12 17.20.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/b2015600-a536-4ebe-8599-943f3e7a3868.png">

### 出力設定

`出力グループ` を `追加` して `CMAF` を選択します。

<img width="609" alt="スクリーンショット 2018-07-12 17.19.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/7f52fe69-1d0e-e8cc-af6c-4beb27f67138.png">

出力として `Output1` と `Output2` の2つが用意されます。
ここが従来の HLS との大きな違いで、映像のみのファイルと音声のみのファイルをそれぞれ作成します。


<img width="1113" alt="スクリーンショット 2018-07-12 17.22.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/172426/100bd1a4-350b-7be7-33d7-0b731aab51e2.png">


その他設定項目の説明と留意点です。

| 項目       |  設定値 |  備考   |
|:-----------------|:------------------|:------------------|
|カスタムグループ名|任意|無くても可          |
|送信先|S3のどっか||
|セグメントの制御|Single File or Segmented Files|単一ファイルか分割ファイルかを選択|
|フラグメントの長さ（秒）|Fragmented MP4(fMP4)にするのでフラグメントの長さを指定|
|セグメントの長さ（秒）|セグメント長を指定||
|HLS マニフェストの書き込み|有効化でマニフェスト生成||
|DASH マニフェストの書き込み|有効化でマニフェスト生成||
|Output1 名前修飾子|任意の値|Output2 とは異なる名前を設定すること|
|Output２ 名前修飾子|任意の値|Output1 とは異なる名前を設定すること|

<font color="Red">注：Output 名前修飾子ですが 1 と 2 で必ず異なる名前を設定する必要があります。
両方未設定もダメで、そうすると、HLS 出力で映像と音声のプレイリスト名がコンフリクトして一つしか生成されなくなります</font>




次に `Output1` と `Output2` の中身ですが、テストなので何もいじらずにデフォルトのままで H.264 と AAC で出力させます。

`作成` を押して待つこと数分。
S3 に以下のファイルが出力されます。

```
$ aws s3 ls s3://xxxx/encoded/cmaf/bbb1500/
2018-07-03 15:00:36          0
2018-07-12 17:03:45        402 bigbuckbunny_1500.m3u8
2018-07-12 17:03:46       1367 bigbuckbunny_1500.mpd
2018-07-12 17:01:06    7316253 bigbuckbunny_1500audio.cmfa
2018-07-12 17:03:45       5763 bigbuckbunny_1500audio.m3u8
2018-07-12 17:01:06  372919133 bigbuckbunny_1500video.cmfv
2018-07-12 17:03:44       6069 bigbuckbunny_1500video.m3u8
```

`.cmfv` が映像ファイル、`.cmfa` が音声ファイルになります。
`m3u8`と`mpd`　の2つのマニフェストファイルが生成されているのが確認できますね。

# 視聴

S3のコンテンツを Public にして HLS と DASH をそれぞれ視聴してみます。

## HLS

Mac の Safari の URL 欄に以下を入力

```
https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/encoded/cmaf/bbb1500/bigbuckbunny_1500.m3u8
```
## DASH

DASH IF Reference Player を使って再生します。

http://reference.dashif.org/dash.js/v2.8.0/samples/dash-if-reference-player/index.html 

```
https://s3-ap-northeast-1.amazonaws.com/{S3 bucket}/encoded/cmaf/bbb1500/bigbuckbunny_1500.mpd
```

## 結果

両方共問題なく再生できました。

![IMG_3995 2.JPG](https://qiita-image-store.s3.amazonaws.com/0/172426/17d6a231-1663-8306-6bce-509ce2e13615.jpeg)


(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org

<font color="Red">注： DASH IF Reference Player で再生する DASH コンテンツは、映像ファイルと音声ファイルが独立している必要があり、映像音声が混成されたメディアファイルを再生するとエラーになります。
MediaConvert で `出力` を `DASH` にするとデフォルトでは映像音声混成の単一ファイルが出力されるので注意が必要です。</font>

# まとめ

前回も書きましたが、HLS と DASH を別々に作成する手間が省け、ファイルも同じものが使えるので合理的です。
iOS10 以降では HLS fMP4 をサポートしており、既に iOS9 のサポートは終わっているので、そろそろ
本格的に HLS TS は切り捨て対象になりそうですね。