Metadata实战:从配置到优化的全流程解析)
1. Android Camera Metadata基础入门第一次接触Camera Metadata时我也被那些密密麻麻的参数搞得头晕眼花。但后来发现这其实就是相机的控制面板就像开车时的方向盘和油门踏板。Metadata本质上是一组键值对key-value用来告诉相机该做什么、怎么做。举个例子当你点击手机拍照按钮时应用会通过Metadata设置曝光时间、ISO值、对焦模式等参数。这些参数会被打包成CaptureRequest发送给底层硬件。我刚开始总把Metadata想象成餐厅的点菜单——你勾选要牛排几分熟、要不要加辣参数配置厨师相机硬件就会按单烹饪。Android中的Metadata主要分为三大类Control可调节的拍摄参数就像相机的手动模式Static相机硬件固化的能力参数比如支持的最大分辨率Dynamic拍摄后生成的结果数据比如实际使用的曝光值在MTK平台上工作时我经常用这个命令导出设备Metadataadb shell dumpsys media.camera meta.info.txt导出的文件里能看到完整的参数列表对调试特别有用。记得有次客户报bug说夜景模式失效就是通过对比正常设备的Metadata找出了缺失的HDR配置项。2. Metadata配置实战从分辨率到HDR2.1 分辨率配置的坑与技巧给相机添加新分辨率就像给衣服订制纽扣——尺寸必须精确匹配。在config_static_metadata_project.h文件中常见的三种格式配置// 预览格式YUV420 CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_YCbCr_420_888, MINT64) // 拍照格式JPEG CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_BLOB, MINT64) // RAW格式专业模式 CONFIG_ENTRY_VALUE(HAL_PIXEL_FORMAT_RAW16, MINT64)这里有个血泪教训BLOB格式的分辨率必须是16的倍数否则CTS测试会直接报错。曾经因为漏看这个规则导致项目延期两天。不同比例的分辨率要成对添加比如同时配置4:3和16:9的YUVBLOB组合。帧率设置也容易踩坑// 30fps对应的duration值 CONFIG_ENTRY_VALUE(33333333, MINT64) // 单位纳秒如果这里填错可能会出现预览卡顿却查不出原因的情况。2.2 HDR功能调优心得HDR就像相机的宽容度增强器通过多帧合成扩展动态范围。但在MTK平台开启HDR需要三个条件Sensor硬件支持多曝光第三方算法库集成Metadata正确配置关键的配置项在这里// 注释掉这行会禁用HDR // CONFIG_ENTRY_VALUE(MTK_CONTROL_SCENE_MODE_HDR, MUINT8)实测中发现某些低端Sensor虽然支持HDR但效果很差这时就需要在Metadata中降级为软件HDR。有个取巧的办法——先检查设备是否支持CameraCharacteristics characteristics cameraManager.getCameraCharacteristics(cameraId); boolean isHdrSupported characteristics.get( CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES) .contains(CaptureRequest.CONTROL_SCENE_MODE_HDR);3. 闪光灯与镜头参数配置3.1 闪光灯控制避坑指南前摄没有闪光灯记得关闭这些配置// CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, MUINT8) // CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_EXTERNAL_FLASH, MUINT8) // CONFIG_ENTRY_VALUE(MTK_CONTROL_AE_MODE_ON_ALWAYS_FLASH, MUINT8)曾经遇到个奇葩bug用户反馈手机在黑暗环境发热严重。最后发现是Metadata配置了ON_ALWAYS_FLASH但硬件根本没有闪光灯导致相机不断尝试触发不存在的闪光模块。3.2 镜头参数精细调整镜头参数就像相机的视力表这个配置直接影响对焦精度// 光圈值 CONFIG_ENTRY_VALUE(2.8f, MFLOAT) // 焦距 CONFIG_ENTRY_VALUE(3.30f, MFLOAT) // 最近对焦距离5cm CONFIG_ENTRY_VALUE((1.0/0.05), MFLOAT)有个项目客户抱怨微距拍摄模糊检查发现是sensor datasheet标注的最小对焦距离是10cm但Metadata里配了5cm。修正后对焦立刻精准了。光学防抖的配置也容易出错// 没有OIS的sensor要设为OFF CONFIG_ENTRY_VALUE(MTK_LENS_OPTICAL_STABILIZATION_MODE_OFF, MUINT8)4. 高级场景模式优化4.1 自动对焦策略选择不同场景需要不同的对焦策略就像开车时市区和高速要用不同档位。这是我总结的配置经验场景模式推荐AF模式适用场景人像模式CONTINUOUS_PICTURE人物拍摄运动模式AUTO快速移动物体微距模式MACRO近距离拍摄夜景模式CONTINUOUS_PICTURE低光照环境对应的Metadata配置示例// 运动模式 CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_AUTO, MUINT8) // 微距模式 CONFIG_ENTRY_VALUE(MTK_CONTROL_AF_MODE_MACRO, MUINT8)4.2 白平衡与场景联调白平衡配置不当会导致色偏灾难。这是我调试过的典型案例// 烛光模式用白炽灯白平衡 CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_INCANDESCENT, MUINT8) // 雪景用日光白平衡 CONFIG_ENTRY_VALUE(MTK_CONTROL_AWB_MODE_DAYLIGHT, MUINT8)有个海外项目反馈雪景照片发蓝检查发现当地雪天其实是阴天多改用自动白平衡后问题解决。这说明Metadata配置要结合实际使用场景。5. 编译与调试技巧5.1 快速编译验证修改Metadata后不必全编这两个命令能节省90%时间# 编译sensor相关 ninja -f out/xxx.ninja libcam.halsensor # 编译3A相关 ninja -f out/xxx.ninja libmtkcam_metastore推送到设备时要注意权限问题adb push libmtkcam_metastore.so /vendor/lib64/ adb shell chmod 644 /vendor/lib64/libmtkcam_metastore.so5.2 调试问题定位当相机出现异常时我通常会检查三个关键点对比正常设备的Static Metadata检查Dynamic Metadata中的实际参数查看HAL层的log信息这个命令可以实时监控Metadata变化adb logcat | grep CameraMetadata曾经遇到个案例照片总是过曝。最后发现是某个Vendor Tag的值范围被错误配置为0-100而实际应该为0-10。这类问题只有通过仔细对比Metadata才能发现。