Posted at

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 のサポートを追加

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

早速触ってみます!


ロールの作成

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

コンソールの IAM > ロール > ロールの作成 に進みます。

このロールを使用するサービス から一旦、EC2 を選んで 次のステップ: アクセス権限 を押下します。


ポリシー

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


  • AmazonS3FullAccess

  • AWSElementalMediaPackageFullAccess


ロール名

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


信頼関係の編集

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

"Service": "ec2.amazonaws.com"

"Service": "mediapackage.amazonaws.com"

に変更します。


入力ソースの作成

最終的に ABR で出力するので、複数帯域の MP4 をあらかじめ用意します。

今回はソースファイルとして big_buck_bunny_1080p_h264.mov を用い、MediaConvert で以下の帯域のファイルを作成しました。

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

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


MediaPackage

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

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

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

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


SMIL

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


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 から取得して反映しているようです。


Packaging group

ようやっと MediaPackage です。

コンソールから MediaPackage にいくと Video on demand のメニューが追加されています。

はじめに Packaging groups から新しい Packaging group を作成します。

id はテキトーに

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

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


  • HLS

  • DASH

  • MS Smooth

  • CMAF

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


Assets

Asset で入力ソースファイル、出力先、Packaging group などを設定します。

Ingest asset で新規アセットを作成します。


Asset access

項目
設定値

S3 bucket name
S3 バケットを選択

IAM role
IAM ロールを選択


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 を利用する際に必要


Packaging settings

項目
設定値

Packaging group
作成済みの Packaging Group を選択

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

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


再生

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

ちゃんと再生されていますね!

もちろん HLS も DASH も Smooth も再生可能です。


制限

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

VOD Content Limits


困ったこと

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

この場合、コンソール上で何もエラーが出ずにあたかも全てが正常に完了しているように見えます。

URL も生成されますが、実際にアクセスすると以下のように 404 が返って視聴できない状況です。

CloudWatch にも異常は記録されず、エラーも吐かない為、どこが悪いのか特定できず。

まあコンテンツなのでしょうが・・・