AWS MediaPackageで今年5月に登場したVOD生成機能を使ってmp4ファイルをパッケージングしてみたんですが、
色々ドキュメントに載っていない箇所でつまづいたので所感を書いておきます。
ハマりポイント
1. 入力ファイルがm3u8の場合、親子構造でなければならない。
公式フォーラムにも載っていたんですが、m3u8ファイルを入力に使う場合は、親子構造のマニフェストでなければうまくパッケージングしてくれませんでした。ためしに単一のマスターファイルのみの構成のm3u8ファイルを入力すると、結果的に生成されたurlは404になるようでした(CloudWatchLogsを設定していればログに出る)。MediaPackageではABRできるようなのでその都合上親子構造である必要があるんだと思います。
試しにMedia Convertでmp4ファイルをm3u8にトランスコードしてみると、親子構造でマニフェストファイルが生成されたので、そういうことなんでしょう。
2. SAMPLE-AES(Fairplay)でマニフェストを生成した時のext-x-versionは5
ext-x-versionタグは、HLSにおいてファイルのバージョン互換性を示すためのタグです。
詳細はApple公式のHLSドキュメントに書いてあります。
https://developer.apple.com/documentation/http_live_streaming/about_the_ext-x-version_tag
MediaPackageでHLSなコンテンツを暗号化/DRMする際、AES128暗号化とSAMPLE-AESというアルゴリズムでのDRMがサポートされていますが、FairplayでDRMする際はSAMPLE-AESが用いられます。このSAMPLE-AESがサポートされてるのはdocumentによるとext-x-version5以上のようでした。MediaPackageでは最低対応バージョンの5でマニフェストが生成されるようです。
ちなみにDRMもAES128暗号化もなしで普通のHLSでパッケージングした時のext-x-versionは、下記のように3
で生成されていました。
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=387346,AVERAGE-BANDWIDTH=387346,RESOLUTION=1280x720,FRAME-RATE=23.976,CODECS="avc1.4D401F,mp4a.40.2"
xxxxxxxxxxxxxxxxxx/index_1.m3u8
3. 吐き出されるmp4の形式がライブに引っ張られてる?
吐き出されたmp4のセグメントをみてみると、ヘッダーに本来なければならない動画の長さの情報が格納されていませんでした(DASHにおいて)。
推測ですが、もともとMediaPackageにはライブ動画のパッケージング機能しかなかったためライブの動画形式を引きずっているのではないかと思われます。
動画長が格納されていなくとも再生できないことはありませんが、後々対応して欲しいところですね。
4. パッケージングが終わってなくてもurlが生成されるかも
4GB程度あるmp4コンテンツをパッケージングしてみたところ、アセット生成後すぐにurlが作成されましたが、そのurlにアクセスしてみると404になりました。しかし数秒後に再度アクセスしてみると正常にマニフェストファイルがロードされるという現象が発生。
このことから、MediaPackageではパッケージングが完全に終了していなくともコンパネ上でとりあえず先にurlを表示する仕様になっていると思われます。
この辺は、CloudWatchEventsでパッケージングの終了をフックできるので、何かシステムを作るときはパッケージングの終了をフックにコンテンツを公開させる、みたいなことができそうです。
5. 1つのDASHファイルでマルチDRMできない
AWS ElementalにはSPEKEというDRM周辺機能があります。 https://docs.aws.amazon.com/speke/latest/documentation/what-is-speke.html
こちら側で用意したカスタムなDRMロジックを用いてコンテンツをDRMできる機能らしいです。
さて、MediaPackageではVOD Assets作成時にDRMを施すことができます。先述のSPEKEのI/Oインターフェースに準拠したキーサーバを構築して、パッケージングの際にそのURLを指定するとあら不思議。裏側でキーサーバが返したキーを使ってDRMしてくれるっぽいです。
この機能を使ってWidevineとPlayReady(どちらもDASHをDRMする)でDRMするような設定を作成し、VOD Assetsを作成してみたところ、Common EncryptionにならってDASHにコンテンツ保護情報が2つ埋め込まれるかと思いきや1つしか埋め込まれませんでした。
どういうことかというと↓
下記のスクショはMediaPackageのPackage Configuretionの設定画面です。
DRMの設定をするとMediaPackageが裏で自動でキーサーバにキーをリクエストしてくれます。
その際画像下部のSystem IDsのところにDRMのIDを指定すると、リクエストボディの内容が自動で動的に代わり、どのDRM向けにキーを生成すれば良いのかキーサーバ側で判別できるようになります。
設定フォームにはSystem IDの入力項目が2つあるので、このように( https://docs.aws.amazon.com/speke/latest/documentation/vod-workflow-methods.html )1回のリクエストで2つ分のDRM情報が送られてくるかと思いきや、最初に指定したSystemIDのDRM情報しか送られてこない現象が無限に続きました。もしや2回キーサーバへのリクエストが飛ぶかと思いきや、1回目のリクエストだけで終わるという。。後々フォーラムで質問飛ばしてみたいと思います。
( これはバグなのか? )
6. キープロバイダはRTT2秒程度でタイムアウトする
キーサーバの処理にsleep()を挟み、RTTを少しづつ伸ばすという実験をしてみたところ
だいたいRTT2秒でパッケージング処理がタイムアウトしました。
7. セグメント長の設定が反映されないかも?
セグメント長は、HLSの場合デフォルトで6秒、DASHやCMAFの場合は2秒になっていましたが、生成されたファイルを見てみると設定秒数に関係なく10秒程度になっていました。
何かこちら側の他の設定が悪いのか、原因はわかりませんがフォーラムに問い合わせてみようと思います。
参考文献
- ISO_IEC_23000-19 - https://www.iso.org/standard/71975.html
- デジタル映像の「アーカイブ&デリバリー」に関する技術情報サイト|mpeg.co.jp - http://www.mpeg.co.jp/libraries/mpeg_labo/winPC_26.html