用 AVFoundation 编辑和播放 HDR 视频
Edit and play back HDR video with AVFoundation
2020年6月24日
一句话判断
HDR 视频不再只是播放器的专利——iOS 14 让你可以用 AVFoundation 直接编辑 HDR 内容,如果你的视频 App 还只处理 SDR,这是升级的好时机。
这场 Session 讲了什么
随着 iPhone 12 系列支持杜比视界(Dolby Vision)HDR 录制,苹果在 AVFoundation 中大幅扩展了对 HDR 视频的编辑和播放支持。Session 详细讲解了 HDR 视频的技术基础——从 BT.2020 色彩空间、PQ/HLG 传输函数到元数据的嵌入方式。
在播放方面,AVPlayer 现在可以自动检测 HDR 内容并正确处理色彩映射。Session 展示了如何使用 AVPlayerItemMetadataOutput 获取 HDR 元数据,以及如何配置 AVPlayerLayer 正确显示 HDR 画面。
在编辑方面,AVFoundation 新增了对 HDR 感知的合成(Composition)支持。AVAssetExportSession 和 AVAssetWriter 都支持保留 HDR 元数据。关键是理解色彩空间的概念——编辑过程中如果不当转换色彩空间,会导致 HDR 内容的色彩丢失或失真。
值得深挖的点
色彩空间转换的陷阱。 HDR 视频使用 BT.2020 色彩空间,比 BT.709(标准 SDR)的色域宽很多。如果在编辑管线中的某个环节不小心把色彩空间缩小到 BT.709,HDR 信息就永久丢失了。Session 强调了在整个编辑管线中保持一致色彩空间的重要性。
杜比视界 Profile 8 的处理。 杜比视界不是简单的 HDR——它使用动态元数据来逐场景调整亮度映射。AVFoundation 现在可以读取和保留这些元数据,但如果你在编辑中重新编码视频,需要确保元数据被正确传递。
代码片段
import AVFoundation
// 检查视频是否为 HDR 内容
let asset = AVAsset(url: videoURL)
let tracks = asset.tracks(withMediaType: .video)
for track in tracks {
// 检查色彩空间,BT.2020 通常表示 HDR
if track.formatDescriptions.count > 0 {
let description = track.formatDescriptions[0]
// 通过 CMFormatDescription 获取色彩空间信息
print("视频色彩空间: \(description)")
}
}
// 配置 AVPlayer 支持 HDR 播放
let playerItem = AVPlayerItem(url: hdrVideoURL)
let player = AVPlayer(playerItem: playerItem)
// AVPlayerLayer 会自动处理 HDR 到 SDR 的色调映射
// 在不支持 HDR 的显示器上自动降级为 SDR
let playerLayer = AVPlayerLayer(player: player)
playerLayer.videoGravity = .resizeAspect
// 导出时保留 HDR 元数据
let composition = AVMutableComposition()
// ... 添加轨道 ...
let exportSession = AVAssetExportSession(
asset: composition,
presetName: AVAssetExportPresetHighestQuality
)!
exportSession.outputURL = outputURL
exportSession.outputFileType = .mov
// 关键:设置正确的色彩空间以保留 HDR 信息
exportSession.metadata = asset.metadata
exportSession.exportAsynchronously {
switch exportSession.status {
case .completed:
print("HDR 视频导出完成")
case .failed(let error):
print("导出失败: \(error)")
default:
break
}
}
最佳实践
- 在编辑管线的每个环节都检查色彩空间。 从读取源视频到最终导出,确保不会在中间步骤意外缩小色域。
- 使用 AVAssetWriter 而非 AVAssetExportSession 做精细控制。 当你需要控制编码参数(如色彩空间、传输函数)时,AVAssetWriter 提供了更底层的访问。
- 在非 HDR 设备上测试色调映射。 HDR 内容在 SDR 设备上的显示效果取决于色调映射算法,要确保降级后的画面仍然可看。
- 注意 HDR 视频的文件体积。 HDR 视频通常比 SDR 大 20-30%,在存储和上传场景中要提前规划。
还有什么值得关注
- AVPlayer 的新 delegate 方法可以通知你 HDR 内容的播放状态变化
- 使用 CVPixelBuffer 的色彩空间附件来追踪每一帧的色彩信息
- 新的 AVAssetTrack 属性可以让你快速判断轨道是否包含 HDR 内容
- 配合 Metal 可以在自定义渲染管线中处理 HDR 视频