最近忙于开发一款基于 Camera2 API 的相机利用,局部性能波及到广角镜头,因而踩了不少坑,在此与大家分享下以作记录交换 …
通过查阅材料发现在安卓上所谓的广角镜头切换其实是用一个逻辑摄像头蕴含多个物理摄像头实现的,在 zoom 缩放的时候依据不同的缩放值切换不同的物理摄像头。
参考:https://source.android.google.cn/devices/camera/multi-camera?hl=zh-cn
踩坑记录
- CameraDevice.TEMPLATE_RECORD 的兼容性问题
个别在录制视频的时候为了取得比较稳定的帧率,咱们可能会应用 CameraDevice.TEMPLATE_RECORD 创立 CaptureRequest.Builder,然而 CameraDevice.TEMPLATE_RECORD 在某些镜头上
却是不可用的,个别体现就是黑屏,查找定位发现是相机没有数据流输入。
解决方案就是查看 API 文档正文,发现 CameraDevice.TEMPLATE_RECORD 是有肯定的限度的,咱们依据文档形容做相应的检测,如果检测到 CameraDevice.TEMPLATE_RECORD 不可用时回退到 TEMPLATE_PREVIEW 即可,
以下是文档正文内容:
Create a request suitable for video recording. Specifically, this means that a stable frame rate is used,
and post-processing is set for recording quality.
These requests would commonly be used with the CameraCaptureSession.setRepeatingRequest method.
This template is guaranteed to be supported on all camera devices except DEPTH_OUTPUT devices that are not BACKWARD_COMPATIBLE.
See Also:
createCaptureRequest
- 有些镜头明明在
CameraManager.getCameraIdList
中返回了,然而却无奈关上
起初发现这些不能关上的摄像头 StreamConfigurationMap 的 getOutputSizes 返回空,也就是说没有可反对的输入图像尺寸,因而咱们在过滤摄像头时也须要验证 StreamConfigurationMap 是否有反对的尺寸输入。
// 摄像头是否可用
private boolean isEnableCamera(CameraCharacteristics cameraCharacteristics) {StreamConfigurationMap configs = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] sizes = configs.getOutputSizes(ImageFormat.JPEG);
return null != sizes && sizes.length > 0;
}
- 有些镜头有色调偏差
在对逻辑镜头进行测试时发现,从一个物理摄像头切换到另外一个物理摄像头,图像有显著的色调偏差,例如上面的两幅比照图:
很显著前面的图像色调显著不对,对于这个问题,只有在预览时将 CaptureRequest.CONTROL_CAPTURE_INTENT
设置成 CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT
即可。
- 单色镜头
android 中有一种单色摄像头,这种摄像头的预览图像是灰度图,预览图如下图所示:
这种摄像头次要用于辅助拍摄,因而咱们在筛选摄像头时也须要过滤掉这种摄像头,具体的过滤办法能够参考官网文档:
单色摄像头:https://source.android.google.cn/devices/camera/monochrome?hl=zh-cn
这次就和大家分享笔者踩过的这几个坑,当遇到这些问题时笔者也是花了不少工夫精力去定位问题,这里分享进去心愿大家在卷的路上能少走弯路 …
举荐浏览
《对于 Camera 利用开发进阶的干货》
关注我,一起提高,人生不止 coding!!!