AppでHDRビデオの再生、編集、エクスポートに対応する

Appでハイダイナミックレンジ(HDR)をサポートすると、より鮮明でリアルな映像を作成することができます。さらに、Dolby VisionでHDRに対応している場合、iPhone 12またはiPhone 12 Proを持っているユーザーは、高画質の映像をデバイスから撮影、編集、再生できるようになります。Dolby Visionでは、元の映像を維持しながら、フレームごとに動的に調整が行われます。

ここでは、HDRビデオの再生、編集、エクスポートを行うための最適な操作をAppで提供する方法についてご紹介します。

HDRビデオをはじめよう

AppでHDRビデオを利用するには、AppがiOS 14.1以降に対応している必要があります。まず始めに、WWDCのセッションを視聴することをおすすめします。セッションでは、HDRビデオの利用手順に関する概要を紹介しています。

AVFoundationを用いHDRメディアをAppでエクスポート

Watch now

AVFoundationを使用したHDR動画の編集と再生

Watch now

注:iPhone 12およびiPhone 12 Proでは、HEVC(10ビット)コーデックを使用して、Dolby Vision Profile 8.4, Cross-compatibility ID 4(HLG)形式でHDRビデオをレコードします。この形式は、HLGと後方互換性があるように設計されており、既存のHEVCデコーダーでHLGとしてデコードすることができます。ビデオは、QuickTime File Format(QTFF)形式のビデオ(.mov拡張子)としてカメラAppによってレコードされます。QTFF動画でのDolby Visionのシグナリングは、ISOベースのメディアファイル形式内にあるDolby Visionストリームのシグナリングと似ています。


Learn more about Dolby Vision Profiles

Learn more about Dolby Vision Levels

Learn more about Dolby Vision Streams

AppでHDRビデオの再生に対応する

iOSとmacOSはどちらも、対象となるすべてのデバイスでHDRビデオの再生に対応しています。現在のデバイスでHDR再生がサポートされているかどうかを確認するには、「AVPlayer」で「eligibleForHDRPlayback」を使用してください。Dolby Visionのビデオを再生するには、一般的に「AVPlayer」、「AVPlayerlayer」、「AVSampleBufferDisplayLayer」のいずれかのクラスを使用できます。Appで「AVPlayer」を使用している場合は、コードに何も追加する必要はありません。「AVFoundation」フレームワークは、Dolby Visionでアセットを検出し、デバイスがHDR再生に対応している場合、Dolby Vision Profile 8.4を処理するHDR再生パイプラインを自動的に設定します。

Appでビデオのレンダリングに「AVSampleBufferDisplayLayer」が使用されている場合、サンプルバッファ表示層に渡されるサンプルバッファがHDRに適した形式であること、および、Dolby Vision Profile 8.4のフレームごとのメタデータを含んでいることを確認してください。これらのサンプルバッファには、10ビット以上のビット深度が必要です。一般的に使用される10ビット形式は、4:2:0 Y’CbCrのビデオレンジで、「kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange」によって表されます。このピクセルフォーマットに関連付けられている「OSType」は、「’x420’」です。

サンプルバッファが「VTDecompressionSession」を使用してデコードされている場合、「kVTDecompressionPropertyKey_PropagatePerFrameHDRDisplayMetadata」を使用することで、Dolby Vision Profile 8.4のフレームごとのメタデータをバッファに含めることができます。デフォルトではこの値は、trueです。

アセットの検査 「AVMediaCharacteristic」には、ビデオにHDRメタデータが含まれているかどうかなど、メディアタイプの特性を指定するためのオプションが用意されています。Swiftのメディア特性である「containsHDRVideo」を使用すると、トラックのセグメントにHDRが含まれているかどうかを識別し、Appが正しくレンダリングを行えるようにすることができます。Objective-Cでは、「AVMediaFormat.h」で定義されている「AVMediaCharacteristicContainsHDRVideo」を使用できます。

Swiftのメソッドの「loadValuesAsynchronously(forKeys:completionHandler:)」を使用してトラックプロパティをロードした後、「tracks(withMediaCharacteristic:)」を使用してHDRトラックを取得することができます。ここでは、必要なHDRトラックを取得する方法は下記の通りです。

let hdrTracks = asset.tracks(withMediaCharacteristic: .containsHDRVideo)

同様に、次のようにして、Objective-Cのメソッド「loadValuesAsynchronouslyForKeys:completionHandler:」を使用してトラックプロパティを読み込み、メソッド「tracksWithMediaCharacteristic:」でHDRトラックを取得することができます。

NSArray<AVAssetTrack *> *hdrTracks 
= [asset tracksWithMediaCharacteristic:AVMediaCharacteristicContainsHDRVideo];

「hasMediaCharacteristic(_:)」メソッドを使用して、HDRメディアタイプ、形式の説明、明示的なタグ付けなどの、メディアの特性を追跡することができます。次に例を示します。

if track.hasMediaCharacteristic(.containsHDRVideo){
// Process HDR track
}

Objective-Cでは、同じ 「hasMediaCharacteristic:」メソッドを使って、次のように明示的なタグ付けを行うことができます。

if([track hasMediaCharacteristic:AVMediaCharacteristicContainsHDRVideo]){
    // Process HDR track
}

AppでHDRビデオの再生、編集、プレビューに対応する

アプリケーションにHDRコンテンツの編集機能を追加するには、「AVVideoComposition」を使用します。内蔵の構成要素を使用している場合は、Swift初期化子の「init(asset:applitingCIFiltersWithHandler:)」またはObjective-C初期化子の「videoCompositionWithAsset:applitingCIFiltersWithHandler:」と内臓の「CIFilters」を併用することで、AppにHDR編集パイプラインを簡単に組み込むこともできます。

カスタム構成要素は、HDRコンテンツにも対応しており、「supportsHDRSourceFrames」プロパティを使用して、HDR機能を示すことができます。Objective-Cでは、「supportsHDRSourceFrames」プロパティは、「AVVideoCompositing.h」で定義されている「AVVideoCompositing」プロトコルの一部です。

カスタム構成要素が10ビットのHDRピクセル形式で動作する必要がある場合は、「sourcePixelBufferAttributes」プロパティを使用して、構成要素が入力として受け付けるピクセルバッファ属性を選択してください。Objective-Cでは、このプロパティは 「AVVideoCompositing.h」にあります。このプロパティの値は、「CoreVideo」のヘッダーファイル「CVPixelBuffer.h」で定義されたピクセルバッファの属性キーを含むディクショナリです。

さらに、処理用の新しいバッファを作成するには、ビデオの構成要素に必要な正しいピクセルバッファ属性が必要です。これには、プロパティ 「requiredPixelBufferAttributesForRenderContext」を使用します。

Appで編集中のビデオのプレビューを提供している場合、ピクセル値を修正すると、ビデオの既存のダイナミックメタデータが無効になり、使用できなくなる可能性があります。Dolby Vision Profile 8.4のメタデータは完全に透過的であるため、「AVPlayerItem」を使用して、プレビュー専用のシナリオで無効なメタデータを削除したり、ビデオコンテンツの変更を反映してエクスポート中にダイナミックメタデータを更新することができます。

HDRの設定を行うには、「AVPlayerItem」の「appliesPerFrameHDRDisplayMetadata」プロパティを使用します。Objective-Cでは、デフォルトではこのプロパティはYESに設定されており、「AVPlayerItem.h」で見つけることができます。

「AVFoundation」がビデオに存在する場合、「AVFoundation」はデフォルトでは、Dolby Visionメタデータを使用しますが、Appにメタデータの使用を無視するように指示することができます。この指示を行うには、「AVPlayerItem」からの「appliesPerFrameHDRDisplayMetadata」プロパティを、Swiftではfalseに、Objective-CではNOに設定します。また、Appが「VideoToolbox」の「VTDecompressionSession」API を使用している場合は、「kVTDecompressionPropertyKey_PropagatePerFrameHDRDisplayMetadata」でDolby Visionのトーンマッピングをオフにします。このプロパティをCまたはObjective-Cで使用するには、フレームワークのヘッダー「VTDecompressionProperties.h」にVideoToolboxを含めるようにしてください。

AppでHDRエクスポートに対応する

「AVAssetWriter」およびHEVCプリセットを使用する場合、AppでHDRビデオのエクスポートに対応できます。

プリセットとAVAssetExportSessionを発掘する すべてのHEVCプリセットがHDRに対応しています。出力形式はソース形式と一致するため、ソースファイルがDolby Vision Profile 8.4の場合、エクスポートされる動画もDolby Vision Profile 8.4になります。出力形式を変更する必要がある場合は、「AVAssetWriter」を使用します。


*注:H.264のプリセットでは、HDRを標準ダイナミックレンジ(SDR)に変換します。


「AVAssetWriter」を使用したエクスポートでDolby Vision Profile 8.4を保持するには、適切な出力形式、Dolby Visionをサポートするcolorプロパティ、10ビットのプロファイル・レベルを選択する必要があります。

まず始めに、Swiftでは「supportedOutputSettingsKeys(for:)」、Objective-Cでは「supportedOutputSettingsKeysForConnection:」をクエリすると、現在のデバイスで対応している出力設定キーのリストが表示されることに注意してください。

Dolby Visionのエクスポートの場合、ビデオ出力設定のディクショナリキー「AVVideoCompressionPropertiesKey」を使用すると、ビットレート、Bフレームの配信、Iフレームの間隔、コーデックの品質を管理することができます。このキーに関連付けられている値は,「NSDictionary」のインスタンスです。Objective-C の場合、このキーは「AVVideoSettings.h」にあります。

たとえば、SwiftのDolby Visionのビデオ出力設定のディクショナリは、次のようなキーと値のペアを含んでいます。

let videoOutputSettings: [String: Any] = [
    AVVideoCodecKey: AVVideoCodecType.hevc,
    AVVideoProfileLevelKey: kVTProfileLevel_HEVC_Main10_AutoLevel,
    AVVideoColorPropertiesKey: [
        AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_2020,
        AVVideoTransferFunctionKey: AVVideoTransferFunction_ITU_R_2100_HLG,
        AVVideoYCbCrMatrixKey: AVVideoYCbCrMatrix_ITU_R_2020
    ],
    AVVideoCompressionPropertiesKey: [
        kVTCompressionPropertyKey_HDRMetadataInsertionMode: kVTHDRMetadataInsertionMode_Auto
    ]
]

Objective-Cでは、ビデオ出力設定のディクショナリは同じキーと値のペアで構成されます。

NSDictionary<NSString*, id>* videoOutputSettings = @{
    AVVideoCodecKey: AVVideoCodecTypeHEVC,
    AVVideoProfileLevelKey: (__bridge NSString*)kVTProfileLevel_HEVC_Main10_AutoLevel,
    AVVideoColorPropertiesKey: @{
        AVVideoColorPrimariesKey: AVVideoColorPrimaries_ITU_R_2020,
        AVVideoTransferFunctionKey: AVVideoTransferFunction_ITU_R_2100_HLG,
        AVVideoYCbCrMatrixKey: AVVideoYCbCrMatrix_ITU_R_2020
    },
    AVVideoCompressionPropertiesKey: @{
        (__bridge NSString*)kVTCompressionPropertyKey_HDRMetadataInsertionMode: (__bridge NSString*)kVTHDRMetadataInsertionMode_Auto
    }
};

Objective-Cでは、キー「kVTCompressionPropertyKey_HDRMetadataInsertionMode」および値「kVTHDRMetadataInsertionMode_Auto」は、「VTDecompressionProperties.h」にあります。

「AVAssetWriterInput」に提示されるピクセルバッファは、キーおよび値のペアを定義するだけでなく、’x420’ OSTypeで表される10ビットの4:2:0 Y’CbCrのビデオレンジであることを確認してください。

エクスポートには、別の「AVAssetReader」または「AVAssetWriter」モデルを使用することができます。その場合は、VideoToolboxのプロパティ「kVTCompressionPropertyKey_PreserveDynamicHDRMetadata」を使用し、C/Objective-CまたはSwiftに対してそれぞれkCFBooleanFalseまたはfalseに設定できます。VideoToolboxプロパティを設定すると、「AVAssetWriter」によって、ファイルをエクスポートする際に、Dolby Vision Profile 8.4のメタデータが自動的に再計算されます。これは、Appが 「AVAssetReader」からの出力フレームを変更する際に実行する必要があります。

Resources

Learn more about AVFoundation

AVFoundation

Video Toolbox

Learn more about Dolby Vision Profiles