[アップデート] AWS Elemental MediaConvertがCMAF(Common Media Application Format)での出力に対応しました

AWS Elemental MediaConvertがCMAF(Common Media Application Format)での出力に対応していました。実際にCMAF形式に動画を変換し、HLSとmpeg-DASHで共通のセグメントファイルを利用していることを確認しました。
2018.08.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

清水です。AWS Media Servicesの細かなアップデートを追っていくコーナーです。本エントリではAWS Media Servicesの1つでありファイルベースの動画変換サービスであるAWS Elemental MediaConvertのアップデートを取り上げます。2ヶ月ほど前になりますが、2018/06/04に公開されたアップデートではAWS Media ConvertがCMAF (Common Media Application Format)形式での出力が可能になりました。

CMAF (Common Media Application Format)ではセグメントファイルにFragmented MP4を使い、HLSやmpeg-DASHでそれぞれプレイリストファイルを用意すればセグメントファイルを共通化できるという利点がありますね。実際にAWS Elemental MediaConvertでCMAF形式の変換を行い、この点を確認してみました。

AWS Elemental MediaConvertでCMAF(Common Media Application Format)形式に変換してみる

マネージメントコンソールからCMAF形式での変換を行ってみます。ジョブ作成画面で入力についての設定を行ったあと、出力グループを追加します。以下のように出力グループの選択肢としてCMAFが選択可能になっていますね。CMAFを選択して[Select]で進みます。

CMAFグループの設定画面になります。HLSマニフェスト、DASHマニフェスト双方の書き込みが選択できますね。また「セグメントの制御」の項目ではSingle fileSegmented filesが選択できます。今回はSegmented filesを選択しました。送信先となるS3バケット、各出力の名称も設定しおきます。(デフォルトではOutput 1が映像、Output 2が音声となっています。)

続いて映像側となるOutput 1の設定を行います。ビデオコーデックについてはデフォルト設定となっているMPEG-4 AVC (H.264)を選択し、解像度とビットレートについても指定しました。

音声となるOutput 2についてはデフォルトのままです。最後にジョブ設定のIAMロールを設定して、ジョブを作成しましょう。作成後、変換が終わればCMAF形式での変換がS3バケットに出力されます。

CMAF形式で変換されたファイルを確認してみる

続いてAWS Elemental MediaConvertにて出力されたCMAF形式のファイルを確認してみます。プレイリストファイルのベースとなるものは、HLSがSample7.m3u8、mpeg-DASHがSample7.mpdです。このプレイリストファイルをHLSなら対応しているブラウザやVideo.jsなどのプレイヤー、mpeg-DASHならDASH Reference Clientなどで読み込めば変換された動画が再生できることが確認できます。(S3のアクセス権は適切に設定されている必要があります。)以下はDASH Reference Clientで再生してみた例です。

続いて各プレイリストの中身を確認してみます。まずはHLSのプレイリストファイルです。

$ aws s3 cp s3://mybucket/MediaConvertCMAF/Sample7.m3u8 -
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-STREAM-INF:BANDWIDTH=2136736,AVERAGE-BANDWIDTH=2128639,VIDEO-RANGE=SDR,CODECS="avc1.4d4020,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=59.940,AUDIO="program_audio_0"
Sample7_video.m3u8
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="program_audio_0",LANGUAGE="eng",NAME="Alternate Audio",AUTOSELECT=YES,DEFAULT=YES,URI="Sample7_audio.m3u8"

映像自体は続くSample7_video.m3u8、音声についてはSample7_audio.m3u8を参照するとセグメントファイルが辿れそうです。

$ aws s3 cp s3://mybucket/MediaConvertCMAF/Sample7_video.m3u8 -
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="Sample7_videoinit.cmfv"
#EXTINF:12,
Sample7_video_000000001.cmfv
#EXTINF:12,
Sample7_video_000000002.cmfv
#EXTINF:12,
Sample7_video_000000003.cmfv
#EXT-X-ENDLIST
$ aws s3 cp s3://mybucket/MediaConvertCMAF/Sample7_audio.m3u8 -
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:13
#EXT-X-MEDIA-SEQUENCE:1
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="Sample7_audioinit.cmfa"
#EXTINF:12,
Sample7_audio_000000001.cmfa
#EXTINF:12,
Sample7_audio_000000002.cmfa
#EXTINF:12,
Sample7_audio_000000003.cmfa
#EXT-X-ENDLIST

拡張子cmfvcmfaのファイルはバイナリファイルのようで中身を確認することはできませんでしたが、先ほどS3に出力された拡張子cmfvcmfaのファイルをそれぞれセグメントファイルとして参照していることがわかります。

続いてmpeg-DASHのプレイリストファイルについても確認してみます。

$ aws s3 cp s3://mybucket/MediaConvertCMAF/Sample7.mpd -
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:cenc="urn:mpeg:cenc:2013" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" type="static" minBufferTime="PT10S" profiles="urn:mpeg:dash:profile:isoff-main:2011" mediaPresentationDuration="PT35.029S">
  <Period start="PT0S" duration="PT35.029S" id="1">
    <AdaptationSet mimeType="video/mp4" frameRate="60000/1001" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="false">
      <SegmentTemplate timescale="90000" media="Sample7_video_$Number%09d$.cmfv" initialization="Sample7_videoinit.cmfv" duration="1081080" startNumber="1"/>
      <Representation id="1" width="1280" height="720" bandwidth="2000000" codecs="avc1.4d4020"/>
    </AdaptationSet>
    <AdaptationSet mimeType="audio/mp4" segmentAlignment="0">
      <SegmentTemplate timescale="48000" media="Sample7_audio_$Number%09d$.cmfa" initialization="Sample7_audioinit.cmfa" duration="576576" startNumber="1"/>
      <Representation id="2" bandwidth="96000" audioSamplingRate="48000" codecs="mp4a.40.2"/>
    </AdaptationSet>
  </Period>
</MPD>

こちらもHLSと同様、拡張子cmfvcmfaのファイルをそれぞれセグメントファイルとして参照していることがわかります。プレイリストファイルはHLSとmpeg-DASHで異なりますが、セグメントファイルは共通のものが利用できる、というCMAFの利点を確認することができました。

まとめ

AWS Elemental MediaConvertでCMAF(Common Media Application Format)形式での変換を行ってみました。また出力されたファイルを確認し、CMAFの利点の1つであるFragmented MP4のセグメントファイルががHLS、mpeg-DASHで共通であることを確認しました。プレイリストについてはHLS、mpeg-DASHそれぞれ出力され、参照先は異なりますが、共通のセグメントファイルを利用できることでストレージの省容量化、またCDNのキャッシュヒット率の向上なども期待できそうですね。強力なアップデートだと思いました。引き続きAWS Elemental MediaConvert含めたAWS Media Servicesの機能アップデートに注目していきたいと思います。