android6.0源码分析之Camera API2.0简介

前面几篇主要分析的是android Camera API1.0的架构以及初始化流程,而google在android5.0(Lollipop)开始对Camera的架构进行了调整,为了适应HAL3,新添加实现了CameraDeviceClient,而Camera API1.0已经被deprecated(即可能在更新的版本里会不支持此API).

接下来,我将会分如下几篇文章来分析Camera2 
android6.0源码分析之Camera API2.0简介 
android6.0源码分析之Camera2 HAL分析 
android6.0源码分析之Camera API2.0下的初始化流程分析 
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析 
android6.0源码分析之Camera API2.0下的Capture流程分析 
android6.0源码分析之Camera API2.0下的video流程分析 
Camera API2.0的应用

1、Camera API2.0的架构图
Camera API2.0下的Camera架构与API1.0有所区别,下面将给出Camera API2.0以及Camera HAL3.2+下的Camera的总体架构图: 
 
由图可知,Java层要想与C++层的CameraService层进行通信,都是通过Java层的IPC Binder进制进行的,主要包括ICameraService.aidl以及ICameraDeviceUser.aidl两个接口来实现,其会在Java层维护一个CameraDeviceImpl即Camera设备的代理,而CameraService以及CameraDeviceImpl的初始化会在此文的第二,第三节进行分析。而Java层对Camera的具体操作的操作流程大致为,Java层通过Device代理发送一个CaptureRequest,而C++层进行相应的处理,再调用相应的回调来通知Java相应的处理结果,并将相应的Capture数据保存在Surface Buffer里,这样Java层在回调函数中可以对数据进行相应的处理。而对于具体操作流程的分析,请参考文章开始时的Camera2相关文章的连接。

2、Java层的CameraService的实现和应用
从Camera API2开始,Camera的实现方式有所不同,最主要的区别是不再使用JNI来调用本地代码,从而获得本地CameraService,并实现其C/S模式的通信,而是直接在Java层通过Java层的IPC Binder机制来获取Java层的CameraService的代理对象,从而直接在Java层获取本地的CameraService与Camera Device进行相应的通信。 
相应的代码及目录: 
ICameraService.aidl:frameworks/base/core/java/android/hardware 
CameraService.cpp:frameworks/av/services/camera/libcameraservice 
CameraManager.java:frameworks/base/core/java/android/hardware/camera2

获取CameraService的核心代码如下:

//CameraManager.java
prvate void connectCameraServiceLocked(){
    if(mCameraService != null)return;
    //获取Binder
    IBinder cameraServiceBinder = ServiceManager.getService(CAMERA_SERVICE_BINDER_NAME);
    if(cameraServiceBinder == null){
        return;
    }
    try{
        cameraServiceBinder.linkToDeath(this,/*flags*/ 0);
    }catch(RemoteException e){
        return;
    }
    ICameraService cameraServiceRaw = ICameraService.Stub.asInterface(cameraServiceBinder);
    //根据cameraServiceRaw 创建CameraService实例
    ICameraService cameraService = CameraServiceDecorator.newInstance(cameraServiceRaw);
    ...
    try{
        //添加监听
        cameraService.addListener(this);
        //赋值给mCameraService的全局变量
        mCameraService = cameraService;
    }catch(CameraRuntimeException e){
        ...
    }
}

由代码可知,通过Java层的Binder从ServiceManager里获取了一个Java层的CameraService实例,在打开Camera的流程中,会通过此CameraService(Native的CameraService)与Camera通信,而其中的通信通过ICameraDeviceUser来实现,接下来分析ICameraDeviceUser的实现。

3、ICameraDeviceUser.aidl的通信实现
Java层与C++ CameraService层之间的通信,通过封装了一个CameraDeviceUser来实现,它只是在Java层使用了AIDL技术来实现Client,即在Java层维护了一个CameraDevice,这样的好处是响应速度更快,因为这样不需要通过每次进入Native层来完成通信,而可以通过Java层的IPC Binder机制即可完成。即API2.0通过AIDL实现一个接口ICameraDeviceUser,从而在Java层维护一个Camera proxy,之后的通信都是通过此代理CameraDeviceImpl来实现。

相关代码及目录: 
ICameraDeviceUser.aidl:frameworks/base/core/java/android/hardware/camera2 
ICameraDeviceUser.cpp:frameworks/av/camera/camera2 
CameraDeviceImpl.java:frameworks/base/core/java/android/hardware/camera2/impl

获取Camera Device的Java层代理的核心代码如下:

//CameraManager.java
private CameraDevice openCameraDeviceUserAsync(...){
    //初始化Camera Java层代理对象
    CameraDevice device = null;
    try{
        synchronized(mLock){
            //初始化ICameraDeviceUser
            ICameraDeviceUser cameraUser = null;
            //初始化具体的CameraDevice代理
            android.hardware.camera2.impl.CameraDeviceImpl deviceImpl = new android.hardware.
                camera2.impl.CameraDeviceImpl(cameraId,callback,handler,characteristics);
            BinderHolder holder = new BinderHolder();
            ICameraDeviceCallbacks callbacks = deviceImpl.getCallbacks();
            ...
            try{
                //如果支持HAL3.2+的devices
                if(supportsCamera2ApiLocked(cameraId)){
                    //获取CameraService
                    ICameraService cameraService = CameraManagerGlobal.get().getCameraService();
                    ...
                    //连接设备
                    cameraService.connectDevice(callbacks,id,mContextgetOpPackageName()
                        ,USE_CALLING_UID,holder);
                    //通过Binder获得打开的Camera设备返回的Camera代理
                    cameraUser = ICameraDeviceUser.Stub.asInterface(holder.getBinder());
                }else{//否则用遗产API
                    cameraUser = CameraDeviceUserShim.connectBinderShim(callbacks,id);
                }
            }catch(...){
                ...
            }
            //包装代理对象
            deviceImpl.setRemoteDevice(cameraUser);
            device = deviceImpl;
        }
    }catch(...){
        ...
    }
    返回Camera代理
    return device;
}

由代码可知,首先获取CameraService,然后通过它来开启Camera,而开启成功后,C++层会返回一个Camera device代理对象,此处即为ICameraDeviceUser,所以在Java层对其进行相应的封装,变成一个CameraDeviceImpl对象,此后,只要需要对Camera进行操作,都会调用CameraDeviceImpl对象的相关方法,并通过ICameraDeviceUser以及Java IPC Binder来与本地的Camera device进行通信,至此,Camera API2.0的框架就分析结束了,具体的操作,如Camera的初始化,preview,capture等流程的分析,请看文章开始时,所列出的分析链接
--------------------- 
 

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值