骁龙及高通品牌产品均属于Qualcomm Technologies公司和/或其子公司产品。
最新推出的安卓设备具有强大的移动计算和丰富的媒体功能,而高动态范围(HDR)的超高质量视频则是其最吸引人的功能之一。与标准动态范围(SDR)相比,高动态范围可以实现更加明亮、更加细致的高光和阴影,以及更广泛的颜色范围。但是,由于标准动态范围(SDR)仍然是一种重要的格式,用户需要一种无缝的体验来与其他用户的标准动态范围设备以及社交媒体网站等外部系统共享高动态范围内容(例如,某些社交媒体网站支持从标准的8位JPEG图像扩展到高动态范围(HDR))。
为了支持这一功能,安卓13要求具有10位亮度和色差信号功能的任何安卓设备也必须支持标准动态范围,并使用HLG10作为捕捉HDR的基线。各种应用程序均可以选择支持额外的HDR标准,包括HDR10、HDR10+和杜比视界8.4。
如果您是一位安卓应用程序开发人员,并且集成了可以支持HDR的标准摄像头至最终用户管道,那么您会想要更加熟悉安卓API中的Camera2 API包。该API提供了对特定设备功能的低级访问,尽管它需要管理对于特定设备的配置,但它允许您处理复杂的用例。
让我们仔细看看都需要哪些内容。
常用术语
在进入Camera2之前,了解你在实现一个典型的相机到终端用户管道时将遇到的几个关键术语是很重要的:
- 捕捉:是指捕捉来自于机载摄像头传感器的数据 – 无论是进行预览还是记录。
- 编辑:是指在编解码器层次上将原始数据处理为HDR或SDR。这一过程的关键阶段是色调映射,通过色调映射降低色调值,以确保图像适合在数字屏幕上显示。
- 编码:是指压缩原始数据(例如,用于存储和共享)。
- 转码:是指将视频解压缩并重新编码(例如,重新编码至不同的编解码器格式,从高动态范围到标准动态范围模式等)。在此阶段还可以进行其他更改(例如,添加水印)。
- 解码:是指对经过编码的视频解压缩,以进行播放。
检查HLG支持情况
首先要做的是检查HLG支持情况。安卓的Camera2API为此提供了一个直接的接口。正如其文档中所述:“HLG10是设备制造商必须支持的10位相机的基本HDR标准”,所以从检查10位摄像头是否存在开始,如其代码示例所示:
高动态范围视频捕捉
下一步是为摄像头设备设置摄像头捕捉会话,以捕捉摄像头发出的视频。摄像头捕捉会话抽象了从摄像头到一个或多个目标表面捕捉图像的过程。
以下代码示例来自安卓的HDR视频捕捉专题,显示了在操作系统版本的基础上,使用不同方法创建摄像头捕捉会话的方法:
注意:预览流及其共享流需要低延迟配置文件,但这对于视频流属于可选项。在调用 setDynamicRangeProfile()前,某项应用程序可以通过调用isExtraLatencyPresent()(在动态范围配置文件HDR10_PLUS、动态范围配置文件.HDR10和动态范围配置文件.HLG之间传递),来确定任何高动态范围模式是否存在额外的预检延迟。
然后,可以将会话对象用于预览和记录。以下代码示例显示了如何通过调用重复性捕捉请求来启动预览:
session.setRepeatingRequest(previewRequest, null, cameraHandler).
注意:
- cameraHandler是应该调用侦听器的线程处理程序(或者可以设置为null,以使用当前线程)。
- 如果应用程序将不同的HDR文件用于预览和视频,则该应用程序必须使用getProfileCaptureRequestConstraints()检查有效的配置文件组合。
重复性捕捉请求保持了连续的帧流,而不必持续调用逐帧捕捉请求。第一个参数是一个捕捉请求,它包含了执行捕捉所必需的信息(例如,捕捉硬件、输出缓冲区、目标表面等)。
同样,记录也是利用重复性请求开始。以下示例表明,可以将具有捕捉回调的申请用于跟踪捕捉进度(例如:启动,停止等):
HDR10/10+视频编辑
在视频编辑时,应当使用MediaCodec类执行。如要确定设备是否支持HDR视频,则调用getcapacabiltiesfortype()方法,该方法可以返回MediaCodecInfo.CodecCapabilities对象,然后调用该对象的isFeatureSupported()方法,在FEATURE_HdrEditing字符串中传送。如果该方法返回true,则设备支持亮度和色差信号以及三色输入。在这种情况下,编码器将RGBA1010102转换为可编码的YUV P010并进行色调映射。例如,如果用户将HDR视频记录在HLG中,则可以将该视频缩小/旋转,或添加徽标/标签,并将其保存为HDR格式。
可以将TransformationRequest.Builder类的experimental_setEnableHdrEditing()方法用于来构造用于HDR编辑的转换。
将高动态范围转码为标准动态范围
您可能需要支持将HDR内容转码为SDR,以确保跨不同设备共享内容或将视频导出为其他格式。骁龙®技术具有经过优化的管道,可在转换过程中寻找减少延迟的方法,并可以对各种HDR格式进行色调映射,包括HLG10、HDR10、HDR10+和杜比视界(在许可设备上)。
您可以通过实施Codec.DecoderFactory接口并与Media API配合的方式启用转码。此时,您可以为视频的MIME类型构造一个MediaFormat对象,并将MediaFormat.KEY_COLOR_TRANSFER_REQUEST传送到对象的setInteger()方法,以及MediaFormat.COLOR_TRANSFER_SDR_VIDEO标记。
以下示例表明了接口createForVideoDecoding()方法实现。该实现配置了一个编解码器,它可以对原始视频帧进行色调映射,以匹配所请求的传输:
请参阅此处查看完整示例。
AndroidX Media(媒体代码示例的集合)中的转换器示例展示了一个更为复杂的示例。
结论
对于安卓应用程序开发人员而言,Camera2是添加HDR支持的一个很好起点。利用Camera2,您可以按照运行时间查询设备功能,并提供可选的代码路径,以便在所支持的设备上充分利用HDR,比如那些由骁龙移动平台驱动的设备。最重要的是,目前可以为您提供该类基础设备!
请务必查看本公司的全新骁龙安卓页面,以获取学习资源和其他用于安卓系统开发的应用程序接口资源。
请注册订阅本公司的时事通讯,以随时了解安卓系统的最新开发情况。
高通品牌产品均属于Qualcomm Technologies公司和/或其子公司产品。
相关博客: