基于Camera2 API的Surface多分辨率视频捕获场景问题咨询
相机视频流输出至指定Surface的场景处理与CaptureRequest配置
三类通用场景处理逻辑
- 分辨率在输出列表但与传感器宽高比不匹配:直接请求该分辨率的Surface,相机框架会自动完成裁剪或拉伸适配
- 分辨率与传感器宽高比匹配但不在输出列表:优先选择输出列表中最接近且不小于目标分辨率的同比例规格,通过Surface的缩放逻辑适配到目标尺寸;也可结合
SCALER_CROP_REGION裁剪传感器画面后输出 - 既不匹配宽高比也不在输出列表:先按宽高比匹配逻辑选择相近的输出规格,再通过裁剪+Surface缩放完成最终适配
基于4:3传感器的具体问题解答
假设传感器Raw/Active宽高比为4:3,针对以下场景处理:
- 输出列表包含1920x1080(16:9):直接创建1920x1080的Surface并传入相机会话即可。相机框架会自动从4:3的传感器画面中裁剪出16:9的区域,输出到该Surface,无需手动配置裁剪参数
- 输出列表不含1920x1440(4:3):从输出列表中挑选分辨率不低于1920x1440的4:3规格(例如2048x1536),创建1920x1440的Surface传入相机会话。相机框架会自动将传感器画面缩放到Surface尺寸;若需精准控制,可设置
SCALER_CROP_REGION为Active Sensor原生尺寸内的1920x1440区域(保持4:3比例),再输出到目标Surface - 输出列表不含1440x900(16:9):先选择输出列表中最接近且不小于1440x900的16:9规格(例如1920x1080),创建1440x900的Surface传入。相机框架会先裁剪传感器画面到16:9比例,再缩放到目标尺寸输出;也可手动设置
SCALER_CROP_REGION为传感器画面中符合16:9比例的区域,再由Surface完成最终尺寸适配
CaptureRequest构造与参数配置
- 构造方式:通过
CameraDevice.createCaptureRequest(int templateType)创建,常用模板包括TEMPLATE_PREVIEW(预览场景)、TEMPLATE_RECORD(录像场景)。框架会自动填充大部分默认参数,无需手动设置 - 必填参数:仅
CaptureRequest.SURFACE为必填项,需将目标Surface添加到请求的输出集合中;其他参数(如对焦、曝光模式等)按需配置,非强制要求 SCALER_CROP_REGION配置规则:- 该参数是一个
Rect对象,坐标空间基于Active Sensor的有效像素尺寸(而非Raw Sensor的全尺寸) - Rect的宽高比必须与目标Surface的宽高比一致,否则相机框架会抛出参数错误
- Rect的尺寸不能超过Active Sensor的原生有效尺寸
- 若不手动设置,相机框架会自动计算适配Surface宽高比的裁剪区域
- 该参数是一个
- 裁剪区域与传感器的关系:裁剪区域仅关联Active Sensor的有效输出区域,和Raw Sensor的全尺寸无关。Raw Sensor的全尺寸包含Active Sensor之外的冗余像素(如用于光学防抖的像素),但相机输出的画面基于Active Sensor的有效区域,因此裁剪范围只能限定在Active Sensor的尺寸内
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

