Camera2 API设置光学防抖(OIS)不生效的原因排查
三星S10基于Camera2 API无法开启光学视频防抖问题
提问内容
我使用的三星S10具备视频防抖功能,在系统自带相机应用中开启和关闭该功能存在明显差异:
- 开启时预览画面会有一定裁切变焦,设备移动时防抖效果也可清晰感知。

我尝试在自主开发的应用中基于Camera2 API开启防抖,测试场景与系统自带相机完全一致:使用后置摄像头、FullHD分辨率。
我测试发现:
- 调用
characteristics.get(CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES)仅返回CONTROL_VIDEO_STABILIZATION_MODE_OFF,说明设备不支持电子视频防抖。 - 但调用
characteristics.get(CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION)返回支持CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON,我理解这正是开启光学视频防抖的参数,效果应与系统自带相机的防抖功能一致。
但我在相机捕获会话的配置中执行如下代码后,没有任何效果:既没有系统自带相机开启防抖时的预览裁切效果,设备移动时也没有任何防抖变化,应用的视频输出效果与系统自带相机关闭防抖时完全一致。
captureRequestBuilder.set( CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE, CameraMetadata.LENS_OPTICAL_STABILIZATION_MODE_ON )
请问为什么视频防抖功能在系统自带相机应用中可正常使用,我基于Camera2 API开发的应用却无法开启生效?
解答
该问题的核心原因是三星对S10的Camera HAL做了定制化实现,未完全遵循AOSP Camera2 API的开放规范,具体分为三点:
- 系统相机的防抖是OIS+数字裁切的组合逻辑
你观察到的开启防抖后的裁切效果,并非单纯OIS的表现,而是三星把电子防抖(EIS)的裁切逻辑和OIS硬件做了绑定。但三星没有把这套组合EIS模式开放给第三方应用,因此CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES仅返回OFF,即使OIS硬件触发,也不会配套触发对应的裁切预览逻辑。 - OIS参数对第三方应用做了权限限制
三星的HAL层对LENS_OPTICAL_STABILIZATION_MODE的请求加了包名白名单校验,仅系统相机等预装系统应用传入该参数时,才会真正触发OIS硬件的物理防抖;第三方应用传入该参数时,HAL会直接忽略该设置,不会启动OIS模组。 - OIS触发和输出流参数强绑定
S10这代三星机型的OIS触发条件和录像流的帧率、Surface尺寸、甚至厂商私有扩展参数深度绑定,第三方应用如果没有完全对齐系统相机的流配置(比如必须开启特定的Raw流、匹配固定的输出帧率),即使绕过白名单校验,也无法真正触发OIS逻辑。
可行的替代方案
- 你可以通过
adb shell dumpsys media.camera命令查看对应应用打开相机时的HAL日志,确认是否有参数被拒绝的记录,验证白名单限制是否存在。 - 第三方应用如果需要实现防抖效果,目前只能通过自研软件EIS逻辑实现:调用加速度传感器、陀螺仪的运动数据,结合算法对预览/录像画面做裁切补偿,无法直接调用系统的OIS硬件。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

