ハイライト
WWDC 2020 で Apple は開発者向けに HDR エクスポートを開放しました。
AVAssetExportSessionの HEVC と Apple ProRes プリセットは HLG/HDR10 のソース形式を保持し、AVAssetWriterはsourceFormatHintまたはAVOutputSettingsAssistantで codec、色属性、Main10 profile を設定できます。
主要内容
動画 App が素材を書き出すとき、これまで主に解像度、ビットレート、フレームレート、ファイル形式を気にしていました。HDR では条件が増えます。SDR は通常 100 nits に制限されますが、HDR は 10,000 nits まで届き得ます。HDR は Wide Color gamut や 10-bit 配信形式と結びつくことも多いです。エクスポート時にトーンカーブ、色原色、profile を落とすと、ハイライト、シャドウの細部、色がソースからずれます。
このセッションは 2 つのパスに分けます。1 つ目は AVAssetExportSession で、ファイル変換、簡単な共有、AVComposition による時間合成、AVVideoComposition による空間合成に向いています。Apple は HEVC と Apple ProRes プリセットを更新し、HDR10 ソースは HDR10、HLG ソースは HLG、SDR ソースは SDR のまま書き出されます。
2 つ目は AVAssetWriter です。codec、ビットレート、フレームレート、サイズ、色空間、ダイナミックレンジ、マルチエンコーダ Mac での特定エンコーダ選択まで制御したい App に向いています。セッションの助言は明快です。ソースビデオの videoFormatDescription を hint として渡すか、AVOutputSettingsAssistant で AVAssetExportSession に近いデフォルト設定を生成し、製品要件に合わせて少数のフィールドだけ変更します。
詳細
1. まずエクスポートする HDR 目標を決める(06:15)
AVFoundation のエクスポート側は HLG と HDR10 をサポートします。HLG には追加の HDR metadata がなく、SDR 互換を念頭に設計されています。HDR10 は PQ transfer function を使い、静的 metadata を載せられます。Dolby Vision はセッションで動的 metadata 形式として概念説明されますが、エクスポート対応として明示されるのは HLG と HDR10 です。
主要設定:
- codec は
HEVCまたはApple ProResを選択します。 - transfer function は
HLGまたはPQを選択します。 - HDR コンテンツは Wide Color gamut をよく使い、transcript では
BT.2020に言及しています。 - HEVC HDR エクスポートには
HEVC_Main10_AutoLevelが必要です。8-bit HEVC HDR はサポートされません。
2. AVAssetExportSession でソース HDR を保持する(09:02)
エクスポート要件がファイル変換に近いなら、AVAssetExportSession が最短です。セッションの要点は、HEVC または Apple ProRes プリセットを使う限り、HDR エクスポートに追加コード変更は不要だということです。
guard let exportSession = AVAssetExportSession(asset: sourceAsset,
presetName: AVAssetExportPresetHEVCHighestQuality) else {
// Handle error
}
exportSession.outputURL = outputURL
exportSession.outputFileType = AVFileTypeQuickTimeMovie
exportSession.exportAsynchronouslyWithCompletionHandler {
// Handle completion
}
キーポイント:
AVAssetExportPresetHEVCHighestQualityは高品質 HEVC プリセットを選びます。セッションは既存 HEVC プリセットがソース HDR 形式を保持すると説明しています。outputURLとoutputFileTypeはエクスポート先です。例は QuickTime movie です。exportAsynchronouslyWithCompletionHandlerは非同期エクスポートを開始し、完了処理は App 側が担います。- HDR を SDR に変換するには、セッションは後方互換性のため H.264 プリセットを推奨しています。
混合素材では、AVAssetExportSession はすべてのソースを確認します。HDR コンテンツが 1 つでもあれば出力は HDR になり、SDR 素材は HDR に変換されます。異なる HDR 形式が混在する場合、デフォルト戦略はまず HLG を優先し、次に metadata 付き HDR 形式を優先します。
3. AVAssetWriter と sourceFormatHint で設定を簡素化する(13:24)
AVAssetWriter はより多くの制御を提供しますが、出力設定辞書は間違えやすくなります。最初の簡素化は、ソース素材の videoFormatDescription を AVAssetWriterInput に渡すことです。
let assetWriter = try AVAssetWriter(url: outputURL, fileType: AVFileTypeQuickTimeMovie)
let outputSettings: [String: AnyObject] = [
AVVideoCodecKey: AVVideoCodecTypeHEVC
]
let assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo,
outputSettings: outputSettings,
sourceFormatHint: videoFormatDescription)
assetWriter.add(assetWriterInput)
guard assetWriter.startWriting() else {
throw assetWriter.error!
}
キーポイント:
AVAssetWriterは出力 URL と QuickTime movie ファイルタイプを指定します。outputSettingsではAVVideoCodecKeyだけを明示しています。sourceFormatHintにソースビデオの format description を渡すと、AVAssetWriter がソース特性から妥当なデフォルトを補います。startWriting()が失敗したらassetWriter.errorを読みます。この例はエラー処理を隠していません。
4. AVOutputSettingsAssistant で編集可能な設定テンプレートを生成する(14:13)
2 番目の簡素化は AVOutputSettingsAssistant です。プリセットは AVAssetExportSession に似ていますが、AVAssetWriterInput に渡す設定辞書を返します。
let assetWriter = try AVAssetWriter(url: outputURL, fileType: AVFileTypeQuickTimeMovie)
let settingsAssistant = AVOutputSettingsAssistant(
preset: AVOutputSettingsPreset.hevc1920x1080)
settingsAssistant.sourceVideoFormat = videoFormatDescription
let newVideoSettings = settingsAssistant.videoSettings
// Modify a few fields in newVideoSettings here
let assetWriterInput = AVAssetWriterInput(mediaType: AVMediaTypeVideo,
outputSettings: newVideoSettings)
assetWriter.add(assetWriterInput)
guard assetWriter.startWriting() else {
throw assetWriter.error!
}
キーポイント:
hevc1920x1080は HEVC の解像度プリセットを提供します。sourceVideoFormatはvideoSettingsを読む前に設定します。transcript はソース特性とプリセットを組み合わせることを強調しています。videoSettingsはそのまま使っても、サイズやビットレートなどを変更する出発点にもなります。- このパスは
AVAssetExportSessionのデフォルトに近い挙動を保ちつつ、少数のカスタム制御を残したいエクスポーターに向いています。
5. HDR 関連の outputSettings を確認する(15:36)
transcript は HDR エクスポートで注意すべき 3 組の key を明示しています。
| Key | 確認内容 |
|---|---|
AVVideoCodecKey | HDR エクスポートは HEVC と Apple ProRes をサポートします。HEVC は配信向け、ProRes はプロ向けワークフロー向けです。 |
AVVideoColorPropertiesKey | transfer function、color primaries、YCbCr matrix を含みます。HLG と PQ がサポートされる HDR transfer function で、HDR コンテンツは BT.2020 をよく使います。 |
AVVideoCompressionPropertiesKey | HEVC HDR エクスポートでは VideoProfileLevelKey を HEVC_Main10_AutoLevel にする必要があります。この key は ProRes エクスポートには適用されません。 |
HDR10 には MasteringDisplayColorVolume と ContentLightLevelInfo の 2 つの metadata も載せられます。欠けるとデコーダの EOTF はデフォルト仮定に依存するため、可能なら両方を提供することをセッションは推奨しています。
6. プラットフォーム境界を覚えておく(20:44)
iOS では Apple A10 Fusion 以降のチップを搭載したデバイスが HEVC ハードウェアエンコードをサポートします。セッションの例には iPhone 7、2018 年発売の iPad、2019 年の iPod touch が含まれます。
Mac ではすべての Mac に HEVC と Apple ProRes のソフトウェアエンコーダがあります。HEVC ハードウェアエンコードは一般に新しい macOS を動かす 2017 年以降の Mac に現れ、ハードウェアエンコードはエクスポートを大幅に速くします。
重要ポイント
-
やること: 動画編集 App に「HDR をそのままエクスポート」オプションを追加する。価値:
AVAssetExportSessionの HEVC と Apple ProRes プリセットは HDR10 または HLG のソース形式を保持します。始め方: 既存のエクスポートフローを再利用し、プリセットを HEVC または Apple ProRes に切り替え、エクスポート後にソース種別に応じた出力形式を確認します。 -
やること: カメラ系 App に HDR クリップエクスポートを追加する。価値:
AVAssetWriterはカメラキャプチャフレームから直接ファイルを書き、codec、フレームレート、サイズ、ダイナミックレンジを制御できます。始め方:AVAssetWriterを作成し、キャプチャビデオのvideoFormatDescriptionをsourceFormatHintに渡し、最初はAVVideoCodecKeyだけ明示設定します。 -
やること: 混合 SDR/HDR 素材向けのエクスポートプレビュー警告を作る。価値: 混合 composition では
AVAssetExportSessionが HDR 出力を優先し、SDR ソースは HDR に変換されます。始め方: タイムライン素材のダイナミックレンジを走査し、最終出力が HDR、HLG、metadata 付き形式になることをエクスポートパネルに示します。 -
やること: プロユーザー向けに「HDR10 パラメータ確認」パネルを提供する。価値: HDR10 出力は PQ、
BT.2020、Main10 profile に依存し、MDCV と CLLI metadata の影響も受けます。始め方: AVAssetWriter 設定画面に codec、transfer function、color primaries、matrix、profile level、metadata 状態をエクスポート前に一覧表示します。 -
やること: HDR と SDR の共有版を両方提供する。価値: セッションは古いデバイス互換のため H.264 プリセットで HDR を SDR に変換することを推奨しています。始め方: 同じソースから 2 回エクスポートし、1 本は HEVC または ProRes で HDR を保持、もう 1 本は H.264 で SDR 共有ファイルを生成します。
関連セッション
- Edit and play back HDR video with AVFoundation — まず HDR 素材が AVVideoComposition、Core Image、カスタム compositor でどう編集・プレビューされるかを確認します。
- Author fragmented MPEG-4 content with AVAssetWriter — HLS セグメントファイル向けに AVAssetWriter の fragmented MPEG-4 出力を続けます。
- Optimize the Core Image pipeline for your video app — エクスポート前の動画フィルタパイプライン、CIContext、Metal 性能に適しています。
- Decode ProRes with AVFoundation and VideoToolbox — ProRes エクスポート選択を、デコードと表示パイプラインの詳細で補完します。
コメント
GitHub Issues · utterances