MediaPackage で VOD を Just-in-Time Packaging

みなさん、こんにちは。
新メンバーが二人増えてチームがとても賑やかになった streampack の木村です。


さて、2019年5月17日に MediaPackage で VOD の Just-in-Time Packaging 機能がリリースされました。

[AWS Elemental MediaPackage、Video On Demand 向けの Just-in-Time Packaging のサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2019/05/aws-elemental-mediapackage-adds-support-for-just-in-time-packaging-for-vod/)

これまでは MediaLive などからのライブフィードのパッケージングのみの対応でしたが、これにより MP4 などのファイルからリアルタイムで HLS や DASH を生成できるようになったとのこと。

早速触ってみます！

# ロールの作成

MediaPackage については既存のロールが用意されていないので、事前準備として VOD Packaging に必要な IAM ロールを作成します。

コンソールの `IAM` > `ロール` > `ロールの作成` に進みます。
`このロールを使用するサービス` から一旦、`EC2` を選んで `次のステップ： アクセス権限` を押下します。


<img width="980" alt="スクリーンショット 2019-06-04 11.50.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/2d9fa175-c1fb-4116-bdd9-8a9fb13d20e7.png">

## ポリシー

アタッチ ポリシーですが今回は動作確認するだけですので、単純に下記2つをアタッチします。

- AmazonS3FullAccess 
- AWSElementalMediaPackageFullAccess 


<img width="998" alt="スクリーンショット 2019-06-04 11.51.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/164b0449-500b-f876-9ac8-44108b7263f5.png">

<img width="997" alt="スクリーンショット 2019-06-04 11.52.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/49d1ad9f-98bd-7fb2-8d45-e3dc009c4dd8.png">

## ロール名

ロール名を `MediaPackage` としてロールを作成します。

<img width="978" alt="スクリーンショット 2019-06-04 11.54.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/bc5a1ec2-0458-da4b-dbcf-75e0e07cb9f5.png">

## 信頼関係の編集

作成したロール `MediaPackage` を開き `信頼関係` を編集します。

**"Service": "ec2.amazonaws.com"**

を

**"Service": "mediapackage.amazonaws.com"**

に変更します。

<img width="1021" alt="スクリーンショット 2019-06-04 11.55.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/c76d3023-7354-0e63-9249-87fd4890614e.png">

# 入力ソースの作成

最終的に ABR で出力するので、複数帯域の MP4 をあらかじめ用意します。
今回はソースファイルとして `big_buck_bunny_1080p_h264.mov` を用い、MediaConvert で以下の帯域のファイルを作成しました。

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

<img width="977" alt="スクリーンショット 2019-06-04 17.01.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/8c389bf1-c3a5-6365-1c96-ebd391befe42.png">

エンコードしたファイルは S3 の所定の場所に出力します。

<img width="1214" alt="スクリーンショット 2019-06-04 17.16.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/c8479b3f-9e73-18e9-3e8e-a2f5f41bf508.png">



# MediaPackage

いよいよパッケージングです。

今回は上記で作成した3種類の MP4 を元に ABR ストリームを生成しますが、ここで<font color="red"> MediaPackage VOD Packaging 特有のお作法があります。</font>

後述する `Asset` の項で入力ソースの指定をするのですが、ここで指定できるのが **.smil** と **.m3u8** のみとなります。

つまり、HLS 化し終わったコンテンツであればそのまま入力に指定して再パッケージングが可能ですが、素の MP4 の場合、SMIL ファイルを作成してそこに利用する MP4 ファイルを指定する必要があります。

## SMIL

上記の例では以下のような SMIL ファイルを作成して S3 の同一ディレクトリーに配置します。

```smil:big_buck_bunny_1080p_h264_abr.smil
<?xml version="1.0" encoding="utf-8"?>
<smil title="">
  <body>
	<switch>
      <video src="big_buck_bunny_1080p_h264_1500.mp4">
      </video>
      <video src="big_buck_bunny_1080p_h264_1100.mp4">
      </video>
      <video src="big_buck_bunny_1080p_h264_750.mp4">
      </video>
	</switch>
  </body>
</smil>
```

こんな感じ。

MediaPackage で利用する SMIL は余計なエレメントやアトリビュートは無視されるので、上記最低限でOKです。
マニフェストに出力される画角やビットレートはソースファイルの Mediainfo から取得して反映しているようです。



<img width="1193" alt="スクリーンショット 2019-06-04 17.32.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/e8fb2219-6150-84bd-f7c8-3ca553587c8b.png">



## Packaging group

ようやっと MediaPackage です。
コンソールから MediaPackage にいくと `Video on demand` のメニューが追加されています。
はじめに `Packaging groups` から新しい `Packaging group` を作成します。

<img width="1257" alt="スクリーンショット 2019-06-04 12.36.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/f8e33efd-b3a9-d10b-62f9-72365425bd75.png">


`id` はテキトーに

<img width="615" alt="スクリーンショット 2019-06-04 12.38.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/73d6b3fd-9551-12b8-69ca-986e64195918.png">

この Packaging group でパッケージの種類の選択と細かい設定が可能です。

対応しているパッケージングタイプは下記4種類です。

- HLS
- DASH
- MS Smooth
- CMAF

<img width="365" alt="スクリーンショット 2019-06-04 12.41.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/3bb965ad-a924-8fdd-3bd4-dccf853d58bf.png">

<img width="1159" alt="スクリーンショット 2019-06-04 12.42.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/ad08a491-cdb4-92ba-381e-50f617d06e12.png">

テストですので名前 `id` と `Package type` だけ変えて、あとは全部デフォルト設定で全種類作ってみました。

<img width="982" alt="スクリーンショット 2019-06-04 12.48.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/d88cacf9-d32f-5e6d-0e0d-aaa94fd11d0f.png">

## Assets

`Asset` で入力ソースファイル、出力先、Packaging group などを設定します。
`Ingest asset` で新規アセットを作成します。

<img width="926" alt="スクリーンショット 2019-06-04 12.51.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/add0d6db-40bb-a79b-5299-ceea69573f86.png">

## Asset access


| 項目      | 設定値 |
|:-----------------|:------------------|
| S3 bucket name | S3 バケットを選択 | 
| IAM role       | IAM ロールを選択 | 

<img width="925" alt="スクリーンショット 2019-06-04 18.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/bf2f5ec6-e605-daa7-4225-a19d878f5d70.png">

## Asset1

入力ソースとして利用可能な拡張子は **.m3u8** か **.smil** のみです。
既に作成済みの HLS (.m3u8) があればそのまま指定可能で、HLS ABR のマスタープレイリストを指定すると、ちゃんと ABR で再パッケージングしてくれます。

MP4 を入力する場合は前述のように .smil ファイルを作成し指定します。


| 項目      | 設定値 | 備考 |
|:-----------------|:------------------|:--|
| File name 　　　　| ファイル名を指定　 | .m3u8 or .smil (.m3u8 のみリストに出現。.smil を指定する場合は完全手入力)　 |
| Id     | Id を指定 | File name に関連してオートコンプリート |
| Resource ID     | オプショナル  | DRM Server を利用する際に必要 |


<img width="915" alt="スクリーンショット 2019-06-04 19.07.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/58983418-8396-4ca7-089c-4bd8280e72a9.png">


## Packaging settings

| 項目      | 設定値 |
|:-----------------|:------------------|
| Packaging group | 作成済みの Packaging Group を選択 | 

<img width="916" alt="スクリーンショット 2019-06-04 18.26.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/f73d07e9-823c-acf6-5535-25d27790b6d3.png">

最後に `Ingest assets` を押すとアセットが作成されます。

<img width="1015" alt="スクリーンショット 2019-06-04 19.09.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/d626925e-471d-f41a-7331-8785543e8bf8.png">

アセット作成は一瞬で、その中身には各パッケージング タイプの URL が記載されており、即座に再生が可能となります。

<img width="975" alt="スクリーンショット 2019-06-04 19.10.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/c3c08fc9-0606-3201-8ee2-ddc80a39dadb.png">

# 再生

生成された CMAF を Mac Safari で再生してみます。

<img width="1060" alt="スクリーンショット 2019-06-04 19.14.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/dcda6e25-5973-0bfd-57c1-209ae296e7fc.png">

ちゃんと再生されていますね！
もちろん HLS も DASH も Smooth も再生可能です。


# 制限

いくつか制限があるので注意です。

[VOD Content Limits](https://docs.aws.amazon.com/ja_jp/mediapackage/latest/ug/limits-vod.html)

# 困ったこと

今回試した中でなぜかは分かりませんが、単一コンテンツ（SMIL に1つだけ MP4 を記載）では問題ないのに、ABR だとうまく動作しないコンテンツがありました。

この場合、コンソール上で何もエラーが出ずにあたかも全てが正常に完了しているように見えます。
URL も生成されますが、実際にアクセスすると以下のように 404 が返って視聴できない状況です。

<img width="1060" alt="スクリーンショット 2019-06-05 11.05.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172426/c6cda2d5-ddde-12f0-e01e-528103d7ba68.png">

CloudWatch にも異常は記録されず、エラーも吐かない為、どこが悪いのか特定できず。
まあコンテンツなのでしょうが・・・