[UPDATE] AWS Elemental MediaPackage v2がDASH manifestをサポートしました!

MediaPackage v1でサポートしていながらもv2では未サポートだった機能の1つ、ライブ配信でのDASHの利用が新たに可能になりました!Container typeでCMAFを選択してDASH manifestを追加しましょう。
2024.04.30

はじめに

清水です。AWS Media Servicesの細かなアップデートを抑えておこうのコーナー、本エントリでは昨年2023年にリリースされたAWS Elemental MediaPackage v2DASH manifestをサポートしたアップデートについてお届けします!本アップデート、2024/04/30の時点でWhat’s New at AWSでの掲載はないのですが、AWS Elemental MediaPackage v2 User GuideのDocument historyに2024/04/19付けで記載がされています。

Document history for the MediaPackage User Guide - AWS Elemental MediaPackage

MediaPackage v2がDASH manifestをサポート

本エントリ執筆時点(2024/04/30)でDocument historyの「Support for DASH」の文字列(リンクになっている箇所)をクリックすると「How MediaPackage works」のページに遷移します。DASH manifestサポートの具体的なアップデート内容についてここから確認できないのですが、以下のページなどからMediaPackage v2のOrigin endpointでContainer typeとしてCMAFを指定することで、DASH形式のマニフェストを出力として利用可能になっていることが確認できます。

個人的には「あれ?MediaPackage v2ってDASHをまだサポートしてなかったんだ」とサポート状況をきちんと把握できていませんでした……。反省も込めて、MediaPackage v2のEndpointのサポート状況などを振り返っておきます。

まずは2023年5月のMediaPackage v2リリース時点のスクリーンショットを確認してみましょう。(リリース時のブログエントリ「[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO」から引用しています。)Container typeとしてTSとCMAFの選択が可能ですが、それぞれの説明ではAllow HLS and LL_HLS manifestsと、HLSとLL-HLSのみのサポートである点が記載されています。

[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO

Manifest definitionsの項目でも、選択できるのはHLS manifestsもしくはLow-latency HLS manifestsの2種類のみという状況でした。

[速報] low-latency HLSにも対応したMediaPackage v2がリリースされました![NEW] | DevelopersIO

その後のMediaPackage v2のアップデートを確認しても、DASH manifestのサポートはこれまでにありませんでした。なんで自分は勘違いしていたのかなと思い返してみると、MediaPackage v1については2017年末のリリース当時からDASHをサポートしていたようです。(これに引っ張られていたのかな、と言い訳しておきます……。)

その他の情報ソースからもMediaPackage v2のDASH manifestサポートについて確認しておきましょう。AWS CLIについては、2024/04/17付けのv1.32.85でDASH manifest向けの更新がありました。

  {
    "category": "``mediapackagev2``",
    "description": "Dash v2 is a MediaPackage V2 feature to support egressing on DASH manifest format.",
    "type": "api-change"
  },

Bumping version to 1.32.85 · aws/aws-cli@74ae811 · GitHub

また外部サイトとなりますが、AWS API ChangesMediaPackage v2ページからも、DASH manifestのサポート開始(と、v2リリースからこれまでに同様のアップデートがなかったこととともに)が確認できます。

上記ページで確認できるように、API実行時に指定できるDashManifestsという設定内容が追加されていますね。念のため確認したところ、MediaPackage v2の一つ前のアップデートではこの設定内容はありませんでした。

MediaPackage v2でDASHのライブ配信をしてみた

アップデート内容についてきちんと整理できたところで、実際にMediaPackage v2でDASH manifestを使ったライブストリームを行ってみます。MediaPackage v2のChannel groupとChannelについては以下ブログエントリと同様の手順で作成したものを準備しました。ライブストリーミングに必要なMediaLiveリソースについても同様の手順で準備しておきます。(それぞれの作成手順について、本エントリでは省略します。)

以下、DASH manifest用のOrigin endpoint作成から手順を確認していきます。Channelの詳細画面でOrigin endpointsの項目の[Create endpoint]ボタンから進みます。

NameとDescriptionを適切に選択します。Container typeの項目、CMAFの説明でAllow HLS, LL-HLS and DASH manifestsとDASH manifestについての記載がありますね。CMAFを選択して進みます。

Segment settingsとEncryptionについてはデフォルトの設定のままにしました。

Endpoint policyではAttach a public policyを選択しました。今回は検証目的ですので、特にアクセスに制限は行わないものとします。実際の運用ではCloudFront OACを利用するなど適切にアクセス制限を行いましょう。)

最後のManifest definitionsの項目を確認します。HLS manifestsLow-latency HLS manifestsに続いて、DASH manifestsが追加されていますね![ADD DASH manifest]ボタンを押下しましょう。

DASH manifestが追加されます。今回はManifest nameのみ設定しました。デフォルトの通りindexとしています。そのまま[Create]ボタンを押下してOrigin endpointを作成します。

Advanced manifest configurationの項目について、Endpointはデフォルト設定のまま作成していますが、確認のための内容を展開してみました。HLSやLL-HLSに比べて設定できる項目が多そう、というのが個人的な感想です。(なお、筆者はHLSを利用することが多く、DASHについてはあまり馴染みがない故の感想かとも思います。)

DASH manifestを設定したEndpointが作成できました。

Manifest settingsのタブを確認すると、設定内容の詳細が確認できます。こちらもHLS、 Low-latency HLSのあとにDASHが並んでいますね。

実際にライブストリームを行ってDASH形式の配信を確認してみます。MediaLiveのChannelをStartさせ、Streaming Softwareから映像を打ち上げます。先ほど確認した「DASH manifest definitions」の項目の[Preview]ボタンを押下してみましょう。Dash JavaScript Playerが開きます。右上の[Load]ボタン押下でDASH形式でのライブストリームの再生がはじまりますね!

DASHのマニフェストファイル自体についても確認してみましょう。DASH manifest definitionsの項目で確認できるURLに対してcurlコマンドでGETリクエストを行いました。DASH形式のマニフェストファイルが取得できています。

% curl -i "https://xxxxxx.egress.xxxxxx.mediapackagev2.ap-northeast-1.amazonaws.com/out/v1/mediapackage-v2-channel-group/mediapackage-v2-channel/mediapackage-v2-dash-manifest/index.mpd"
HTTP/2 200
date: Tue, 30 Apr 2024 08:04:46 GMT
content-type: application/dash+xml
content-length: 2645
x-amzn-requestid: 7cxxxx42-4xx2-4xxb-8xx4-d0xxxxxxxx4f
x-amzn-mediapackage-endpoint-id: mediapackage-v2-dash-manifest
access-control-allow-origin: *
x-amzn-mediapackage-channel-uniqueid: f3xxxxxxxxxxxxxxxxxxxxxxxxxxxx9c
x-amzn-mediapackage-manifest-last-sequence: 69
x-amzn-mediapackage-manifest-last-updated: 1714464275116
x-amzn-mediapackage-endpoint-uniqueid: 8cxxxxxxxxxxxxxxxxxxxxxxxxxxxxb8
cache-control: max-age=3
access-control-expose-headers: x-amzn-requestid,x-amzn-errortype,x-amzn-mediapackage-last-sequence,x-amzn-mediapackage-last-updated,Content-Encoding,Date
x-amzn-mediapackage-active-input: 1
x-amzn-mediapackage-channel-id: mediapackage-v2-channel
access-control-allow-credentials: true

<MPD id="0" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="dynamic" minimumUpdatePeriod="PT6S" minBufferTime="PT5S" timeShiftBufferDepth="PT1M0.165S" suggestedPresentationDelay="PT10S" availabilityStartTime="2024-01-01T00:00:00.000000+00:00" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:mspr="urn:microsoft:playready" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" publishTime="2024-04-30T08:04:46.000498+00:00">
  <Period id="1714463866116" start="PT2887H57M46S">
    <AdaptationSet id="2137622408" contentType="video" mimeType="video/mp4" segmentAlignment="true">
      <SegmentTemplate timescale="60000" media="segment_$RepresentationID$_$Number$.mp4" initialization="segment_$RepresentationID$_0_init.mp4" startNumber="60" presentationTimeOffset="138000">
        <SegmentTimeline>
          <S t="21738000" d="360000" r="9"/>
        </SegmentTimeline>
      </SegmentTemplate>
      <Representation id="1" bandwidth="5000000" frameRate="30/1" codecs="avc1.640028" width="1920" height="1080"/>
      <Representation id="2" bandwidth="3000000" frameRate="30/1" codecs="avc1.64001F" width="1280" height="720"/>
    </AdaptationSet>
    <AdaptationSet id="972192134" contentType="audio" mimeType="audio/mp4" segmentAlignment="true" lang="und">
      <Label>und</Label>
      <SegmentTemplate timescale="48000" media="segment_$RepresentationID$_$Number$.mp4" initialization="segment_$RepresentationID$_0_init.mp4" startNumber="60" presentationTimeOffset="110400">
        <SegmentTimeline>
          <S t="17392448" d="287744"/>
          <S t="17680192" d="288768"/>
          <S t="17968960" d="287744" r="2"/>
          <S t="18832192" d="288768"/>
          <S t="19120960" d="287744" r="2"/>
          <S t="19984192" d="288768"/>
        </SegmentTimeline>
      </SegmentTemplate>
      <Representation id="3" bandwidth="192000" codecs="mp4a.40.2" audioSamplingRate="48000">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
      </Representation>
      <Representation id="4" bandwidth="192000" codecs="mp4a.40.2" audioSamplingRate="48000">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
      </Representation>
    </AdaptationSet>
    <SupplementalProperty schemeIdUri="urn:scte:dash:utc-time" value="2024-04-30T08:03:41.116Z"/>
  </Period>
  <UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2024-04-30T08:04:46.498Z"/>
</MPD>

まとめ

AWS Elemental MediaPackage v2でDASH manifestをサポートしたアップデートについてお届けしました。Origin endpointのContainer typeでCMAFを選択し、Manifest definitionsでDASHを manifestを追加することでDASH形式のライブストリーミングがMediaPackage v2でも行えます!MediaPackage v1を使ってライブ配信を行っており、MediaPackage v2への移行を検討しつつもDASH manifestのサポートがなかったため移行を断念していた、というケースもあるかと思います。MediaPackage v2についてはCloudFrontのOACがサポートされるなど、よりAWSらしく進化していますので、これを機にv2への移行を検討してみるのもよいかと思いました。ただし、MediaPackage v2については現時点(2024年4月末)でLive機能のみをサポート、VOD機能については未サポート(必然的に今回のDASH manifestサポートもLive機能のみが対象です)である点に留意しておきましょう。

なお個人的には、MediaPackage v2でのDASH manifest未サポートだった点がきちんと追えていなかったこと(v1とごっちゃになってしまっていました)、またDASHのマニフェストを読み慣れていない点の再認識が本エントリの反省ポイントでした。