Dolby Vision・Atmos に対応した MP4 の作り方
はじめに
この記事では、Dolby Vision の映像や Dolby Atmos の音声を、MP4 コンテナに格納 (mux) する方法を解説する。格納する映像や音声自体は、既に作成済みであることを想定している。
「たったそれだけ?」感がある内容だが、Dolby Vision や Dolby Atmos を取り扱う場合、MP4 の作り方次第では、意図しない状態で再生されたり、そもそも全く再生できなくなったりする場合があるため、注意が必要。
Dolby Vision や Dolby Atmos を取り扱うことが可能な制作ツール等で書き出した MP4 を、そのまま再生する場合は、特に問題ないと思われる。しかし、例えば以下のようなケースで MP4 を自作する場合、問題が発生する可能性がある。
- 映像+音声の MP4 から音声のみを取り出し (demux)、MP4 に mux する
- 別々のコンテナにある映像と音声を、1つの MP4 に mux する
- MKV や TS 等、MP4 以外のコンテナから、MP4 に変換 (remux) する
なお、タイトルに「Dolby Vision」と記載しているが、映像は必ずしも Dolby Vision である必要はない。映像コーデックが AVC または HEVC であれば、SDR でも HDR10 でも問題ない (HLG や HDR10+ は未検証)。なんなら映像がなくても問題はない。コーデックに AV1 を使用する Dolby Vision Profile 10 は対象外。
また、音声についても同様に、Dolby Atmos である必要はない。音声コーデックが Dolby Digital / Dolby Digital Plus / Dolby AC-4 / AAC のいずれかであれば、2.0ch や 5.1ch 等でも問題ない。音声なしでも問題はない。
本記事で作成する MP4 ファイルは、主にスマホやタブレットのローカルで再生することを目的としている。とは言え、Dolby Vision については、恐らくどのプラットフォームで再生する際も、MP4 の作成方法が重要になってくると思われる。
Dolby Atmos については、PC で再生して AV アンプやサウンドバーにビットストリーム出力するだけであれば、MP4 の作成方法は問わない。しかし、iPhone / iPad / Android 端末で「空間オーディオ」として再生する場合、作成方法が動作に影響してしまう。
FFmpeg で発生する問題
MP4 の作成は、一般的には FFmpeg (XMedia Recode、HandBrake、Shutter Encoder 等の GUI フロントエンド含む) を使用することが多いと思われる。しかし、Dolby Vision や Dolby Atmos を取り扱う場合、以下で解説するような問題が発生する。
なお、これらの問題は MP4 に限った話ではなく、MKV や TS 等でも同様の問題が発生する。むしろ、スマホやタブレットの場合、MP4 以外のコンテナを使用すると、端末やコーデックとの組み合わせ次第では、全く再生できなくなる場合もある。
(以下を要約すると、「Dolby Vision が Dolby Vision として認識されず、Dolby Digital Plus JOC が Dolby Atmos として認識されず、Dolby AC-4 が mux できない」ということを長々と書いているだけなので、「解決策」のところまで読み飛ばしても問題はない)
Dolby Vision に関する問題
SHARP や Lenovo の Dolby Vision 対応 Android 端末では、Dolby Vision の映像を再生すると、モード選択の通知が表示される。この通知により、再生中の映像が Dolby Vision として認識されているかどうかが分かる。
なお、メーカーによっては (少なくとも Xiaomi は)、この通知機能が実装されていない場合もある。
適切に Dolby Vision が mux された MP4 だと、以下のような通知が表示される。
ところが、上記映像を FFmpeg で MP4 に -c copy
で mux すると、上記の通知が表示されなくなる。
Dolby Vision として認識されていない場合でも、Dolby Vision Profile 4 / 8 / 9 等であれば、HDR10 / HLG / SDR のいずれかとして、再生自体は可能。しかし、Profile 5 の場合、正常に再生することができなくなってしまう。
Dolby Vision Profile 5 は独自の IPT 色空間を採用しており、Dolby Vision 対応機器で、Dolby Vision Profile 5 として認識されている場合のみ、下図のような正しい色で表示することができる。
(AQUOS R9 のスクリーンショットが暗いが、実際の画面表示は問題ない)
Dolby Vision 非対応の機器では、Dolby Vision Profile 5 は全く再生できないか、再生できても正常な色で表示できない。
しかし、FFmpeg で mux した MP4 の場合、Dolby Vision 対応機器であっても、正常な色で表示することができなくなる。
MediaInfo で確認すると、以下のようになっていた。
Dolby Vision Profile 4.2 として認識される MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
HDR 形式 : Dolby Vision,
Version 1.0,
Profile 4.2,
dvhe.04.06,
BL+EL+RPU,
no metadata compression,
SDR compatible
コーデック ID : hvc1
コーデック構成ボックス : hvcC+dvcC+hvcE
上記を FFmpeg で mux した MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
コーデック ID : hvc1
コーデック構成ボックス : hvcC
Dolby Vision Profile 5 として認識される MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
HDR 形式 : Dolby Vision,
Version 1.0,
Profile 5,
dvhe.05.06,
BL+RPU,
no metadata compression
コーデック ID : dvh1
コーデック構成ボックス : hvcC+dvcC
上記を FFmpeg で mux した MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
コーデック ID : dvh1
コーデック構成ボックス : hvcC
Dolby Vision Profile 8.1 として認識される MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
HDR 形式 : Dolby Vision,
Version 1.0,
Profile 8.1,
dvhe.08.06,
BL+RPU,
no metadata compression,
HDR10 compatible / SMPTE ST 2086,
Version HDR10,
HDR10 compatible
コーデック ID : hvc1
原色 : BT.2020
転送特性 : PQ
マトリックス係数 : BT.2020 non-constant
コーデック構成ボックス : hvcC+dvvC
上記を FFmpeg で mux した MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
HDR 形式 : SMPTE ST 2086,
HDR10 compatible
コーデック ID : hvc1
原色 : BT.2020
転送特性 : PQ
マトリックス係数 : BT.2020 non-constant
コーデック構成ボックス : hvcC
Dolby Vision Profile 8.4 として認識される MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
HDR 形式 : Dolby Vision,
Version 1.0,
Profile 8.4,
dvhe.08.05,
BL+RPU,
no metadata compression,
HLG compatible
コーデック ID : hvc1
原色 : BT.2020
転送特性 : HLG
マトリックス係数 : BT.2020 non-constant
コーデック構成ボックス : hvcC+dvvC
上記を FFmpeg で mux した MP4:
映像
ID : 1
形式 : HEVC
形式/情報 : High Efficiency Video Coding
コーデック ID : hvc1
原色 : BT.2020
転送特性 : HLG
マトリックス係数 : BT.2020 non-constant
コーデック構成ボックス : hvcC
Codec configuration box (コーデック構成ボックス) に「dvcC」「dvvC」「hvcE」がなく、Dolby Vision として認識されていない。
「dvcC」「dvvC」は Dolby Vision を表す。
dvcC: Dolby Vision Configuration
Codecs (MP4 Registration Authority)
dvvC: Dolby Vision Extended Configuration
hvcC: HEVC Configuration
「hvcE」は L-HEVC (Layered HEVC) 用で、上記ファイルでは Dolby Vision の EL (Enhancement Layer) を指しているものと思われる。
hvce: L-HEVC explicit reconstruction
Brands (MP4 Registration Authority)
Dolby Stream Validator で確認してみると、「dvcC」と「dvvC」に Dolby Vision のバージョン、プロファイル、レベル、BL / EL / RPU の有無、BL の互換性、メタデータ圧縮の有無 (= MediaInfo の「HDR 形式」に表示されているもの) が記載されていることが分かる。
FFmpeg で mux した MP4 は、この情報がごっそりと抜け落ちた状態となってしまっている。
Dolby Vision Profile 4.2 として認識される MP4:
<hvc1 size="388">
<width>3840</width>
<height>2160</height>
<hvcC size="131"/>
<dvcC size="24">
<version_major>1</version_major>
<version_minor>0</version_minor>
<profile>4</profile>
<level>6</level>
<rpu_flag>1</rpu_flag>
<el_flag>1</el_flag>
<bl_flag>1</bl_flag>
<bl_compatible_id>2</bl_compatible_id>
<md_compression>0</md_compression>
</dvcC>
<hvcE size="131"/>
</hvc1>
上記を FFmpeg で mux した MP4:
<hvc1 size="253">
<width>3840</width>
<height>2160</height>
<hvcC size="131"/>
</hvc1>
Dolby Vision Profile 5 として認識される MP4:
<dvh1 size="141">
<width>3840</width>
<height>2160</height>
<hvcC size="23"/>
<dvcC size="24">
<version_major>1</version_major>
<version_minor>0</version_minor>
<profile>5</profile>
<level>6</level>
<rpu_flag>1</rpu_flag>
<el_flag>0</el_flag>
<bl_flag>1</bl_flag>
<bl_compatible_id>0</bl_compatible_id>
<md_compression>0</md_compression>
</dvcC>
</dvh1>
上記を FFmpeg で mux した MP4:
<dvh1 size="145">
<width>3840</width>
<height>2160</height>
<hvcC size="23"/>
</dvh1>
Dolby Vision Profile 8.1 として認識される MP4:
<hvc1 size="871">
<width>3840</width>
<height>2160</height>
<hvcC size="753"/>
<dvvC size="24">
<version_major>1</version_major>
<version_minor>0</version_minor>
<profile>8</profile>
<level>6</level>
<rpu_flag>1</rpu_flag>
<el_flag>0</el_flag>
<bl_flag>1</bl_flag>
<bl_compatible_id>1</bl_compatible_id>
<md_compression>0</md_compression>
</dvvC>
</hvc1>
上記を FFmpeg で mux した MP4:
<hvc1 size="894">
<width>3840</width>
<height>2160</height>
<hvcC size="753"/>
<colr size="11">
<colour_type>1852009592</colour_type>
<colour_primaries>9</colour_primaries>
<transfer_characteristics>16</transfer_characteristics>
<matrix_coefficients>9</matrix_coefficients>
<full_range_flag>0</full_range_flag>
</colr>
</hvc1>
Dolby Vision Profile 8.4 として認識される MP4:
<hvc1 size="254">
<width>1920</width>
<height>1080</height>
<hvcC size="136"/>
<dvvC size="24">
<version_major>1</version_major>
<version_minor>0</version_minor>
<profile>8</profile>
<level>5</level>
<rpu_flag>1</rpu_flag>
<el_flag>0</el_flag>
<bl_flag>1</bl_flag>
<bl_compatible_id>4</bl_compatible_id>
<md_compression>0</md_compression>
</dvvC>
</hvc1>
上記を FFmpeg で mux した MP4:
<hvc1 size="277">
<width>1920</width>
<height>1080</height>
<hvcC size="136"/>
<colr size="11">
<colour_type>1852009592</colour_type>
<colour_primaries>9</colour_primaries>
<transfer_characteristics>18</transfer_characteristics>
<matrix_coefficients>9</matrix_coefficients>
<full_range_flag>0</full_range_flag>
</colr>
</hvc1>
FFmpeg で mux した MP4 のうち、元が Dolby Vision Profile 5 のものは、Dolby Stream Validator で以下のようなエラーが出力された。
ERROR: For a [Dolby Vision] stream, in the MP4 SampleEntry box, the Dolby Vision configuration box must be included.
上記は、映像の Codec ID (FourCC) が Dolby Vision を示す dvh1 にも関わらず、Codec configuration box (コーデック構成ボックス) に dvvC が含まれていない旨のエラーだと思われる。
他のプロファイルでは、映像の Codec ID (FourCC) は HEVC を示す hvc1 となっており、Dolby Vision かどうかが不明なため、エラーが出ていないだけだと思われる。
Dolby Digital Plus JOC に関する問題
Dolby Digital Plus JOC は、Dolby Atmos のフォーマットの一種。Dolby Atmos 対応機器では Dolby Atmos として再生され、Dolby Atmos 非対応の Dolby Digital Plus 対応機器では 5.1ch~7.1ch ダウンミックスが再生される。
ところが、FFmpeg で Dolby Digital Plus JOC を MP4 に mux すると、スマホやタブレットには JOC を使用していない (=Dolby Atmos ではない) Dolby Digital Plus として認識されてしまい、5.1ch ~ 7.1ch ダウンミックスで再生されてしまう。
(参考) Dolby Digital Plus JOC の詳細については、以下の記事で詳しく解説している。
スマホやタブレットでの再生時、Dolby Digital Plus JOC が正しく認識されているかどうかを確認する方法は、いくつかある。
iPhone / iPad に AirPods シリーズ等を接続している場合、コントロールセンターの音量パネルを長押しして表示される画面には、音声のフォーマット情報が表示される。
Dolby Digital Plus JOC を再生すると、「ドルビーアトモス」と判定される。
Dolby Digital や、JOC を使用していない Dolby Digital Plus を再生すると、「マルチチャンネル」と判定される。
ところが、FFmpeg で mux した Dolby Digital Plus JOC の場合も、「マルチチャンネル」判定になってしまう。
Android 10 向けの Dolby Atmos (バージョン DAX3_3.5.5.12_r1~DAX3_3.5.6.11_r1) には、Dolby Digital / Dolby Digital Plus / Dolby AC-4 の音声が再生されると、フォーマット情報の通知を出す機能が存在する。
Dolby Digital Plus JOC や Dolby AC-4 を再生すると、「Dolby ATOMS」 (※正式なスペルはATMOS) と判定される。なお、Dolby AC-4 は 2.0ch でも「Dolby ATOMS」扱いになる。
Dolby Digital や、JOC を使用していない Dolby Digital Plus を再生すると、「Dolby Audio」と判定される。
ところが、FFmpeg で mux した Dolby Digital Plus JOC の場合も、「Dolby Audio」判定になる。
Dolby Atmos 対応の Galaxy では、端末側の Dolby Atmos (以降「Dolby Atmos (DAX3)」と記載する) がオフの状態で、Dolby Digital Plus JOC や Dolby AC-4 を再生すると、Dolby Atmos (DAX3) が自動的にオンになる。
なお、Dolby AC-4 の場合は 2.0ch であっても Dolby Atmos (DAX3) がオンになるため、おそらく先述の通知機能と判定方法は同じと思われる。
Dolby Digital や、JOC を使用していない Dolby Digital Plus を再生した場合は、Dolby Atmos (DAX3) は自動的にオンにならない。
ところが、FFmpeg で mux した Dolby Digital Plus JOC の場合も、Dolby Atmos (DAX3) は自動的にオンにならない。
Xperia の「音質のステータスと設定」「オーディオの状態」「音質と画質のステータス」機能 (名称は機種やバージョンにより異なる) は、コーデックが Dolby Digital / Dolby Digital Plus / Dolby AC-4 のいずれかであれば、フォーマットに関係なく「Dolby Atmos」と表示されるため、この調査には使用できない。
上記機能の詳細については、以下の記事をご参照いただきたい。
iPhone / iPad や Android 端末では Dolby Atmos として再生することができない MP4 でも、PC で再生して AV アンプにビットストリーム出力すると、問題なく Dolby Atmos として再生できた。
このことから、少なくとも音声ストリーム自体には問題がないことが伺える。
MediaInfo で確認すると、以下のようになっていた。
Dolby Atmos として認識される MP4:
音声
ID : 2
形式 : E-AC-3 JOC
形式/情報 : Enhanced AC-3 with Joint Object Coding
一般名 : Dolby Digital Plus with Dolby Atmos
コーデック ID : ec-3
チャンネル : 8 チャンネル
チャンネルの配置 : L R C LFE Ls Rs Lb Rb
複雑性指標 : 16
ダイナミックオブジェクトの数 : 15
ベッドチャンネルの数 : 1 チャンネル
ベッドチャンネルの構成 : LFE
上記を FFmpeg で mux した MP4:
音声
ID : 2
形式 : E-AC-3 JOC
形式/情報 : Enhanced AC-3 with Joint Object Coding
一般名 : Dolby Digital Plus with Dolby Atmos
コーデック ID : ec-3
チャンネル : 8 チャンネル
チャンネルの配置 : L R C LFE Ls Rs Lb Rb
複雑性指標 : Not present / 16
ダイナミックオブジェクトの数 : 15
ベッドチャンネルの数 : 1 チャンネル
ベッドチャンネルの構成 : LFE
FFmpeg で mux した MP4 も Dolby Atmos として認識されてはいるものの、Complexity index (複雑性指標) が Not present (存在しない) となってしまっている。
FFmpeg で mux した MP4 を、Dolby Stream Validator で検証してみると、以下のようなエラーが出力された。
ERROR: For an [EC3] stream, in MP4, the bitstream indicates Dolby Atmos content (the “addbsil” isn’t 0), but the EC3SpecificBox indicates non-atmos content (the “flag_ec3_extension_type_a” in EC3SpecificBox is FALSE). (ATSC Standard A/52:2012 Annex G 3.5)
どうやら、「Dolby Digital Plus の音声ストリームには Dolby Atmos フラグが立っているものの、MP4 コンテナには Dolby Atmos フラグが立っていない」ということらしい。
音声ストリームだけを直接受け取る AV アンプ等とは違い、スマホやタブレットでは MP4 コンテナ自体のメタデータが重要となるようだ。
Dolby AC-4 に関する問題
現状、FFmpeg は MP4 コンテナに Dolby AC-4 音声を mux すること自体ができない。
実行時には、以下のようなエラーが出力される。
Could not find tag for codec ac4 in stream #1, codec not currently supported in container
解決策
MP4 への mux は、FFmpeg ではなく、Dolby 純正の Dolby MP4 streaming muxer (dlb_mp4base) を使用することで、これらの問題を解消できる。
ビルド済みのバイナリは、dlb_mp4base/bin に置かれている。
対応しているコーデックと拡張子は、以下の通り。
- 映像コーデック
- AVC (.264 / .h264 / .avc)
- HEVC (.265 / .h265 / .hevc / .hvc)
- 音声コーデック
- Dolby Digital (.ac3)
- Dolby Digital Plus (.ec3)
- Dolby AC-4 (.ac4)
- AAC (.aac / .adts)
- 出力ファイルコンテナ
- MP4 (.mp4 / .m4a 等、おそらくなんでも)
上記コーデックであれば、Dolby Vision (Profile 4 / 5 / 7 / 8 / 9 のみ) や Dolby Atmos (Dolby Digital Plus JOC / Dolby AC-4 A-JOC / Dolby AC-4 IMS) にも対応している。
拡張子 .eac3 の Dolby Digital Plus には非対応なので、注意が必要。古い FFmpeg では、Dolby Digital Plus を demux する際は、.eac3 でしか出力できなかったりする。
avformat: allow .ec3 as extension for raw E-AC-3 stream · FFmpeg/FFmpeg@2d8d7f8
おそらく parser_dd.c の下記部分に1行追加すれば、.eac3 にも対応すると思われる。
dlb_mp4base/src/esparser/parser_dd.c at master · DolbyLaboratories/dlb_mp4basevoid parser_ec3_reg(void) { reg_parser_set("ec3", parser_ec3_create); }
demux
dlb_mp4base は MP4 等のコンテナから直接映像や音声を読み込むことができないため、あらかじめ demux しておく必要がある。
# FFmpeg の例: 映像が SDR の AVC、音声が Dolby Digital Plus の場合 (Dolby Digital Plus JOC 含む)
ffmpeg -i input.mp4 -c:v copy -an video.264 -c:a copy -vn audio.ec3
# FFmpeg の例: 映像が SDR または HDR10 の HEVC、音声が Dolby AC-4 の場合 (AC-4 IMS、AC-4 A-JOC、AC-4 CBI 含む)
ffmpeg -i input.mp4 -c:v copy -an video.265 -c:a copy -vn audio.ac4
# FFmpeg の例: 映像が Dolby Vision Profile 7.6、音声が Dolby Digital Plus の場合
ffmpeg -i input.mp4 -map 0:0 -c:v copy BL.265 -map 0:1 -c:v copy EL_RPU.265 -c:a copy -vn audio.ec3
# Dolby MP4 streaming demuxer (dlb_mp4demux) の例
mp4demuxer --input-file input.mp4
# Stream demuxer の例
streamdemuxer -o ./ -i input.mp4
demux は FFmpeg で行っても問題はないが、Dolby MP4 streaming demuxer (dlb_mp4demux) や Stream demuxer (Dolby 製) 等の専用ツールと比べると、コマンドが若干複雑な上に、コーデックに応じた拡張子を適宜指定する必要がある。再エンコード等を伴わない単純な demux であれば、専用ツールの方が楽。
個人的には、手動でコマンドを実行する場合は、構文が単純な Stream demuxer を使用し、バッチファイルで実行する場合は、出力ファイル名を任意で指定可能な FFmpeg を使用している。
dlb_mp4demux を使用していない理由は、出力ファイル名が「out_1.h264」や「out_2.ec3」のような、元のファイルが何なのか分かりにくい名前が強制されるからである。Stream demuxer は、元のファイル名の後ろに「_track_id_1.out.264」や「_track_id_2.out.ec3」等を付加した名前が使用される。
Dolby Vision Profile 7.6 から Profile 8.1 への変換
Dolby Vision Profile 7.6 は、【BL (基本の映像データ)】と【EL (差分の映像データ) + RPU (トーンマッピング用の動的メタデータ)】の、2つの映像ストリームで構成されている。
対応機器では、BL (10bit) と EL (10bit) を合成して 12bit の映像を生成し、RPU を適用して動的 HDR 映像として再生する。非対応の機器では、EL + RPU を無視し、BL 単体で 10bit の静的 HDR (= HDR10) 映像として再生することが可能。
全ての Dolby Vision 対応機器が Profile 7.6 に対応しているわけではなく、現状 Android 端末 / iPhone / iPad で対応している機種はおそらく存在しない。
参考までに、筆者が把握している範囲で Android 端末が対応している Dolby Vision のプロファイルは、下記の通り。(ソース: 端末仕様確認ツール (新規配信終了)、NTTドコモ 端末・ブラウザスペック (閉鎖))
- 確認した端末全て対応 *1
- Dolby Vision Profile 5 (DolbyVisionProfileDvheStn)
- Dolby Vision Profile 8 (DolbyVisionProfileDvheSt) *2
- 古めの端末のみ対応 *3
- Dolby Vision Profile 4.2 (DolbyVisionProfileDvheDtr)
- Dolby Vision Profile 9.2 (DolbyVisionProfileDvavSe)
*1 AQUOS R9 / R8 pro / R6 / R5G / R2 / R2 compact / zero2 / zero、Lenovo Yoga Tab Plus、Lenovo Tab P11 Pro (2nd Gen)、Xiaomi 13T で確認。
*2 AQUOS R9 / R8 pro / R2、Lenovo Yoga Tab Plus、Lenovo Tab P11 Pro (2nd Gen) では、少なくとも Profile 8.1 と Profile 8.4 に対応していることを確認済み。
*3 確認した端末のうち、AQUOS R6 / R5G / R2 / R2 compact / zero2 / zero、Lenovo Tab P11 Pro (2nd Gen)、Xiaomi 13T のみ対応を確認。
また、iPhone / iPad が対応している Dolby Vision のプロファイルは、下記の通り。(ソース: Dolby)
- Dolby Vision 対応機種はすべて対応
- Dolby Vision Profile 5
- Dolby Vision Profile 8.4
- Dolby Vision と AV1 に対応した機種 (A17 Pro 以降 / M3 以降) のみ対応
- Dolby Vision Profile 10
- Dolby Vision Profile 10.4
Dolby Vision Profile 7.6 の BL と EL + RPU を両方 mux しても、Android 端末 / iPhone / iPad で再生する場合は BL しか再生されないため、容量がもったいない。
HDR10 としての再生で良い場合、または、iPhone / iPad のみで再生する場合は、BL のみの mux で問題ない。
しかし、もし Dolby Vision 対応の Android 端末で Dolby Vision として再生させたい場合、dovi_tool を使用すれば、Profile 7.6 から Profile 8.1 (BL + RPU の1ストリーム) に変換することが可能。
dovi_tool -m 2 mux --bl BL.265 --el EL_RPU.265 --discard -o BL_RPU.265
-m 2
: RPU を Profile 8.1 互換の形式に変換mux
: BL と EL を合体--bl BL.265:
BL として BL.265 を入力--el EL_RPU.265
: EL として EL.265 を入力--discard
: EL を破棄-o BL_RPU.265
: 処理したファイルを BL_RPU.265 として出力
Dolby Vision Profile 8.1 の BL は HDR10 と互換性がある。そのため、この変換を行っても、Dolby Vision Profile 8.1 非対応の iPhone / iPad や、Dolby Vision 自体に非対応の機器でも再生可能。
mux
demux ができたら、いよいよ dlb_mp4base の出番。
dlb_mp4base はファイル名に日本語等が含まれていると正常に処理できないため、あらかじめリネームしておく必要がある。
# 映像なし、音声が Dolby Digital の場合
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i audio.ac3 -o output.m4a
# 映像なし、音声が Dolby Digital Plus の場合 (Dolby Digital Plus JOC 含む)
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i audio.ec3 -o output.m4a
# 映像なし、音声が Dolby AC-4 の場合 (AC-4 IMS、AC-4 A-JOC、AC-4 CBI 含む)
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i audio.ac4 -o output.m4a
# 映像が SDR (AVC)、音声が Dolby Digital Plus の場合
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i video.264 -i audio.ec3 -o output.mp4
# 映像が SDR (HEVC) または HDR10 (HEVC)、音声が Dolby Digital Plus の場合
# (Dolby Vision Profile 7.6 の BL のみを使用する場合もこちら)
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i video.265 -i audio.ec3 -o output.mp4 --hvc1flag 0
# 映像が Dolby Vision Profile 4.2 (HEVC)、音声が Dolby Digital Plus の場合
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i BL_EL_RPU.265 -i audio.ec3 -o output.mp4 --dv-profile 4 --hvc1flag 0
# 映像が Dolby Vision Profile 5 (HEVC)、音声が Dolby Digital Plus の場合
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i BL_RPU.265 -i audio.ec3 -o output.mp4 --dv-profile 5 --dvh1flag 0
# 映像が Dolby Vision Profile 7.6 (HEVC + HEVC)、音声が Dolby Digital Plus の場合
# (Dolby Vision Profile 8.1 に変換しない場合)
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i BL.265 -i EL_RPU.265 -i audio.ec3 -o output.mp4 --dv-profile 7 --hvc1flag 0 --hvc1flag 1
# 映像が Dolby Vision Profile 8.1 (HEVC)、音声が Dolby Digital Plus の場合
# (Dolby Vision Profile 7.6 から変換した場合もこちら)
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i BL_RPU.265 -i audio.ec3 -o output.mp4 --dv-profile 8 --dv-bl-compatible-id 1 --hvc1flag 0
# 映像が Dolby Vision Profile 9 (AVC)、音声が Dolby Digital Plus の場合
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i BL_RPU.264 -i audio.ec3 -o output.mp4 --dv-profile 9
映像が HEVC の場合、dlb_mp4base のデフォルト設定のままでは、Codec ID (FourCC) の互換性問題により、iPhone / iPad では再生できない。
- SDR / HDR10 / Profile 5 以外の Dolby Vision
- iPhone / iPad の要件: hvc1
- dlb_mp4base の出力: hev1
- Dolby Vision Profile 5
- iPhone / iPad の要件: dvh1
- dlb_mp4base の出力: dvhe
iPhone / iPad で再生できるようにするには、 --hvc1flag [映像のインデックス]
または --dvh1flag [映像のインデックス]
オプションが必要。Android 端末の場合は付けても付けなくても良い。
通常、映像は1トラックのみなので、[映像のインデックス] は基本的に0を指定する。Dolby Vision Profile 7.6 の場合、映像は BL と EL + RPU とで別々なので、0と1をそれぞれ指定する必要がある。
なお、Profile 5 以外の Dolby Vision は dvhe ではなく hev1 が使用されるため、--dvh1flag 0
ではなく --hvc1flag 0
を指定する必要がある。
--mpeg4-comp-brand
オプション (MP4 コンテナの Compatible Brands) に関しては、ヘルプでは msdh が入っているが、これは MPEG-DASH 用の Brand であり、今回はローカル再生したいだけなので、不要と判断して省略した。
code: msdh
The ‘MP4’ Registration Authority
description: Media Segment conforming to the general format type for ISO base media file format.
specification: DASH
remux バッチ
既に FFmpeg で mux した MP4 を、一括で remux するバッチファイルを作成した。
映像コーデック (vcodec)、音声コーデック (acodec)、Dolby Vision のプロファイル (dovi) を入力して実行するだけで、フォーマットに応じた remux を行うことが可能。
dlb_mp4base の --overwrite
オプションを使用すると、remux 前のファイルを remux 後のファイルで上書きすることが可能だが、何かあった際に怖い。そのため、このバッチでは、dlb_mp4base フォルダを作成し、一時ファイル含め、全てそこに出力するようにしている。
ffprobe 等を使用してフォーマットの自動判定を組み込みたいところだが、現状は実装していない。そのため、様々なフォーマットのファイルを扱う場合、フォーマットごとにファイルをフォルダ分けする必要がある。
(上記を組み込んだところで、FFmpeg で mux した MP4 の場合、Dolby Vision のプロファイルは ffprobe では判別できないため、結局手入力する必要がある)
@echo off
rem 出力先フォルダ
set outdir=dlb_mp4base
md %outdir%
rem Video Codec (264, 265)
set vcodec=265
rem Audio Codec (ac3, ec3, ac4, aac)
set acodec=ec3
rem Dolby Vision Profile (4.2, 5, 7.6, 8.1, 8.2, 8.4, 9, none = SDR/HDR10)
rem Profile 8 以外は小数点以下 (dv-bl-compatible-id) を省略可能
set dovi=5
rem フォーマットごとのオプション (Dolby Vision Profile 7.6 は Profile 8.1 に変換)
if %dovi:~0,1%==4 set option=--dv-profile 4 --hvc1flag 0
if %dovi:~0,1%==5 set option=--dv-profile 5 --dvh1flag 0
if %dovi:~0,1%==7 set option=--dv-profile 8 --dv-bl-compatible-id 1 --hvc1flag 0
if %dovi:~0,1%==8 set option=--dv-profile 8 --dv-bl-compatible-id %dovi:~-1,1% --hvc1flag 0
if %dovi:~0,1%==9 set option=--dv-profile 9
if %dovi%==none if %vcodec%==265 set option=--hvc1flag 0
rem remux
for %%f in (*.mp4) do (
rem demux
if %dovi:~0,1%==7 (
rem Dolby Vision Profile 7.6 の場合は Profile 8.1 互換の形式に変換
ffmpeg -hide_banner -i "%%f" -map 0:0 -c:v copy "%outdir%\%%~nf_BL.%vcodec%" -map 0:1 -c:v copy "%outdir%\%%~nf_EL_RPU.%vcodec%" -c:a copy -vn "%outdir%\%%~nf.%acodec%"
dovi_tool -m 2 mux --bl "%outdir%\%%~nf_BL.%vcodec%" --el "%outdir%\%%~nf_EL_RPU.%vcodec%" --discard -o "%outdir%\%%~nf.%vcodec%"
rem 一時ファイルを削除
del "%outdir%\%%~nf_BL.%vcodec%"
del "%outdir%\%%~nf_EL_RPU.%vcodec%"
) else (
rem Dolby Vision Profile 7.6 以外の場合は普通に demux
ffmpeg -hide_banner -i "%%f" -c:v copy -an "%outdir%\%%~nf.%vcodec%" -c:a copy -vn "%outdir%\%%~nf.%acodec%"
)
rem mux
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i "%outdir%\%%~nf.%vcodec%" -i "%outdir%\%%~nf.%acodec%" -o "%outdir%\%%f" %option%
rem 一時ファイルを削除
del "%outdir%\%%~nf.%vcodec%"
del "%outdir%\%%~nf.%acodec%"
)
pause
音声ファイルとして出力できれば良い場合、もっとシンプルにできる。
@echo off
rem 出力先フォルダ
set outdir=dlb_mp4base
md %outdir%
rem Audio Codec (ac3, ec3, ac4, aac)
set acodec=ec3
rem remux
for %%f in (*.mp4) do (
ffmpeg -hide_banner -i "%%f" -c:a copy -vn "%outdir%\%%~nf.%acodec%"
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i "%outdir%\%%~nf.%acodec%" -o "%outdir%\%%~nf.m4a"
del "%outdir%\%%~nf.%acodec%"
)
pause
トラブルシューティング
ここでは、今まで経験した主なトラブルに対する解決策を列挙していく。
dlb_mp4base で mux 時、「Unknown es index for …」というエラーが出る
具体的には、以下のようなエラー。
Error parsing command line: Unknown es index for
--hvc1flag
.
Error parsing command line!
Error parsing command line: Unknown es index for
--dvh1flag
.
Error parsing command line!
--hvc1flag
や --dvh1flag
オプションは、指定する位置によっては上記のエラーが出る。これらのオプションは、可能な限り後ろの方で指定したほうが良い。
dlb_mp4base で mux すると、0バイトの MP4 ファイルが出力される
入力ファイルに日本語等、使用できない文字が含まれている可能性がある。過去に遭遇したケースでは、半角スペースのように見える別の文字がファイル名に使用されていたことがあった。
映像と音声が同期していない
映像のフレームレートが誤って指定されている可能性がある。
dlb_mp4base は映像のフレームレートを指定するための --input-video-frame-rate
オプションがある。基本的には省略しても問題ないが、稀に誤った値が指定されることもある。
もし誤って判定される場合は、--input-video-frame-rate
オプションでフレームレートを明示的に指定する必要がある。
(例) 24fps を指定する場合:
mp4muxer --mpeg4-comp-brand mp42,iso6,isom,dby1 -i video.264 --input-video-frame-rate 24 -i audio.ec3 -o output.mp4
フレームレートが整数でない場合、「23.97」や「30000/1001」のように指定することが可能。
--input-video-frame-rate
オプションは、必ず映像ファイルを指定した直後に指定する必要がある。順番を間違えると、以下のようなエラーが出る。
Error parsing command line: Unknown option:
--input-video-frame-rate
Error parsing command line!
再生すると、画面が緑色になる、ブロックノイズが発生する、再生が止まる
原因不明。症状は機種によって異なる。
回避策としては、demux 時に再エンコードを行う。
空間オーディオ対応 (= Dolby Audio 対応) の Google Pixel で、Dolby Digital Plus JOC が再生できない
Google Pixel の 不具合。
回避策としては、demux 時、Dolby Digital Plus の 5.1ch 等に再エンコードする。
ffmpeg -i input.mp4 -c:a eac3 -ab 640k -ac 6 -vn audio.ec3
(参考)
Dolby Stream Validator で DDPInfoLib のエラーが出る
一部のファイルでは、以下のエラーが出る場合がある。
068 – FAILURE: Dolby Digital Plus: Primary audio: I0: BSID is not 16.
ERROR: For an [EC3] stream, the bitstream fails the validation in “DDPInfoLib”. (ATSC Standard A/52:2012 Annex G 3.5)
上記の原因は、「Dolby Digital Plus オーディオ データにエラーがあるため、Dolby Digital Plus の解析に失敗」(Google 翻訳) とのこと。
Error class:
Invalid attribute errorError messages:
ERROR: For an [EC3] stream, the bitstream fails the validation in “DDPInfoLib”.Description:
Error messages reported by the StreamValidator
The Dolby Digital Plus parsing failed due to errors in Dolby Digital Plus audio data.
MP4 コンテナではなく、音声データ自体に何らかの異常があるため、dlb_mp4base では対処できないと思われる。
なお、このエラーが出ても再生には問題がない。また、ZTE の AXON 7 に元から入っている Leaf トレーラーでもこのエラーが出る。そのため、あまり気にする必要はないと思われる。