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 距离测量误差、帧率稳定性、多路径干扰
CTS测试提示: 对于多Camera设备,CTS要求每个物理Camera ID必须独立上报其能力(通过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在并发流下的内存管理、带宽分配和帧率稳定性。

关键验证点: 在CTS MultiCameraTest 用例中,测试程序会同时打开多个Camera ID,并请求SurfaceView和ImageReader流。HAL必须支持至少2个Camera同时输出YUV_420_888格式的流,且帧率不低于15fps。

3.3 多Camera协同架构SVG图

下图展示了多Camera协同工作的软件架构,包括应用层、框架层、HAL层和硬件层的交互关系。

多Camera协同工作架构图 多Camera协同工作软件架构 应用层(Application Layer) Camera2 API / CameraX API / 第三方应用 多Camera会话创建、流配置、捕获请求 框架层(Framework Layer) CameraService / CameraProvider / CameraDevice 逻辑Camera管理、物理Camera路由、流合并 CTS测试接口:CameraManager.getCameraIdList() HAL层(Hardware Abstraction Layer) Camera HAL 3.x / Camera HAL 4.x 多Camera同步、帧时间戳对齐、深度数据生成 CTS测试接口:processCaptureRequest() / flush() 硬件层(Hardware Layer) 广角Sensor / 长焦Sensor / 深度Sensor / ToF Sensor MIPI CSI接口、ISP图像信号处理 CTS测试覆盖点 多Camera ID枚举 并发流压力测试

3.4 多Camera场景定义清单

在CTS测试中,需要针对以下典型场景编写测试用例。每个场景都对应一组特定的HAL行为验证。

  1. 双摄同步预览场景: 同时打开广角和长焦Camera,输出预览流(1080p@30fps),验证帧同步误差 < 1ms。
  2. 变焦切换场景: 从广角1x变焦切换到长焦3x,验证切换过程中无黑帧、无卡顿,AE/AWB平滑过渡。
  3. 深度图生成场景: 主摄+深度Camera同时捕获,输出深度图(Depth16格式),验证深度精度误差 < 5%。
  4. ToF测距场景: 单帧ToF捕获,输出距离值,验证在0.3m-5m范围内误差 < 2cm。
  5. 多流并发场景: 同时打开3个Camera,每个Camera输出2个流(预览+拍照),验证总帧率不低于45fps。
  6. 逻辑Camera场景: 使用逻辑Camera ID,验证其能正确聚合广角和长焦的物理Camera能力。
常见HAL稳定性问题: 在多Camera场景下,HAL容易出现以下问题:
(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);
CTS测试建议: 在多Camera测试中,务必验证HAL对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在不同协同模式下的稳定性和兼容性。