3、多Camera场景定义:多Camera类型与协同工作模式
在Android CTS(Compatibility Test Suite)测试中,多Camera场景的覆盖是验证HAL(Hardware Abstraction Layer)稳定性的核心环节。随着智能手机多摄系统的普及,设备通常集成广角、长焦、深度、ToF等多种类型的Camera传感器。本章将系统定义多Camera类型及其协同工作模式,为后续CTS测试用例设计奠定基础。
3.1 多Camera类型分类与特性
根据物理特性和功能定位,多Camera系统可分为以下四种主要类型。每种类型在CTS测试中具有不同的关注点。
| Camera类型 | 典型焦距/视场角 | 主要用途 | CTS测试关键指标 |
|---|---|---|---|
| 广角(Wide) | 24-28mm等效焦距 / 视场角约75-85° | 日常拍照、视频录制、全景 | 畸变校正、边缘清晰度、曝光一致性 |
| 长焦(Telephoto) | 50-125mm等效焦距 / 视场角约15-45° | 远摄、人像模式、光学变焦 | 对焦精度、防抖性能、变焦平滑度 |
| 深度(Depth) | 固定焦距 / 视场角与主摄对齐 | 背景虚化、AR测距、人脸解锁 | 深度图精度、边缘分割质量 |
| ToF(Time-of-Flight) | 固定焦距 / 视场角约60-70° | 3D扫描、手势识别、SLAM | 距离测量误差、帧率稳定性、多路径干扰 |
CameraCharacteristics),且逻辑Camera(Logical Camera)必须正确聚合多个物理Camera的流配置。测试时需验证REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA是否被正确声明。
3.2 多Camera协同工作模式
多Camera协同工作模式定义了不同传感器之间如何配合完成特定功能。以下是Android系统中常见的四种协同模式,每种模式对应不同的HAL实现和CTS测试策略。
3.2.1 同步捕获模式(Synchronous Capture)
多个Camera在同一时间点触发捕获,用于生成融合图像或深度图。HAL必须保证所有Camera的帧同步信号对齐,时间戳偏差需控制在1ms以内。
3.2.2 变焦切换模式(Zoom Switching)
在广角和长焦之间平滑切换,实现光学变焦。CTS测试需验证切换过程中无黑帧、无卡顿,且AE/AWB参数平滑过渡。
3.2.3 深度辅助模式(Depth-Assisted)
主摄与深度/ToF Camera协同,生成带深度信息的图像。HAL需正确输出深度元数据(DepthPoints或DepthMap),并保证与RGB图像的空间对齐。
3.2.4 多流并发模式(Multi-Stream Concurrent)
多个Camera同时输出不同分辨率的流(如预览流、拍照流、视频流)。CTS测试需验证HAL在并发流下的内存管理、带宽分配和帧率稳定性。
MultiCameraTest 用例中,测试程序会同时打开多个Camera ID,并请求SurfaceView和ImageReader流。HAL必须支持至少2个Camera同时输出YUV_420_888格式的流,且帧率不低于15fps。
3.3 多Camera协同架构SVG图
下图展示了多Camera协同工作的软件架构,包括应用层、框架层、HAL层和硬件层的交互关系。
3.4 多Camera场景定义清单
在CTS测试中,需要针对以下典型场景编写测试用例。每个场景都对应一组特定的HAL行为验证。
- 双摄同步预览场景: 同时打开广角和长焦Camera,输出预览流(1080p@30fps),验证帧同步误差 < 1ms。
- 变焦切换场景: 从广角1x变焦切换到长焦3x,验证切换过程中无黑帧、无卡顿,AE/AWB平滑过渡。
- 深度图生成场景: 主摄+深度Camera同时捕获,输出深度图(Depth16格式),验证深度精度误差 < 5%。
- ToF测距场景: 单帧ToF捕获,输出距离值,验证在0.3m-5m范围内误差 < 2cm。
- 多流并发场景: 同时打开3个Camera,每个Camera输出2个流(预览+拍照),验证总帧率不低于45fps。
- 逻辑Camera场景: 使用逻辑Camera ID,验证其能正确聚合广角和长焦的物理Camera能力。
(1) 帧时间戳不同步导致深度图错位;
(2) 变焦切换时AE/AWB参数突变导致画面闪烁;
(3) 并发流时内存泄漏导致OOM;
(4) 逻辑Camera的
CameraCharacteristics未正确聚合物理Camera能力。CTS测试应重点覆盖这些边界条件。
3.5 多Camera协同工作模式对比表
下表总结了四种协同工作模式的关键差异,帮助测试人员快速定位测试重点。
| 协同模式 | 参与Camera数 | 同步要求 | 典型CTS测试用例 | HAL稳定性风险 |
|---|---|---|---|---|
| 同步捕获 | 2-4 | 高(时间戳对齐) | testSynchronousCapture |
帧偏移、数据错乱 |
| 变焦切换 | 2 | 中(平滑过渡) | testZoomSwitch |
黑帧、AE/AWB跳变 |
| 深度辅助 | 2 | 高(空间对齐) | testDepthMapAccuracy |
深度图空洞、边缘锯齿 |
| 多流并发 | 2-3 | 低(独立流) | testConcurrentStreams |
带宽不足、帧率下降 |
3.6 CTS测试中的多Camera配置示例
以下代码片段展示了如何在CTS测试中配置多Camera会话,并验证HAL的响应。
// 多Camera会话配置示例(Java)
CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = manager.getCameraIdList();
// 选择广角和长焦Camera
String wideId = findCameraByFocalLength(cameraIds, 26.0f); // 26mm等效焦距
String teleId = findCameraByFocalLength(cameraIds, 52.0f); // 52mm等效焦距
// 创建输出目标
Surface widePreviewSurface = createSurface(1920, 1080, ImageFormat.YUV_420_888);
Surface telePreviewSurface = createSurface(1920, 1080, ImageFormat.YUV_420_888);
// 配置并发会话
CameraDevice wideDevice = openCamera(wideId);
CameraDevice teleDevice = openCamera(teleId);
// 创建捕获请求
CaptureRequest.Builder wideBuilder = wideDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
wideBuilder.addTarget(widePreviewSurface);
CaptureRequest.Builder teleBuilder = teleDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
teleBuilder.addTarget(telePreviewSurface);
// 提交请求(HAL需同时处理两个Camera的流)
wideDevice.createCaptureSession(Arrays.asList(widePreviewSurface),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
session.setRepeatingRequest(wideBuilder.build(), null, null);
}
}, null);
teleDevice.createCaptureSession(Arrays.asList(telePreviewSurface),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
session.setRepeatingRequest(teleBuilder.build(), null, null);
}
}, null);
CameraCharacteristics.SENSOR_INFO_TIMESTAMP_SOURCE的返回值。如果两个Camera的时间戳源不同(例如一个来自硬件帧同步,另一个来自软件),则同步捕获的精度可能不满足CTS要求(误差 < 1ms)。建议在测试前通过getCameraCharacteristics()检查该字段。
3.7 多Camera场景的HAL稳定性验证策略
针对多Camera场景,HAL稳定性验证应覆盖以下维度:
- 压力测试: 连续1000次打开/关闭多Camera会话,验证无内存泄漏、无Crash。
- 并发流测试: 同时请求4个不同分辨率的流(如4K、1080p、720p、VGA),验证HAL的带宽分配和帧率稳定性。
- 异常恢复测试: 在捕获过程中模拟Camera断开(如拔掉外接Camera),验证HAL能正确回调
onError()并释放资源。 - 时间戳一致性测试: 验证多Camera捕获的帧时间戳差值在允许范围内(通常 < 1ms)。
- 逻辑Camera能力聚合测试: 验证逻辑Camera的
CameraCharacteristics正确包含所有物理Camera的能力,且REQUEST_AVAILABLE_CAPABILITIES包含LOGICAL_MULTI_CAMERA。
通过上述定义和验证策略,CTS测试能够全面覆盖多Camera场景,确保HAL在不同协同模式下的稳定性和兼容性。