CameraMetadata 的 Tag 构建与动态查询流程全解析:从静态能力到运行态参数的调用链追踪
关键词:
CameraMetadata、Metadata Tag、动态查询、CameraCharacteristics、getCameraInfo、元数据结构体、Key 分发、Stream 参数获取
摘要:
CameraMetadata 是 Android 相机系统中用于传递参数和状态的关键容器,其内部以 tag-value 键值对的形式组织所有拍摄参数与结果。无论是静态的 CameraCharacteristics
还是运行时的 CaptureResult/Request,最终都通过 CameraMetadata
来编码与解码数据。本篇将围绕 AOSP 源码,从 tag 的注册生成机制、静态能力的查询流程、运行时元数据的传输机制、厂商自定义 tag 的适配方式等多个角度,深入解析 CameraMetadata 的使用模式与底层实现原理,帮助工程师构建更稳定、更具调试能力的相机系统。
目录
一、CameraMetadata 的结构概览:tag × type × value 的底层组织模型
二、Tag 注册机制详解:system tag 与 vendor tag 的构建路径
三、静态能力查询流程:getCameraCharacteristics 的调用链与缓存行为
四、运行态 metadata 分发:从 request 设置到 result 生成的参数流转路径
五、动态 tag 查询机制:通过 Key 映射访问元数据的高效结构体解析
六、VendorTagDescriptor 的注册与获取:厂商自定义字段的系统接入流程
七、调试技巧与问题排查:为何出现 null、tag 缺失或值异常的根本原因
八、工程建议:合理设计 metadata 调用节奏与业务解耦策略,提升调试与扩展能力
一、CameraMetadata 的结构概览:tag × type × value 的底层组织模型
在 Android 相机架构中,CameraMetadata
是贯穿应用、Framework、HAL 各层的数据载体,其本质是一种高性能的“键值对容器”,用于表达拍照所需的输入请求、设备提供的能力说明以及最终捕获的输出结果。
其核心结构来自于 system/media/camera/include/system/camera_metadata.h
中定义的如下抽象:
typedef struct camera_metadata camera_metadata_t;
底层采用 连续内存块 + 可变长度 Entry 的设计,以最小化跨进程传输的开销。其中每条 Entry 定义如下:
typedef struct {
uint32_t tag; // 唯一标识字段,如 ANDROID_SENSOR_EXPOSURE_TIME
uint8_t type; // 数据类型,枚举为 UINT8, INT32, FLOAT, DOUBLE, RATIONAL 等
uint32_t count; // 数据数量,支持数组类型
union {
uint8_t* u8;
int32_t* i32;
float* f;
int64_t* i64;
double* d;
camera_metadata_rational_t* r;
} data;
} camera_metadata_entry_t;
以 ANDROID_SENSOR_EXPOSURE_TIME
为例,实际内容可如下表示:
字段 | 值 |
---|---|
tag | 0x10010000(曝光时间) |
type | TYPE_INT64(64位整数) |
count | 1 |
data | 1e6(即 1ms 曝光时间) |
这种结构允许 CameraMetadata 容器快速进行 get()
、update()
等操作,在运行时支持多线程安全的读写封装。
在 Java 层对应的是 android.hardware.camera2.CameraMetadata
抽象类,进一步封装为 CameraCharacteristics
, CaptureRequest
, CaptureResult
三大子类,通过泛型 Key<T>
封装底层 tag 映射关系。
二、Tag 注册机制详解:system tag 与 vendor tag 的构建路径
CameraMetadata 中的每一个 tag 都必须提前在系统初始化时注册完毕,整个 tag 管理机制分为两类:
-
System Tag(系统定义字段)
来源于 AOSP 的标准定义,由 Google 在system/media/camera/src/camera_metadata_tag_info.cpp
中定义。这些字段在系统编译期通过如下自动构建路径生成:
hardware/libhardware/include/system/camera_metadata_tags.h → 构建工具通过 metadata_generator.py 生成 cpp 实现文件 → 编译进 libcamera_metadata 静态库
例如:
#define ANDROID_SENSOR_EXPOSURE_TIME 0x10010000
每个 tag 都被赋予唯一的 32-bit 值,前 16bit 表示 section(如 ANDROID_SENSOR),后 16bit 表示该 section 下的字段序号。
-
Vendor Tag(厂商自定义字段)
为了支持厂商扩