HDR 拍摄架构

HDR 拍摄架构

注意:本页介绍的是 Camera2 软件包。除非您的应用需要 Camera2 中的特定低级功能,否则我们建议您使用 CameraX。CameraX 和 Camera2 都支持 Android 5.0(API 级别 21)及更高版本。

Camera2 API 支持

高动态范围 (HDR) 视频拍摄,可让您预览并

使用相机录制 HDR 视频内容。与标准动态相比

范围 (SDR)、HDR 提供的色彩范围更广

亮度分量的范围(从当前的 100 cd/m2 到 1000 cd/m2)。

这样生成的视频质量更接近真实情况,

更丰富的色彩、更明亮的高光和更深的阴影。

看看 HDR 视频如何以更鲜艳的细节展现日落美景。

图 1.SDR(顶部)与 HDR(底部)视频质量的比较。

。

注意: 从 Android 13 开始,具有 10 位相机输出的相机设备

必须支持 HLG10 格式进行 HDR 拍摄和播放。

如需了解详情,请参阅 HDR 格式。

设备前提条件

并非所有 Android 设备都支持 HDR 视频拍摄。

在应用中拍摄 HDR 视频之前,请先确定您的设备是否符合

以下前提条件:

以 Android 13(API 级别 33)为目标平台。

具有支持 10 位或更高级别的相机传感器。如需详细了解 HDR,

有关是否支持,请参阅检查 HDR 支持情况。

由于并非所有设备都满足前提条件,因此您可以单独添加代码

路径。

这样一来,您的应用便可以在不兼容的设备上回退到 SDR。

此外,请考虑为 SDR 添加界面选项。然后,用户可以

SDR 和 HDR 之间的联系,以满足他们的视频录制需求。

HDR 拍摄架构

下图显示了 HDR 拍摄架构的主要组件。

图 2. HDR 拍摄架构图。

当相机设备以 HDR 格式拍摄帧时,Camera2 框架会分配

用于存储处理的相机传感器输出的缓冲区。

如果 HDR 配置文件需要,它还会附加相应的 HDR 元数据。

然后,Camera2 框架会将已填充的缓冲区加入输出 Surface 的队列

CaptureRequest 中引用,例如 display 或

如图所示。

注意: 相机应用无法通过 Camera2 API 或任何

媒体 API

。

检查是否支持 HDR

在应用中拍摄 HDR 视频之前,请先确定设备是否支持

设置所需的 HDR 配置文件

使用 CameraManager getCameraCharacteristics() 方法获取

CameraCharacteristics

您可以查询设备的 HDR 功能。

以下步骤用于检查设备是否支持 HLG10。

HLG10 是设备制造商必须支持的基准 HDR 标准

在具有 10 位输出的相机上。

首先,检查设备是否支持 10 位配置文件(HLG10 的位深):

Kotlin

private fun isTenBitProfileSupported(cameraId: String): Boolean {

val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)

val availableCapabilities = cameraCharacteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)

for (capability in availableCapabilities!!) {

if (capability == CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) {

return true

}

}

return false

}

接下来,检查设备是否支持 HLG10(或其他受支持的配置文件):

Kotlin

@RequiresApi(api = 33)

private fun isHLGSupported(cameraId: String): Boolean {

if (isTenBitProfileSupported(cameraId)) {

Val cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId)

val availableProfiles = cameraCharacteristics

.get(CameraCharacteristics.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES)!!

.getSupportedProfiles()

// Checks for the desired profile, in this case HLG10

return availableProfiles.contains(DynamicRangeProfiles.HLG10)

}

return false;

}

如果设备支持 HDR,isHLGSupported() 始终返回 true。

有关详情,请参阅

CameraCharacteristics

参考文档。

设置 HDR 拍摄

确保您的设备支持 HDR 后,设置您的应用以拍摄

来自相机的原始 HDR 视频串流。

使用 setDynamicRangeProfile() 提供数据流的 OutputConfiguration

然后向该配置文件传递

发送至CameraCaptureSession

。

请参阅支持的 HDR 配置文件列表。

在以下代码示例中,setupSessionDynamicRangeProfile() 首先检查

确认设备搭载的是 Android 13。

然后,它会使用设备支持的 CameraCaptureSession 设置

HDR 配置文件,如 OutputConfiguration:

Kotlin

/**

* Creates a [CameraCaptureSession] with a dynamic range profile.

*/

private fun setupSessionWithDynamicRangeProfile(

dynamicRange: Long,

device: CameraDevice,

targets: List,

handler: Handler? = null,

stateCallback: CameraCaptureSession.StateCallback

): Boolean {

if (android.os.Build.VERSION.SDK_INT >=

android.os.Build.VERSION_CODES.TIRAMISU) {

val outputConfigs = mutableListOf()

for (target in targets) {

val outputConfig = OutputConfiguration(target)

//sets the dynamic range profile, for example DynamicRangeProfiles.HLG10

outputConfig.setDynamicRangeProfile(dynamicRange)

outputConfigs.add(outputConfig)

}

device.createCaptureSessionByOutputConfigurations(

outputConfigs, stateCallback, handler)

return true

} else {

device.createCaptureSession(targets, stateCallback, handler)

return false

}

}

}

当相机应用初始化相机时,它会发送一个

正在重复

CaptureRequest

预览录制内容:

Kotlin

session.setRepeatingRequest(previewRequest, null, cameraHandler)

此外,要开始录制视频,请执行以下操作:

Kotlin

// Start recording repeating requests, which stops the ongoing preview

// repeating requests without having to explicitly call

// `session.stopRepeating`

session.setRepeatingRequest(recordRequest,

object : CameraCaptureSession.CaptureCallback() {

override fun onCaptureCompleted(session: CameraCaptureSession,

request: CaptureRequest, result: TotalCaptureResult) {

if (currentlyRecording) {

encoder.frameAvailable()

}

}

}, cameraHandler)

对 HDR 摄像头视频流进行编码

如需对 HDR 相机数据流进行编码并将文件写入磁盘,请执行以下操作:

请使用 MediaCodec。

首先,获取 OutputSurface,

映射到存储原始视频数据的缓冲区。

对于MediaCodec,

请使用 createInputSurface()。

要初始化 MediaCodec,应用必须创建一个

MediaFormat,其中包含指定的

编解码器配置文件、颜色空间、颜色范围和转换函数:

Kotlin

val mimeType = when {

dynamicRange == DynamicRangeProfiles.STANDARD -> MediaFormat.MIMETYPE_VIDEO_AVC

dynamicRange < DynamicRangeProfiles.PUBLIC_MAX ->

MediaFormat.MIMETYPE_VIDEO_HEVC

else -> throw IllegalArgumentException("Unknown dynamic range format")

}

val codecProfile = when {

dynamicRange == DynamicRangeProfiles.HLG10 ->

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10

dynamicRange == DynamicRangeProfiles.HDR10 ->

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10

dynamicRange == DynamicRangeProfiles.HDR10_PLUS ->

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus

else -> -1

}

// Failing to correctly set color transfer causes quality issues

// for example, washout and color clipping

val transferFunction = when (codecProfile) {

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10 ->

MediaFormat.COLOR_TRANSFER_HLG

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10 ->

MediaFormat.COLOR_TRANSFER_ST2084

MediaCodecInfo.CodecProfileLevel.HEVCProfileMain10HDR10Plus ->

MediaFormat.COLOR_TRANSFER_ST2084

else -> MediaFormat.COLOR_TRANSFER_SDR_VIDEO

}

val format = MediaFormat.createVideoFormat(mimeType, width, height)

// Set some properties. Failing to specify some of these can cause the MediaCodec

// configure() call to throw an exception.

format.setInteger(MediaFormat.KEY_COLOR_FORMAT,

MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface)

format.setInteger(MediaFormat.KEY_BIT_RATE, bitRate)

format.setInteger(MediaFormat.KEY_FRAME_RATE, frameRate)

format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL)

if (codecProfile != -1) {

format.setInteger(MediaFormat.KEY_PROFILE, codecProfile)

format.setInteger(MediaFormat.KEY_COLOR_STANDARD,

MediaFormat.COLOR_STANDARD_BT2020)

format.setInteger(MediaFormat.KEY_COLOR_RANGE, MediaFormat.COLOR_RANGE_LIMITED)

format.setInteger(MediaFormat.KEY_COLOR_TRANSFER, transferFunction)

format.setFeatureEnabled(MediaCodecInfo.CodecCapabilities.FEATURE_HdrEditing,

true)

}

mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE)

有关实现的详情,请参见 Camera2Video 示例应用的

EncoderWrapper.kt。

HDR 格式

从 Android 13 开始,具有 10 位输出功能的相机设备

必须支持 HLG10 进行 HDR 拍摄,并且

playback(播放)。

此外,设备制造商可以启用他们选择的任何 HDR 格式

使用 HDR 拍摄架构。

下表总结了可用的 HDR 格式及其功能

。

格式

传递函数 (TF)

元数据

编解码器

位元深度

HLG10

HLG

否

HEVC

10 位

HDR10

PQ

静态

HEVC

10 位

HDR10+

PQ

动态

HEVC

10 位

杜比视界 8.4

HLG

动态

HEVC

10 位

资源

如需了解具有 HDR 视频拍摄功能且能正常运行的应用,请参阅

Camera2Video 示例

。

相关数据流

女孩取名字大全:1600個好聽的女孩名字
365bet开户网址

女孩取名字大全:1600個好聽的女孩名字

⌚ 07-24 👁️‍🗨️ 2103
AMD 皓龙 3280
365bet开户网址

AMD 皓龙 3280

⌚ 12-30 👁️‍🗨️ 3092
教你使用iphone震动模式,最全面的使用技巧,特别实用!
365bet体育35元

教你使用iphone震动模式,最全面的使用技巧,特别实用!

⌚ 01-08 👁️‍🗨️ 6847