android平台多路摄像头实现方式的简析
采用Camera API2 HAL3架构,android P和Q的初始化预览流程无异。
流程大概为CameraManager.openCamera打开摄像头设备回调onOpened方法得到CameraDevice,通过CameraDevice创建CaptureRequest预览请求,设置Surface容器同时创建CameraCaptureSession会话,从而实现视频预览。
多路摄像头应用MIPI CSI2架构,通过MIPI CSI2接口结合N4芯片达到多路视频显示的目的。
实现多路摄像头需要对Camera框架进行了适配,通过MIPI虚拟通道,每个通道对应一个虚拟cameraID,从cameraID-8开始+1,前后左右分别对应8,9,10,11分别对应虚拟通道1,2,3,4,cameraID-12则为打开四路通道的对应Id(后续看需求,可用于四路视频的录制)。camlitehal层处理camera相关的驱动操作,camera配置文件在device/…/camera_config.xml(区别于device/…/manifest.xml),并不是安装传统的打开设备节点legecy/0,legecy/1的方式打开)
最终会调用到mtkcam的hal层和驱动层来操控摄像头sensor和isp。
N4摄像头sensor处理源码路径:
n4_yuv kernel-4.9/drivers/misc/mediatek/imgsensor/src/common/v1
mtkcam部分目录为vendor/mediatek/proprietary/hardware/mtkcam/,按照mtkcam进行扩展实现对camera多路以及单路摄像头的预览。
客户端预览多路摄像头流程
可开启线程池,打开不同cameraId的摄像头,多任务实现多摄像头的同时预览。
public static final String FRONT_CAMERA_ID = "8";public static final String BACK_CAMERA_ID = "9";public static final String LEFT_CAMERA_ID = "10";public static final String RIGHT_CAMERA_ID = "11";/** 打开摄像头 openCamera**/CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);manager.openCamera(mCameraId, mDeviceStateCallback, mBgHandler);private final CameraDevice.StateCallback mDeviceStateCallback = new CameraDevice.StateCallback() {@Overridepublic void onOpened(CameraDevice cameraDevice) {mCameraDevice = cameraDevice;startPreview();}@Overridepublic void onDisconnected(CameraDevice cameraDevice) {cameraDevice.close();}@Overridepublic void onError(CameraDevice cameraDevice, int error) {cameraDevice.close();}};
/** startPreview 视频预览**/mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);Surface surface = mSurfaceView.getHolder().getSurface();mPreviewBuilder.addTarget(surface);mCameraDevice.createCaptureSession(Collections.singletonList(surface), mSessionStateCallback, null);
private CameraCaptureSession.StateCallback mSessionStateCallback = new CameraCaptureSession.StateCallback() {@Overridepublic void onConfigured(CameraCaptureSession cameraCaptureSession) {mPreviewSession = cameraCaptureSession;updatePreview();}@Overridepublic void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {cameraCaptureSession.close();mPreviewSession = null;}}
/** updatePreview **/mPreviewRequest = mPreviewBuilder.build();mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO); mPreviewSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback, mBgHandler);private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {@Overridepublic void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {//result为预览视频的结果,以此获取摄像头预览画面信息}};
openSession流程(MTK)
CameraDeviceClient frameworks/av/services/camera/libcameraservice/common
Camera3Device frameworks/av/services/camera/libcameraservice/device3
CameraProviderManager openSession frameworks\av\services\camera\libcameraservice\common
openSession
方法调用findDeviceInfoLocked
从mDevices
中获取匹配cameraId
的Device
android 从camhallite
的hal层中加载获取cameraId
,
hardware::Return CameraProviderManager::ProviderInfo::cameraDeviceStatusChange
cameraDeviceStatusChange
方法将CameraDevice
添加到mDevices
中,接着通过
deviceInfo3->mInterface->open的流程打开摄像头设备
之后在源码中CameraDevice实现类:
vendor/mediatek/proprietary/hardware/mtkcam/main/hal/device/3.x/device/CameraDevice3Impl.cpp
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/device/CameraDevice3SessionImpl.cpp
vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/devicemgr/CameraDeviceManagerBase.cpp
详细见博客介绍:Camera Hal3 Open/Close
之后根据操作打开n4则去切换mipi,打开cvbs单路摄像头则去打开/dev/video10节点。
传统方式openSession(google原生方式)
CameraDevice
源码地址:hardware\interfaces\camera\device\3.2\default\CameraDevice.cpp
CameraModule
源码地址:hardware\interfaces\camera\common\1.0\default\CameraModule.cpp
QCamera2Factory
源码地址:hardware\qcom\camera\qcamera2\QCamera2Factory.cpp
QCamera3HardwareInterface hardware\qcom\camera\qcamera2\hal3\QCamera3HWI.cpp
mm_camera_interface.c hardware\qcom\camera\qcamera2\stack\mm-camera-interface\src
mm_camera.c hardware\qcom\camera\qcamera2\stack\mm-camera-interface\src\mm_camera.c
mtkcam mtk Camera Half分析
CameraId获取流程
CameraProviderManager mInterface->getCameraIdList
ICameraProvider获取 hardware/interfaces/camera/provider/2.4/
再从hal层 camhal3lite获取
camhal3lite通过mipivcWrapper.cpp 对mipi端口进行操控vendor/mediatek/proprietary/hardware/mtkcam/drv/src/mipivc/mipivcWrapper.cpp
android平台多路摄像头实现方式的简析相关推荐
- Android平台屏幕/摄像头或外部数据采集及RTMP推送接口设计描述
好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了. 不解释,以Android平台RTMP推送模块常用接口, ...
- 展讯android智能机平台FDL1,FDL2,SPL文件下载问题简析
首先,我们要了解这样一个背景知识:展讯的每颗智能芯片(其他智能机平台应该也是如此)内部都有IROM和IRAM,IROM里有固化的Romcode(用于与PC端工具通讯,下载程序). 但是...... 但 ...
- android 代码 升级rom,ROM之家简析:Android手机系统怎么升级
Android系统现在基本上每年都会有一次大的升级,以及很多次小的升级,对于手机用户来说,当然希望自己能用上最新版本的系统.除了手机厂商也会在适当时间发布官方版本系统升级,也可以自己在网上下载安装第三 ...
- Android污点分析工具flowdroid源码简析
flowdroid是一款对Android app进行风险分析的应用,下面深入其源码对其工作的流程进行相关的探究. 1.准备 a)下载相关源码(包括soot.heros.jasmin.soot-info ...
- Android新浪微博实训报告,新浪微博产品简析
删掉了之前写的一堆废话,我还是习惯简单明快--尽管字数不多,看起来不漂亮-- 新浪微博,定位其实是一个信息流媒体平台.这一定位是从他推崇大号.名人的时候扎根的,也正是凭借对这一点的不断深化和经营,新浪 ...
- AUSBC3.0, 震撼来袭!(UVC Camera,支持开启多路摄像头)
Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头). 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能. ...
- 震撼来袭!(USB Camera,支持同时开启多路摄像头,支持旋转、镜像)
[醍醐灌顶]我研究的ANDROID UVC CAMERA 技术,太实战了,经多款不同类型设备测试,运行稳定,具备通用性. Android灵活实用的Android平台UVC摄像头实例,无需任何系统权限即 ...
- Android V1及V2签名原理简析
Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Andro ...
- GB/T28181-2016传输要求和Android平台设备接入技术实现
相关协议规范 GB/T28181-2016公共安全视频监控联网系统 信息传输.交换.控制技术要求相关的传输要求如下: 5.1 网络传输协议要求 联网系统网络层应支持IP协议,传输层应支持 TCP和 U ...
最新文章
- 网络原理题+复习资料
- python与sqlite3_sqlite3与python2.5,pysqlite和apsw有什么区别
- scikit keras_Scikit学习,TensorFlow,PyTorch,Keras…但是天秤座呢?
- 常用c语言小程序,c语言经典小程序汇总大全
- sphinx java_把 sphinx 官方提供的 java api 添加到 maven 库
- Android基础知识点的整理3
- 了解如何高速嵌入式?
- 全局唯一编码ID生成器
- 华3交换机配置命令【系统归纳】【方便好查】
- 算法在身边——学习算法从妈妈的菜谱开始
- Tyvj 1728 普通平衡树
- 如何实现web浏览器无插件播放视频监控直播?
- XGBoost中如何防止过拟合
- 人力资源社会保障部发通知了,通信工程师证书要不要考?
- 数据特征处理之数值型数据(标准化)
- linux安装ftp步骤
- 2021年您应该知道的技术之一!互联网寒冬下(1)
- 数字逻辑课程设计-数字时钟时分秒的设计
- 阿里、腾讯、百度纷纷涉猎SaaS领域寓意为何?
- Excel中文转拼音(中文首字母)