AWS MediaConvert で生成した DASH ISO 形式ファイルを Dash.js で再生しようとするとエラーが表示される場合の解決方法

MediaConvert で DASH ISO 形式でファイル出力を行った後、再生時に「Multiplexed representations are intentionally not supported」とエラーが表示される場合の解決方法を調査しました
2021.04.19

こんにちは、大前です。

直近、掲題のエラーを調査する機会がありましたので、ブログとしてまとめたいと思います。

エラーが発生するパターン

AWS MediaConvert で動画ファイルを DASH 形式に変換

以下の様な一般的な AVC/AAC の mp4 ファイルを AWS MediaConvert を使用して MPEG-DASH 形式に変換してみたいと思います。

上記ファイルを S3 にアップロードして、出力グループから「DASH ISO」を選択して、動画/オーディオ設定をよしなに入力してジョブを実行します。

特にエラーは発生せず、ジョブが完了しました。

出力先の S3 に MPEG-DASH 形式でファイルが出力されていることも確認できます。

変換後のファイルを再生してみると・・・?

では、変換後の動画ファイルを再生してみましょう。再生プレイヤーには DASH Reference Client 3.2.2 を利用します。

変換後のファイルにインターネットからアクセス出来るように公開設定や CORS 設定等を行い、URL を入力して再生を試みてみると・・・

エラーが発生しました。あれれ。。。??

エラーメッセージを見てみる

開発者ツールでコンソールログを確認すると、何やらエラーメッセージが確認できます。

Multiplexed representations are intentionally not supported, as they are not compliant with the DASH-AVC/264 guidelines

ざっくり訳すると、「多重化された representations は DASH-AVC/264 だとサポートしてないで」との事。

何のこっちゃという感じですが、representations というのは MPEG-DASH のマニフェストファイル(.mpd)に含まれる要素の一つですので、生成されたマニフェストファイルを見てみましょう。

MediaConvert で生成されたマニフェストファイルを見てみる

実際に生成されたマニフェストファイルを確認してみると、<Representation> 内に <SubRepresentation> が 2つ存在し、それぞれ映像と音声の情報が含まれている事がわかります。

<?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="PT30S" profiles="urn:mpeg:dash:profile:isoff-main:2011" mediaPresentationDuration="PT7.007S">
  <Period start="PT0S" duration="PT7.007S" id="1">
    <AdaptationSet mimeType="video/mp4" codecs="avc1.4d4028,mp4a.40.2" frameRate="24000/1001" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="false">
      <ContentComponent contentType="video" id="1"/>
      <ContentComponent contentType="audio" id="2" lang="und"/>
      <Representation id="1" width="1920" height="1080" bandwidth="3000000">
        <BaseURL>sample_2.mp4</BaseURL>
        <SubRepresentation contentComponent="1" bandwidth="0" codecs="avc1.4d4028"/>
        <SubRepresentation contentComponent="2" bandwidth="96000" codecs="mp4a.40.2"/>
        <SegmentBase indexRange="1218-1281">
          <Initialization range="0-1217"/>
        </SegmentBase>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

また、上記エラーコードにあった DASH-AVC/264 guidelines は MPEG-DASH を利用するにあたって DASH Industry Forum という団体が策定しているガイドラインです。dash.js 以外のプレイヤーを使えば上記のマニフェストファイルでも無理やり再生させる事は出来るかもしれませんが、ガイドラインでサポートしていない方法は避けておきたいものです。

エラーの解消方法

AWS MediaConvert では出力グループ内に複数の出力を定義する事が出来る為、これを利用する事で多重化された状態で MPEG-DASH が出力されることを回避できます。

先ほど失敗したジョブを複製等で開き、出力グループの下部から「出力の追加」をクリックします。

出力の 1つを選択し、オーディオ設定から「オーディオの削除」をクリックします。

もう片方の出力を選択し、今度は「ビデオの削除」をクリックします。

下図の様に、1つの DASH ISO グループ内に 映像だけの出力/音声だけの出力 の合計 2つの出力が存在する状態となります。

各出力の名前修飾子を編集しておきます。これをしないと、同じファイル名のファイルを S3 に出力しようとしてエラーになります。

設定後、ジョブを実行すると S3 にファイルが生成されている事が確認できます。出力を 2つ作成したので、セグメント(.mp4)も 2つ生成されたいる事がわかります。

また、生成されたマニフェストファイルを確認すると <Representation> 要素が 2つに別れており、多重化が解消されている様に見えます。

<?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="PT30S" profiles="urn:mpeg:dash:profile:isoff-main:2011" mediaPresentationDuration="PT7.018S">
  <Period start="PT0S" duration="PT7.018S" id="1">
    <AdaptationSet mimeType="video/mp4" frameRate="24000/1001" segmentAlignment="true" subsegmentAlignment="true" startWithSAP="1" subsegmentStartsWithSAP="1" bitstreamSwitching="false">
      <Representation id="1" width="1920" height="1080" bandwidth="3000000" codecs="avc1.4d4028">
        <BaseURL>sample_2-video.mp4</BaseURL>
        <SegmentBase indexRange="753-816">
          <Initialization range="0-752"/>
        </SegmentBase>
      </Representation>
    </AdaptationSet>
    <AdaptationSet mimeType="audio/mp4" lang="und" segmentAlignment="0">
      <Representation id="2" bandwidth="96000" audioSamplingRate="48000" codecs="mp4a.40.2">
        <BaseURL>sample_2-audio.mp4</BaseURL>
        <SegmentBase indexRange="658-721">
          <Initialization range="0-657"/>
        </SegmentBase>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

再度 DASH のテストサイトで再生を試みてみると、問題なく再生できました!

おわりに

MediaConvert で生成した MPEG-DASH ファイルを再生した際に Multiplexed representations are intentionally not supported, as they are not compliant with the DASH-AVC/264 guidelines とエラーが出た場合の解決方法について調査し、まとめました。

MediaConvert に限らず、ffmpeg 等のコマンドツールを利用している場合も起こり得るエラーかと思いますので、頭の片隅に入れておくといつか役にたつかもしれません。

以上、AWS 事業本部の大前でした。

参考