文章目录
前言
自己在开发MTK相机、RK 相机 Camera2 预览旋转方向、拍照、录像成像旋转问题,简单整理总结,后续相关开发可直接参考
一、思考问题
自己在开发公司MTK平台上Camera2相机过程中,遇到一些问题,对于开发过相机的朋友应该也会遇到各种各种问题,特别是Android系统定制,各种情况很复杂;涉及到不同的平台,核心思想一样,但是实际应用架构,业务就完全不一样了。 下面先抛出几个问题:
- 相机开发中遇到预览、成像[拍照照片、录像视频] 方向不对、拉伸压缩 怎么办
- 相机分为几个层 驱动、系统、应用层,相机的流程成像原理怎样的
- 从常识上看,我们的手机相机拍照、录像都是横竖屏的,人永远是正的,为什么呢?
- 上面用到了Gsensor 来判断方向,虽然有了Gsonsor 方向+屏幕物理方向,但是系统用到了强制横竖屏,屏幕物理方向是错乱的
- 屏幕方向问题[存在横屏+竖屏各两个方向],不清楚客户实际机器是横屏、竖屏、横竖屏;
- 装配方向,实际的装配方向不确定,摄像头本身是有一个方向的,如果摄像头方向不是按照正常装配的,那么肯定预览和成像方向不对
- 每个平台相机源码不一致,在更改系统源码的过程中,源码不一致,那么相机Camera2 开发流程、预览、成像原理、人脸检测、特效、架构
又是怎样的? 方便修改问题
二、基础补充、资源参考
相机整个模块确实太专业、复杂了。 无论从硬件外设、驱动【USBCamera免驱】、相机 都比较专业、覆盖面及广,针对思考中的问题 给出自己认为比较好相关博客,方便了解,助于梳理流程、提升认知。
对于上层应用或者Framework 系统应用开发者,只需要了解基本的架构、API、使用方法,当然这些也不简单的
下面提供部分资源,方便快速了解,充电:
架构图了解
MTKCamera2相机架构
Camera2架构
Android Camera架构简析
Camera相关专栏
Camera Framework 专栏
小驰私房菜系列
小驰私房菜MTK系列
小驰Camera 开发系列
Camera 相机开发
展讯平台 Camera
官方文档:谷歌官方 API 描述
零散知识了解
MTK 相机UI介绍
Camera2 相机认知
Camera2学习笔记
camera2关于拍照预览方向旋转90度和拍照图片镜像功能实现
Camera2 预览集成、简单拍照:熟悉预览步骤流程比较有用
Camera镜像上下左右颠倒问题的解决办法
MTK相机成像质量差
Camera应用分析
部分相机源码参考,学习API使用,梳理流程,偏应用层
极客相机 Camera2 API
Camera2 API详解
极客相机源码
Camera2 相机Demo
Camera2 专业相机Demo
拍照、预览、录像Demo
使用Camera2 拍照
Camera2 系统相关
如上资源可能不能解决项目中的实际问题,每个ODM厂家平台的源码不一样,修改问题地方不一样,包名、类 都不一样,但思路、思想一样。当然具体问题具体分析,针对性充电对自己解决问题还是有很大帮助的。
三、核心问题:预览方向不对【图片、视频】、成像存储不对、拉伸问题
当前只给出MTK平台相关解决思路,和代码片段
预览
根据gsensor 方向,适配需要旋转的方向,来解决视频、图片预览方向问题
vendor\mediatek\proprietary\packages\apps\Camera2\host\src\com\mediatek\camera\ui\preview\TextureViewController.java
updatePreviewSize 方法中 最终通过gsenmsor 方向来
考虑旋转方向:
Log.d(MYTAG,"6666666666 setAspectRatio mPreviewAspectRatio :"+mPreviewAspectRatio +" mTextureView:"+mTextureView);
int gSensorOrientation= mApp.getGSensorOrientation();
int rotationNum= 360-gSensorOrientation;
mTextureView.setRotation(rotationNum);
Log.d(MYTAG,"6666666666 genju sensor fangxiang xuanzhuan gSensorOrientation:"+gSensorOrientation+" rotate dushu:"+rotationNum);
Log.d(MYTAG,"6666666666 rotation 90");
mTextureView.setAspectRatio(mPreviewAspectRatio);
视频保存
遇到视频保存,方向不对问题
视频保存倒置问题,竖屏录像保存的视频会倒置180度。 修改文件:vendor/mediatek/proprietary/packages/apps/Camera2/common/src/com/mediatek/camera/common/mode/video/VideoHelper.java
configRecorderSpec 方法中,recorderSpec.orientationHint 值 根据gsensor 方向,动态适配两种不同的竖屏方向的视频保存方向
public IRecorder.RecorderSpec configRecorderSpec(CamcorderProfile profile, String cameraId,
CameraDeviceManagerFactory.CameraApi api