【Android源码 栏目提醒】:网学会员为需要Android源码 的朋友们搜集整理了Android 的照相机系统 - 电子电信相关资料,希望对各位网友有所帮助!
Android 的照相机系统 韩 超
Android 技术
Android 的 Camera 系统 第一部分 Camera 系统的结构 第二部分 移植和调试的要点 第三部分 Camera 实现方式第一部分 Camera 系统的结构 照相机系统下层的硬件通常是摄像头 设备,主要用于向系统输入视频数据。
摄像 头设备通常包括处理器中的数据信号处理相 关的控制器和摄像头传感器。
摄像头传感器 又可以分为普通型和智能型的。
摄像机硬件 对软件部分主要提供视频数据。
第一部分 Camera 系统的结构 照相机系统对上层的接口提供了取景 器、视频录制、拍摄相片三个方面的主要功 能,还有各种控制类的接口。
照相机系统提 供了 Java 层的接口和本地接口:一方 面, Java 框架中 Camera 类,提供 Java 层照 相机接口,为照相机和扫描类应用使用;另 一方面, Camera 本地接口也可以给本地程 序调用,通常作为视频的输入环节,在摄像 机和视频电话中使用。
第一部分 Camera 系统的结构 在理论上,照相机的取景器、视频、 照片等数据都可以传送到 Java 层,但是通常 情况下,这些数据不需要传递到 Java 层。
仅 有少数情况需要在 Java 层获取数据流,例如 通过摄像头进行扫面识别的时候,需要取景 器的数据帧。
第一部分 Camera 系统的结构 照相机应用 扫描类应用 平台API Java框架 视频录制器 Camera的Java类 Camera 视频电话 本地API 本地框架 Camera JNI、ui-Camera库、 CameraService、硬件抽象层
Android 系统 硬件 Camera设备(信号处理核心、摄像头传感器)第一部分 Camera 系统的结构 自下而上, Camera 系统分成了以下几个部分。
( 1 )摄像头驱动程序:通常基于 Linux 的 Video for Linux 视频驱动框架。
( 2 ) Camera 硬件抽象层 frameworks/base/include/ui/ frameworks/base/include/camera/ 主要的文件为 CameraHardwareInterface.h ,需要各 个系统根据自己的情况实现。
( 3 ) Camera 服务部分 frameworks/base/camera/libcameraservice/ Camera 服务是
Android 系统中一个单独部分,通过 调用 Camera 硬件抽象层来实现。
第一部分 Camera 系统的结构 自下而上, Camera 系统分成了以下几个部分。
( 1 )摄像头驱动程序:通常基于 Linux 的 Video for Linux 视频驱动框架。
( 2 ) Camera 硬件抽象层 frameworks/base/include/ui/ frameworks/base/include/camera/ 主要的文件为 CameraHardwareInterface.h ,需要各 个系统根据自己的情况实现。
( 3 ) Camera 服务部分 frameworks/base/camera/libcameraservice/ Camera 服务是
Android 系统中一个单独部分,通过 调用 Camera 硬件抽象层来实现。
第一部分 Camera 系统的结构 ( 4 ) Camera 的本地框架代码 头文件路径: frameworks/base/include/ui/ 或者 frameworks/base/include/camera/ 。
源代码路径: frameworks/base/libs/ui/ 或者 frameworks/base/libs/camera/ 。
Camera 系统是其中的一部分,这部分内容被编译成库 libui.so 或者 libcamera_client.so 。
( 5 ) Camera 的 JNI 代码 frameworks/base/core/jni/
android_hardware_Camera.cpp 。
提供给 Java 类的本地支持,也包含了反向调用 Java 传递信 息和数据功能。
( 6 ) Camera 系统的 Java 类 frameworks/base/core/java/
android/hardware/Camera.java 。
第四部分 Camera 系统与上层接口 Java 应用 Java Camera Class
android.hardware.camera Java 框架 Camera JNI Camera API Camera Service libui / libcameraclient Camera Hardware Interface Camera / ICamera / ICameraService Camera HAL 移植 Camera (libcamera.so) 内容 Stub C框架 .a libcamerainterface 内核空间 Camera Driver第二部分 移植和调试的要点 2.1 Camera 驱动程序 2.2 硬件抽象层的内容 2.3 Camera 系统上层调用情况2.1 Camera 驱动程序 摄像头( Camera )-视频驱动驱动通常使用 Video For Linux 。
v4l2 驱动的设备节点: /dev/video/videoX 主设备号为 81 ,次设备号 0-63 。
v4l2 驱动主要头文件路径: include/linux/videodev.h : v4l 第一版的头文件 include/linux/videodev2.h :定义主要的数据接口和常量 include/media/v4l2-dev.h :设备头文件,具体设备使用其中的接口注册 v4l2 驱动核心实现路径: driver/media/video/v4l2-dev.c2.1 Camera 驱动程序 文件接口调用 (ioctl/mmap) 用户空间 /dev/video V4L2设备号 内核空间 (81,X) 具体V4L2驱动 (实现struct video_device) 调用 注册 video_register_device V4L2驱动核心 硬件 (v4l2-dev.c) 操作 调用 注册 字符设备驱动程序核心 硬件层 摄像头 视频输出设备2.2 硬件抽象层的内容 Camera 的硬件抽象层的在 UI 库的头文件 CameraHardwareInterface.h 文件定义。
在这个接口中,包含了控制通道和数据通道 ,控制通道用于处理预览和视频获取的开始 / 停 止、拍摄照片、自动对焦等功能,数据通道通过 回调函数来获得预览、视频录制、自动对焦等数 据。
Camera 的硬件抽象层中还可以使用 Overlay 来实现预览功能。
2.2 硬件抽象层的内容 CameraHardwareInterface.h 文件的定义: typedef void notify_callbackint32_t msgType int32_t ext1 int32_t ext2 void user typedef void data_callbackint32_t msgType const sp dataPtr void user typedef void data_callback_timestampnsecs_t timestamp int32_t msgType const sp dataPtr void user2.2 硬件抽象层的内容 CameraHardwareInterface 类的定义: class CameraHardwareInterface : public virtual RefBase public: virtual CameraHardwareInterface virtual sp getPreviewHeap const 0 virtual sp getRawHeap const 0 virtual void setCallbacksnotify_callback notify_cb data_callback data_cb data_callback_timestamp data_cb_timestamp void user 0 virtual void enableMsgTypeint32_t msgType 0 virtual void disableMsgTypeint32_t msgType 0 virtual bool msgTypeEnabledint32_t msgType 02.2 硬件抽象层的内容 virtual status_t startPreview 0 virtual bool useOverlay return false virtual status_t setOverlayconst sp overlay return BAD_VALUE virtual void stopPreview 0 virtual bool previewEnabled 0 virtual status_t startRecording 0 virtual void stopRecording 0 virtual bool recordingEnabled 0 virtual void releaseRecordingFrameconst sp mem 0 virtual status_t autoFocus 0 virtual status_t cancelAutoFocus 0 virtual status_t takePicture 0 virtual status_t cancelPicture 0 virtual status_t setParametersconst CameraParameters params 0 virtual CameraParameters getParameters const 0 virtual status_t sendCommandint32_t cmd int32_t arg1 int32_t arg2 0 virtual void release 0 virtual status_t dumpint fd const Vector args const 02.2 硬件抽象层的内容 取景器预览的主要步骤如下所示: 在初始化的过程中,建立预览数据的内存队列(多种方式) ; 在 startPreview 的实现中,保存预览回调函数,建立预览线 程; 在预览线程的循环中,等待视频数据的到达; 视频帧到达后调用预览回调函数,将视频帧送出。
如果使用 Overlay 实现取景器,则需要有以下两个变化: 在 setOverlay 函数中,从 ISurface 接口中取得 Overlay 类 ; 在预览线程的循环中,不需要使用预览回调函数,直接将视 频数据输入到 Overlay 上。
2.2 硬件抽象层的内容 对于 Linux 系统而言,摄像头驱动部分大多使用 Video for Linux 2 ( V4L2 )驱动程序,在此处主要的处 理流程可以如下所示: 如果使用映射内核内存的方式 ( V4L2_MEMORY_MMAP ),构建预览的内存 MemoryHeapBase 需要从 V4L2 驱动程序中得到内存指 针; 如果使用用户空间内存的方式 ( V4L2_MEMORY_USERPTR ), MemoryHeapBase 中开辟的内存是在用户空间建立的; 在预览的线程中,使用 VIDIOC_DQBUF 调用阻塞等 待视频帧的到来,处理完成后 使用 VIDIOC_QBUF 调用 将帧内存再次压入队列,等待下一帧的到来。
2.2 硬件抽象层的内容 录制视频的主要步骤如下所示: 在 startRecording 的实现(或者在 setCallbacks )中, 保存录制视频回调函数; 录制视频可以使用自己的线程,也可以使用预览线程; 通过录制回调函数将视频帧送出; releaseRecordingFrame 被调用后,表示上层通知 Camera 硬件抽象层,这一帧的内存已经用完,可以进行下 一次的处理。
如果在 V4L2 驱动程序中使用原始数据( RAW ),则视频录 制的数据和取景器预览的数据为同一数 据。
releaseRecordingFrame 被调用时,通常表示编码器 已经完成了对当前视频帧的编码,对这块内存进行释放。
在 这个函数的实现中,可以设置标志位,标记帧内存可以再次 使用。
上一篇:
Android代码片段
下一篇:
用Mozilla免费调试器调试JavaScript