11 月 26 日更新。
正如@Deepak 在他自己的回答和评论中发布的那样,“x420”标记格式将使相机在 HLG 模式下工作。IP12 Pro 中所有可用的启用 HLG 的格式都在下面更新。
原始答案
对于 iOS 14.2,我可以从 AVCaptureDevice 实例中转储所有可用格式,似乎日志输出可以很好地解释自己。如下所述,希望将 AVCaptureDevice.activeFormat 设置为 HDR+wide 颜色格式之一将完成这项工作。
<AVCaptureDeviceFormat: 0x282d8daf0 'vide'/'x420' 1280x 720, { 1- 30 fps}, HRSI:4096x2304, fov:68.161, supports vis, max zoom:120.00 (upscales @2.91), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports depth>
<AVCaptureDeviceFormat: 0x282d8dac0 'vide'/'x420' 1280x 720, { 1- 60 fps}, HRSI:4096x2304, fov:68.161, supports vis, max zoom:120.00 (upscales @2.91), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports depth>
<AVCaptureDeviceFormat: 0x282d8da50 'vide'/'x420' 1920x1080, { 1- 30 fps}, HRSI:4096x2304, fov:68.161, supports vis, max zoom:120.00 (upscales @1.94), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports depth, supports multicam>
<AVCaptureDeviceFormat: 0x282d8da30 'vide'/'x420' 1920x1080, { 1- 60 fps}, HRSI:4096x2304, fov:68.161, supports vis, max zoom:120.00 (upscales @1.94), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports multicam>
<AVCaptureDeviceFormat: 0x282d8d9e0 'vide'/'x420' 1920x1440, { 1- 30 fps}, HRSI:4032x3024, fov:67.096, max zoom:189.00 (upscales @2.10), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports depth, supports multicam>
<AVCaptureDeviceFormat: 0x282d8d950 'vide'/'x420' 3840x2160, { 1- 30 fps}, HRSI:4096x2304, fov:68.161, supports vis, max zoom:125.25 (upscales @1.00), AF System:2, ISO:34.0-3264.0, SS:0.000014-1.000000, supports wide color, supports multicam>
截至 11 月 23 日,这仍然是一个正在进行的调查,我认为需要一些共同努力,或者苹果工程师可以看看这个。
我相信我已经观看了关于这个主题的所有可用的 WWDC17/18/19/20 会议,并且随着新 iPhone 12 的发布,这里有一些发现。
从相机捕获 HDR 并直接保存为 10 位 HLG 视频仅适用于 iPhone 12 及更新版本。这就是它在产品发布中所声称的,并且我从朋友的新手机中获得了示例视频,它按预期工作。
在 WWDC2020 中,使用 AVFoundation 在您的应用中导出 HDR 媒体,它声称:
在这一点上,我想简要介绍一下哪些 Apple 平台可以支持 HDR 导出。
iOS 支持在配备 Apple A10 Fusion 芯片或更新版本的设备上进行 HEVC 硬件编码。
幸运的是,A10 设备已经存在了一段时间,可以追溯到 iPhone 7、2018 年发布的 iPad 和 2019 年的 iPod touch。
对于 Mac,HEVC 和 Apple ProRes 软件编码器均适用于所有 Mac。
HEVC 硬件编码在 2017 年和运行新 macOS 的更新的 Mac 上普遍可用。
硬件编码将使导出速度显着加快。
同样在该视频中,它声称HDR 导出仅适用于 10bit HEVC 编码,因此 A10+ SoC 应该具有 10bit HEVC 编码能力。这是一个猜测,我可以在 iPhone 11 和 SE2 上的官方 Photo 应用程序中编辑 iPhone12 HLG 视频,并且写入性能(4k@60p,HLG)相当不错,这是一个很好的指标。但是,我没有运气在代码中完成这项工作,视频中列出的示例代码不可能是全貌,而且我还很难找到一个工作演示。理论上,旧设备也应该能够记录 10 位 HLG,或者相机,热/功率预算是这里的限制。
但是,其中唯一相关的 HDR 键是 VideoProfileLevelKey,在使用 HEVC 编解码器导出 HDR 时必须将其设置为 HEVC_Main10_AutoLevel。
请注意,不支持 8 位 HEVC HDR,并且此密钥不适用于 ProRes 导出。
好的,现在让我们花点时间总结一下在输出到两种常见的 HDR 格式时如何配置我刚才讨论的键:HLG 和 HDR10。此表显示了用于导出 HLG 文件的相关 HDR 设置。
另一个值得反复观看的视频:使用 AVFoundation 编辑和播放 HDR 视频
在测试期间,我确实得到了一个启用了 HDR 的 CVPixelBuffer(format:kCVPixelFormatType_420YpCbCr10BiPlanarFullRange),并且从示例 HLG 视频中正确管理了颜色。这是来自我的控制台日志的转储,它适用于任何支持 iOS 14 的设备,即使是相当旧的 iPhone6s(A9),因为它在这里只涉及 10 位 HEVC 解码。
_displayLinkDidRefresh():121 - Optional(<CVPixelBuffer 0x281300500 width=3840 height=2160 pixelFormat=xf20 iosurface=0x282008050 planes=2 poolName=450:decode_1>
<Plane 0 width=3840 height=2160 bytesPerRow=7680>
<Plane 1 width=1920 height=1080 bytesPerRow=7680>
<attributes={
PixelFormatDescription = {
BitsPerComponent = 10;
CGBitmapContextCompatibility = 0;
CGImageCompatibility = 0;
ComponentRange = FullRange;
ContainsAlpha = 0;
ContainsGrayscale = 0;
ContainsRGB = 0;
ContainsYCbCr = 1;
FillExtendedPixelsCallback = {length = 24, bytes = 0x0000000000000000b48ab8a1010000000000000000000000};
IOSurfaceCoreAnimationCompatibility = 1;
IOSurfaceCoreAnimationCompatibilityHTPCOK = 1;
IOSurfaceOpenGLESTextureCompatibility = 1;
OpenGLESCompatibility = 1;
PixelFormat = 2019963440;
Planes = (
{
BitsPerBlock = 16;
HorizontalSubsampling = 1;
VerticalSubsampling = 1;
},
{
BitsPerBlock = 32;
BlackBlock = {length = 4, bytes = 0x00800080};
HorizontalSubsampling = 2;
VerticalSubsampling = 2;
}
);
};
} propagatedAttachments={
CVFieldCount = 1;
CVImageBufferChromaLocationBottomField = Left;
CVImageBufferChromaLocationTopField = Left;
CVImageBufferColorPrimaries = "ITU_R_2020";
CVImageBufferTransferFunction = "ITU_R_2100_HLG";
CVImageBufferYCbCrMatrix = "ITU_R_2020";
QTMovieTime = {
TimeScale = 600;
TimeValue = 12090;
};
} nonPropagatedAttachments={
}>)