みなさん、こんにちは。
新メンバーが二人増えてチームがとても賑やかになった 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 の同一ディレクトリーに配置します。
<?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
テストですので名前 id
と Package 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 も再生可能です。
制限
いくつか制限があるので注意です。
困ったこと
今回試した中でなぜかは分かりませんが、単一コンテンツ(SMIL に1つだけ MP4 を記載)では問題ないのに、ABR だとうまく動作しないコンテンツがありました。
この場合、コンソール上で何もエラーが出ずにあたかも全てが正常に完了しているように見えます。
URL も生成されますが、実際にアクセスすると以下のように 404 が返って視聴できない状況です。
CloudWatch にも異常は記録されず、エラーも吐かない為、どこが悪いのか特定できず。
まあコンテンツなのでしょうが・・・