采用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方法调用findDeviceInfoLockedmDevices中获取匹配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平台多路摄像头实现方式的简析相关推荐

  1. Android平台屏幕/摄像头或外部数据采集及RTMP推送接口设计描述

    好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了. 不解释,以Android平台RTMP推送模块常用接口, ...

  2. 展讯android智能机平台FDL1,FDL2,SPL文件下载问题简析

    首先,我们要了解这样一个背景知识:展讯的每颗智能芯片(其他智能机平台应该也是如此)内部都有IROM和IRAM,IROM里有固化的Romcode(用于与PC端工具通讯,下载程序). 但是...... 但 ...

  3. android 代码 升级rom,ROM之家简析:Android手机系统怎么升级

    Android系统现在基本上每年都会有一次大的升级,以及很多次小的升级,对于手机用户来说,当然希望自己能用上最新版本的系统.除了手机厂商也会在适当时间发布官方版本系统升级,也可以自己在网上下载安装第三 ...

  4. Android污点分析工具flowdroid源码简析

    flowdroid是一款对Android app进行风险分析的应用,下面深入其源码对其工作的流程进行相关的探究. 1.准备 a)下载相关源码(包括soot.heros.jasmin.soot-info ...

  5. Android新浪微博实训报告,新浪微博产品简析

    删掉了之前写的一堆废话,我还是习惯简单明快--尽管字数不多,看起来不漂亮-- 新浪微博,定位其实是一个信息流媒体平台.这一定位是从他推崇大号.名人的时候扎根的,也正是凭借对这一点的不断深化和经营,新浪 ...

  6. AUSBC3.0, 震撼来袭!(UVC Camera,支持开启多路摄像头)

     Android灵活实用的Android平台UVC摄像头引擎,无需任何系统权限即可轻松打开您的uvc摄像头(支持多路摄像头). 您唯一应该做的就是确认您的 Android 设备必须支持 OTG 功能. ...

  7. 震撼来袭!(USB Camera,支持同时开启多路摄像头,支持旋转、镜像)

    [醍醐灌顶]我研究的ANDROID UVC CAMERA 技术,太实战了,经多款不同类型设备测试,运行稳定,具备通用性. Android灵活实用的Android平台UVC摄像头实例,无需任何系统权限即 ...

  8. Android V1及V2签名原理简析

    Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Andro ...

  9. GB/T28181-2016传输要求和Android平台设备接入技术实现

    相关协议规范 GB/T28181-2016公共安全视频监控联网系统 信息传输.交换.控制技术要求相关的传输要求如下: 5.1 网络传输协议要求 联网系统网络层应支持IP协议,传输层应支持 TCP和 U ...

最新文章

  1. 网络原理题+复习资料
  2. python与sqlite3_sqlite3与python2.5,pysqlite和apsw有什么区别
  3. scikit keras_Scikit学习,TensorFlow,PyTorch,Keras…但是天秤座呢?
  4. 常用c语言小程序,c语言经典小程序汇总大全
  5. sphinx java_把 sphinx 官方提供的 java api 添加到 maven 库
  6. Android基础知识点的整理3
  7. 了解如何高速嵌入式?
  8. 全局唯一编码ID生成器
  9. 华3交换机配置命令【系统归纳】【方便好查】
  10. 算法在身边——学习算法从妈妈的菜谱开始
  11. Tyvj 1728 普通平衡树
  12. 如何实现web浏览器无插件播放视频监控直播?
  13. XGBoost中如何防止过拟合
  14. 人力资源社会保障部发通知了,通信工程师证书要不要考?
  15. 数据特征处理之数值型数据(标准化)
  16. linux安装ftp步骤
  17. 2021年您应该知道的技术之一!互联网寒冬下(1)
  18. 数字逻辑课程设计-数字时钟时分秒的设计
  19. 阿里、腾讯、百度纷纷涉猎SaaS领域寓意为何?
  20. Excel中文转拼音(中文首字母)

热门文章

  1. C++实践 极简版本贪吃蛇小游戏
  2. keepalive (1)
  3. 嵌入式—LM3S1138介绍
  4. RFID信息系统数据安全对策分析
  5. WinSock网络编程基础(2)客户端
  6. 电脑加载,电脑加载慢又卡怎么办
  7. 如何增强云端医疗健康数据的隐私保护
  8. Kubernetes Pod Eviction 简介
  9. win 10卸载mysql_Windows 10系统下彻底删除卸载MySQL的方法教程
  10. Cve-2016-7434一把梭