WWDC Quick Look 💓 By SwiftGGTeam
Export HDR media in your app with AVFoundation

Export HDR media in your app with AVFoundation

元の動画を見る

ハイライト

WWDC 2020 で Apple は開発者向けに HDR エクスポートを開放しました。AVAssetExportSession の HEVC と Apple ProRes プリセットは HLG/HDR10 のソース形式を保持し、AVAssetWritersourceFormatHint または 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 として渡すか、AVOutputSettingsAssistantAVAssetExportSession に近いデフォルト設定を生成し、製品要件に合わせて少数のフィールドだけ変更します。

詳細

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 形式を保持すると説明しています。
  • outputURLoutputFileType はエクスポート先です。例は QuickTime movie です。
  • exportAsynchronouslyWithCompletionHandler は非同期エクスポートを開始し、完了処理は App 側が担います。
  • HDR を SDR に変換するには、セッションは後方互換性のため H.264 プリセットを推奨しています。

混合素材では、AVAssetExportSession はすべてのソースを確認します。HDR コンテンツが 1 つでもあれば出力は HDR になり、SDR 素材は HDR に変換されます。異なる HDR 形式が混在する場合、デフォルト戦略はまず HLG を優先し、次に metadata 付き HDR 形式を優先します。

3. AVAssetWriter と sourceFormatHint で設定を簡素化する(13:24

AVAssetWriter はより多くの制御を提供しますが、出力設定辞書は間違えやすくなります。最初の簡素化は、ソース素材の videoFormatDescriptionAVAssetWriterInput に渡すことです。

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 の解像度プリセットを提供します。
  • sourceVideoFormatvideoSettings を読む前に設定します。transcript はソース特性とプリセットを組み合わせることを強調しています。
  • videoSettings はそのまま使っても、サイズやビットレートなどを変更する出発点にもなります。
  • このパスは AVAssetExportSession のデフォルトに近い挙動を保ちつつ、少数のカスタム制御を残したいエクスポーターに向いています。

5. HDR 関連の outputSettings を確認する(15:36

transcript は HDR エクスポートで注意すべき 3 組の key を明示しています。

Key確認内容
AVVideoCodecKeyHDR エクスポートは HEVCApple ProRes をサポートします。HEVC は配信向け、ProRes はプロ向けワークフロー向けです。
AVVideoColorPropertiesKeytransfer function、color primaries、YCbCr matrix を含みます。HLG と PQ がサポートされる HDR transfer function で、HDR コンテンツは BT.2020 をよく使います。
AVVideoCompressionPropertiesKeyHEVC HDR エクスポートでは VideoProfileLevelKeyHEVC_Main10_AutoLevel にする必要があります。この key は ProRes エクスポートには適用されません。

HDR10 には MasteringDisplayColorVolumeContentLightLevelInfo の 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 を作成し、キャプチャビデオの videoFormatDescriptionsourceFormatHint に渡し、最初は 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 共有ファイルを生成します。

関連セッション

コメント

GitHub Issues · utterances