Android Camera 浅析

本文详细介绍了Android Camera系统的架构,包括客户端和服务端组件、关键的JNI和HAL层交互细节,以及拍照、预览等功能的具体实现流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android的Camera包含取景器(viewfinder)和拍摄照片的功能。其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。

Camera的JAVA程序的路径:

packages/apps/Camera/src/com/android/camera/

frameworks/base/core/java/android/hardware/Camera.java

frameworks/base/core/jni/android_hardware_Camera.cpp

主要的头文件在以下的目录中:

frameworks/base/include/ui/

Camera底层库在以下的目录中:

frameworks/base/libs/ui/

Camera服务部分:

frameworks/base/camera/libcameraservice/

为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。这个库将被Camera的服务库libcameraservice.so调用。



 在Camera系统的各个库中,libui.so位于核心的位置;

    libcameraservice.so是Camera的服务器程序,它通过继承libui.so的类实现服务器的功能,并且与libui.so中的另外一部分内容则通过进程间通讯(即Binder机制)的方式进行通讯。


摄像头系统提供的功能如下几个方面:

a、预览功能preview

b、视频儿取功能 recording

c、拍照功能 takePicture

d、参数设置




通过阅读其interface函数知道,ICamera中提供的都是控制类接口,而ICameraClient定义的都是回调函数

 接口,即真正的数据流传输都是通过回调函数实现的。

拍照功能:

//* take a picture - image is returned in callback */

status_t CameraService::Client::takePicture()

{

    LOGV("takePicture (pid %d)", getCallingPid());


    Mutex::Autolock lock(mLock);
    status_t result = checkPid();
    if (result != NO_ERROR) return result;


    if (mHardware == 0) {
        LOGE("mHardware is NULL, returning.");
        return INVALID_OPERATION;
    }


    mHardware->enableMsgType(CAMERA_MSG_SHUTTER |
                             CAMERA_MSG_POSTVIEW_FRAME |
                             CAMERA_MSG_RAW_IMAGE |
                             CAMERA_MSG_COMPRESSED_IMAGE);


    return mHardware->takePicture();

}

这里用到了mHardware对象,调用所有的HAL层接口都是通过这个对象进行操作的,而这是如何生成的呢?

  mHardware = openCameraHardware(); 

   注意这个函数 openCameraHardware() , 这个函数位于硬件抽象层libcamera.so库中,函数定义如下:

  /* factory function to instantiate a camera hardware object */
extern "C" sp<CameraHardwareInterface> openCameraHardware();

拍照的数据流进行分析

主要有两个线程:
pictureThread 拍照线程
当用户使用拍照的功能的时候,拍照线程被调用(非循环),检测队列中的帧数据,将帧数据从队列中取出,
拍照的数据一定需要传到Java层,所有可以将数据转换成JPEG格式再上传,也可以转换成RGB的数据上传给java层

previewThread 预览线程
当预览方法被调用的时候启动预览线程,循环的检测队列中是否有帧数据,如果帧数据存在,读取帧数据,由于读取的数据为YUV格式的数据,所有要将YUV数据转换成RGB的送给显示框架显示,也可以将转换过的数据送给视频编码模块,编码成功后储存变成录像的功能



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值