分享几个关于Camera的坑

简介: 安卓Camera应用开发填坑

最近忙于开发一款基于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应用级开发的话,下面这资料绝对适合你

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

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

目录
相关文章
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 设置和配置PPP pppsetup命令 使用教程
【Shell 命令集合 网络通讯 】Linux 设置和配置PPP pppsetup命令 使用教程
372 0
|
消息中间件 分布式计算 DataWorks
DataWorks常见问题之kafka数据导入datahub失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
8月前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
242 7
|
5月前
|
开发工具 C++ git
五分钟看懂推送本地项目到 GitHub新手菜鸡
五分钟看懂推送本地项目到 GitHub新手菜鸡
|
9月前
|
Ubuntu Linux 虚拟化
CentOS7扩容踩坑记录(最后只有ubuntu成功)
这篇博客记录了一次尝试给CentOS根分区扩容的过程。作者在VMware中扩展了虚拟磁盘,但最终未能成功将新分区合并到现有卷组中,因为原有分区未创建物理卷(PV)和卷组(VG)。过程中遇到了多个问题,如分区文件正在使用中等。最终作者提醒读者在操作前务必先检查当前的分区和卷组状态。
182 4
CentOS7扩容踩坑记录(最后只有ubuntu成功)
|
负载均衡 监控 网络协议
深入理解并实现负载均衡技术
【5月更文挑战第23天】本文探讨了负载均衡技术,旨在应对互联网高并发需求。负载均衡通过分散请求至多台服务器,提升系统性能和可靠性。核心是负载均衡器,其工作流程包括接收请求、解析、选择服务器、转发及返回响应。负载均衡技术分类包括反向代理(如Nginx、HAProxy)、DNS、IP(如LVS)和应用层负载均衡。实现时,以Nginx为例,需安装、配置反向代理、分发策略并启动服务。监控和优化是持续过程。负载均衡技术将持续发展,适应云计算和大数据时代。
|
12月前
|
存储 缓存 NoSQL
Redis过期Key的清理机制
Redis过期Key的清理机制
250 1
|
前端开发 JavaScript 数据可视化
2022年中高级前端需要学习的25种前端技术栈
2022年中高级前端需要学习的25种前端技术栈
296 0
2022年中高级前端需要学习的25种前端技术栈
|
Linux
Linux常见头文件详解与使用1
Linux常见头文件详解与使用
141 0
|
关系型数据库 MySQL 数据安全/隐私保护
Windows环境下安装及配置MySQL
本文主要讲解在Windows环境下MySQL的安装、配置
8773 1
Windows环境下安装及配置MySQL