MediaLiveとMediaPackageをCMAF Ingestで連携させてみた!
はじめに
清水です。少し前、2024/04/08のアップデートですが、AWS Elemental MediaLiveがCMAF Ingest output groupをサポートしました。
- AWS Elemental MediaLive now supports CMAF Ingest output group
- AWS Elemental MediaLive が CMAF Ingest 出力グループのサポートを開始
CMAF Ingest (Interface-1)を利用することで同期されたメディアとメターデータをパッケージングオリジンに送信することが可能になります。このMediaLiveのアップデートから遅れることおよそ2ヶ月、2024/06/14付けでMediaPackageでもCMAF IngestのInput typeをサポートするアップデートがありました。
- Cross-region failover now available in AWS Elemental MediaPackage - AWS
- クロスリージョンフェイルオーバーが AWS Elemental MediaPackage で利用可能に - AWS
そこから更に2ヶ月ほど時間が経ってしまいましたが、本エントリではMediaLiveとMediaPackageをCMAF Ingestで連携させてみたので、その手順などをまとめてみたいと思います。
なお、このCMAF Ingest (Interface-1)サポートの真髄は、上記アップデート情報のタイトルにもなっていますがMediaPackageでCross-region failoverが可能になったことにあるかと考えます。以下AWS for M&E Blogにも関連エントリが投稿されていますね。
本エントリではあくまで単一リージョンでのMediaLiveとMediaPackageのCMAF Ingest連携についてまとめ、Cross-region failoverな構成については別エントリで確認したいと思います。
CMAF IngestなInputのMediaPackageリソースの作成
まずはMediaPackageのリソース作成からはじめます。なお、CMAF Ingest Input typeがサポートされているのはMediaPackage v2だけです。MediaPacakge v1では未サポートである点に注意しましょう。
MediaPackageのマネジメントコンソール、Live v2のChannel gropusページ進み[Create channel group]ボタンを押下します。(既存のChannel groupsを使用してChannelの作成からはじめてもかまいません。)
Channel group nameを適切に入力、[Create]ボタンで作成します。
Channel gropuが作成できたら、続いて[Create channel]ボタンでChannelの作成に進みます。
Create channelの画面、以前はNameとDescription、そしてChannel policyの項目しかありませんでした。(例えば「[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO」のエントリなどで当時のスクリーンショットが確認できます。)今回のアップデートでInput typeの選択が追加されていますね。適切なChannel nameを入力、Input typeではアップデート内容であるCMAF
を選択しましょう。
Input typeについてのInfoを確認すると、現在MediaPackageではHLS/TSに加えてCMAF IngestをInputとしてサポートしていることが明記されています。User Guideの以下項目へのリンクも記載されていますね。
User GuideではCMAF Input type利用にあたり細かな条件などが記載されていますので、一度目を通しておきましょう。またChannel作成後のInput typeの変更はできないことが明記されています、この点には注意ですね。そしてCross-region failoverや今後リリースされるその他の機能についてはCMAF Ingestでのみ利用可能となるそうです。可能な場合はCMAF Ingestを使用することを検討しましょう。
Channel policyはアタッチせずに[Create]ボタンでChannelを作成します。作成後、Settingsの項目でInput typeがCMAFとなっていることが確認できます。
続いてOrigin endpointsの項目、[Create endpoint]ボタンでendpointを作成します。Endpoint settingsでNameを適切に入力、Container typeはTS
を利用しました。Additional settingsの項目には今回触りません。
Segment settingsとEncryptionについてもデフォルトのまま進めます。
Endpoint policyについては、今回はAttach a public policy
を選択しました。用途に合わせて適切なものを選択しましょう。
Manifest definitionsの設定です。今回はHLS manifestのみ作成しました。Manifest nameならびにChild manifest nameを適切に入力します。そのほかの項目はデフォルトで進めました。[Create]ボタンでOrigin endpointを作成します。
Origin endpointが作成できました。
続いてMediaLive側の設定に進みますが、上記で作成したMediaPackageリソースのうち Channelの Ingest endpointの情報が必要になります。Channel詳細画面のSettingsの項目、Ingest endpoint 1
の情報をメモしておきましょう。
CMAF IngestなOutputのMediaLiveリソースの作成
続いてMediaLiveリソースの作成です。最近はWorkflow wizardで検証用のMediaLiveリソースを作成することが多く、Output(Video、Audio)のコーデックなど細かな設定を省いてしまうのですが、CMAF Ingest output groupを使用する場合はこの手段が採れません。Channel Templateについても同様です。そのため今回は、 Workflow wizardで作成したChannelのVideo、AudioなどOutput設定を真似ながら新規にChannelを作成する という手段をとりました。
サンプルとなるWorkflowを作成
まずはサンプルとなるWorkflowの作成です。ポイントとなるのはStep 3 Add video outputsの項目です。Output gropuとしてMediaPackageを選択し、Video renditionsでは1080p30
と720p30
の2種類を選択しました。
以下内容でWorkflowを作成し、このChannel設定を参考にします。
Inputの作成
CMAF Ingest output type用のInputの作成です。これは通常のInputと特に変わりありません。Input typeとして今回はRTMP (push)を利用しました。また検証用途ですのでSINGLE_INPUT
で進めました。
Channelの作成
続いてChannelの作成です。Channel and input detailsやGeneral settings、そしてInput attachmentsの設定については通常と特に変わりありませんので省略します。(なおInputと同様、Channel classはSINGLE_PIPELINE
を選択しています。)Output groupの箇所がポイントですね。Add output groupでCMAF Ingest
を選択して[Confirm]します。(送信先がMediaPackageではありますが、CMAF Ingest利用の際にはここでMediaPackage
を選んでは いけません 。)
CMAF ingest groupの設定項目、まずはdestination URLを設定しましょう。先ほどMediaPackageリソース作成の最後で確認したChannelリソースのIngest endpoint 1
の情報(URL)を入力します。Credentialsの項目については空欄のまま進めます。
CMAF Ingest settingsではNameを適切に設定しておきます。そのほかの項目はデフォルトのまま進めました。
CMAF Ingest outputsの項目です。今回のポイントのひとつかと思います。Video renditionについてはWorkflow wizardで作成したChannelを参考にします。Workflowで作成したChannelでは以下のように2つのOutputがあり、その中にVideoとAudioがありますね。
- MediaPackage outputs
- Output 1: emp_1080p30
- Video: emp_1080p30
- Audio 1: audio_mediapackage_0
- Output 2: emp_720p30
- Video: emp_720p30
- Audio 1: audio_mediapackage_1
- Output 1: emp_1080p30
この構成をCMAF Ingest outputで再現しようとしてもうまくいきませんでした。以下のように "For CMAF Ingest Groups, outputs can only contain a video description, 1 audio description, or 1 caption description." とValidation Errorとなってしまいます。VideoとAudioを同一のOutputに混在させるという設定がCMAF Ingest outputで許可されておらず、1つのOutputには1つのVideoもしくはAudioのみを含めるよう設定する必要があるということですね。
結果、以下のように設定を行いました。Outputを合計3つ準備し、2種類の解像度別のVideoとAudioを並べます。
- CMAF Ingest outputs
- Output 1: video_1080p30
- Video: video_1080p30
- Output 2: video_720p30
- Video: video_720p30
- Output 3: audio_aac
- Audio 1: audio_aac
- Output 1: video_1080p30
またそれぞれのOutputについて、先のWorkflow wizardで作成したChannelを参考に設定をしていきます。具体的にはVideoであれば解像度やCodec(H264を使用)、Aspect RatioやRate Control、Frame Rate、GOP Structure、Codec Detailを設定しました。AudioについてはCodec Setting(AACを使用)とそのBitrateというぐあいです。
[Create channel]ボタンでChannelリソースを作成します。なお以下JSONファイルが、上記で作成したChannelから"Download custom template"で得られたテンプレートファイルからリソース固有の情報を除いたものとなります。
medialive-cmaf-ingest-channel-template.json
ライブストリーミングの視聴確認
Output gropu typeとしてCMAF Ingestを指定したMediaLiveリソース、ならびにInput typeとしてCMAF Ingestを指定したMediaPackageリソースが作成できました。実際にこのMediaLive→MediaPackage連携を通してライブストリーミングの視聴を確認してみます。
MediaLive ChannelをStartさせ、手元のMacBook ProのOBS StudioからMediaLive Inputに対して映像を打ち上げます。
MediaPackageのOrigin endpoint画面ででHLS manifest definitionsを確認、今回は[Preview]ボタンから開けるhls.js demoページでライブストリーミングの視聴を確認しました。問題なく視聴ができていますね!
なおライブストリーミングの視聴をしているMediaPackageのOrigin endpointでは、ContainerでTS、Manifest definitionsではHLS manifestのみを設定していました。ライブストリーミングもm3u8ならびにtsファイルで構成されています。MediaLiveとMediaPackageをCMAFで連携させた部分、MediaPackageでのライブストリーミング視聴の際には表立って現れない点に注意しましょう。
MediaLiveのCMAF Ingest Outputはどんなファイルを出力しているのか
MediaLiveとMediaPackageをCMAF Ingestで連携させ、ライブストリーミングを視聴してみました。さてライブストリーミングの視聴ではCMAF Ingestでの連携部分、どんなファイルをMediaLiveが出力しMediaPackageの入力となっているのか、という点の確認ができませんでした。ここではMediaLiveのCMAF Ingest Output group typeでどのようなファイルを出力しているのか、簡単に確認してみたいと思います。
EC2上にWebDAVサーバを構築し、MediaLiveのCMAF Ingest Output groupの出力先をそのWebDAVサーバに向けます。EC2上で実際にどんなファイルが出力されているのかを確認するという算段です。
WebDAV on EC2な環境は以下ブログエントリの手順をもとにnginxで準備しました。
MediaLive Channelリソースで[Edit channel]]、cmaf-ingest output groupsのCMAF Ingest destination AのURLをWebDAV on EC2のものに変更します。
MediaLive ChannelをStartさせ、OBS Studioから映像を打ち上げます。EC2上でMediaLiveから書き込まれているファイルを確認してみましょう。以下のように、Streams(audio_aac.cmfa)
、Streams(video_720p30.cmfv)
、Streams(video_1080p30.cmfv)
の3つのファイルが作成されています。このそれぞれのファイルは適宜更新されているようで、確認するたびに異なるファイル容量となっていることがわかりました。
[ec2-user@ip-10-82-21-86 medialive-cmaf-ingest]$ date; ls -l
Mon Aug 19 03:13:56 UTC 2024
total 880
-rw-rw-r--. 1 nobody nobody 32543 Aug 19 03:13 'Streams(audio_aac.cmfa)'
-rw-rw-r--. 1 nobody nobody 691577 Aug 19 03:13 'Streams(video_1080p30.cmfv)'
-rw-rw-r--. 1 nobody nobody 175447 Aug 19 03:13 'Streams(video_720p30.cmfv)'
[ec2-user@ip-10-82-21-86 medialive-cmaf-ingest]$ date; ls -l
Mon Aug 19 03:14:03 UTC 2024
total 696
-rw-rw-r--. 1 nobody nobody 32684 Aug 19 03:14 'Streams(audio_aac.cmfa)'
-rw-rw-r--. 1 nobody nobody 522400 Aug 19 03:14 'Streams(video_1080p30.cmfv)'
-rw-rw-r--. 1 nobody nobody 153198 Aug 19 03:14 'Streams(video_720p30.cmfv)'
なおこのStreams(video_1080p30.cmfv)
などのファイル単体をVLC media playerなどいくつかのPlayerで再生できるか確認してみたのですが、再生・視聴はできませんでした。CMAF Ingest形式に対応したPlayerなどが別途必要になるのかな、と認識しています。
まとめ
CMAF Ingest Output GropuなMediaLiveとCMAF Ingest InputなMediaPackageを連携させてライブストリーミングを行ってみました。基本的な手順は通常のMediaLiveとMediaPackage連携と変わらないかと思います。MediaPackageではv1ではなくv2の利用が必要であること、またChannel作成時にInput typeを選択しますがこの変更ができないことに注意しましょう。MediaLiveではOutput groupでCMAF Ingestを指定します。Workflow wizardやChannel templateでは現在CMAF Ingest Output Groupに対応したものがない点にも注意しましょう。
今回はシンプルに単一リージョンでのCMAF Ingestを使ったMediaLiveとMediaPackageの連携を確認しました。冒頭にも記載しましたが今回のCMAF Ingest対応アップデート、真髄はCross-region failoverを考慮したライブストリーミングアーキテクチャが容易に構成できるようになったことかと考えます。こちらについては別エントリにてまとめてみたいと思います。