最近忙于开发一款基于Camera2 API的相机应用,部分功能涉及到广角镜头,因此踩了不少坑,在此与大家分享下以作记录交流...

经过查阅资料发现在安卓上所谓的广角镜头切换其实是用一个逻辑摄像头包含多个物理摄像头实现的,在zoom缩放的时候根据不同的缩放值切换不同的物理摄像头。

参考:https://source.android.google.cn/devices/camera/multi-camera?hl=zh-cn

踩坑记录

  1. 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
  1. 有些镜头明明在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;
}
  1. 有些镜头有色彩偏差

    在对逻辑镜头进行测试时发现,从一个物理摄像头切换到另外一个物理摄像头,图像有明显的色彩偏差,例如下面的两幅对比图:

很明显后面的图像色彩明显不对,对于这个问题,只要在预览时将CaptureRequest.CONTROL_CAPTURE_INTENT设置成CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT即可。

  1. 单色镜头

android中有一种单色摄像头,这种摄像头的预览图像是灰度图,预览图如下图所示:

这种摄像头主要用于辅助拍摄,因此我们在筛选摄像头时也需要过滤掉这种摄像头,具体的过滤方法可以参考官方文档:

单色摄像头:https://source.android.google.cn/devices/camera/monochrome?hl=zh-cn

这次就和大家分享笔者踩过的这几个坑,当遇到这些问题时笔者也是花了不少时间精力去定位问题,这里分享出来希望大家在卷的路上能少走弯路...

推荐阅读

《关于Camera应用开发进阶的干货》

关注我,一起进步,人生不止coding!!!

最新文章

  1. .NET (三)委托第三讲:内置委托Action
  2. iOS coreData问题
  3. 20135220谈愈敏Linux_总结
  4. Windows phone 8 学习笔记(2) 数据文件操作(转)
  5. 前端构建工具gulp入门教程
  6. frame模型
  7. lightoj 1004 dp:数字三角形
  8. logback logback.xml 常用配置详解
  9. 百度分享share.js插件
  10. JS拖动浮动DIV
  11. 关于laravel 用paginate()取值取不到的问题
  12. python匿名函数
  13. 《DSP using MATLAB》Problem 7.25
  14. laravel5.5通过Migrations修改表 的artisan命令
  15. powershell获取windows子文件夹的大小
  16. Python3数字(Number)
  17. Redis 主从+哨兵+监控 (centos7.2 + redis 3.2.9 )
  18. Knockout学习之监控属性
  19. Android 日历控件PickTime
  20. Intel RDT

热门文章

  1. Redis 18 Jedis
  2. [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖
  3. Spring 08: AOP面向切面编程 + 手写AOP框架
  4. 【MySQL】从入门到精通8-SQL数据库编程
  5. JDBC连接池&JDBCTemplate
  6. 06_Linux基础-NGINX和浏览器、网页的关系-云服务器ssh登陆-安装NGINX-上传网页-压缩命令-xz-gzip-bzip2-zip-tar-配置NGINX服务器支持下载功能-备份脚本
  7. 1.关于433MHz按键单片机解码
  8. Java SE 四大内部类
  9. 常用的清理 Kubernetes 集群资源命令
  10. 使用 Auditbeat 模块监控 shell 命令