Android Camera HAL开发文档-2012.1.30
- 格式:pdf
- 大小:248.37 KB
- 文档页数:16
Android:CameraHAL3的参数传递(CameraMetadata)⼀、camera_metadata简介 Camera API2/HAL3架构下使⽤了全新的CameraMetadata结构取代了之前的SetParameter/Paramters等操作,实现了Java到native到HAL3的参数传递。
引⼊了管道的概念将安卓设备和摄像头之间联系起来,系统向摄像头发送 Capture 请求,⽽摄像头会返回CameraMetadata,这⼀切建⽴在⼀个叫作 CameraCaptureSession 的会话中。
⼆、Framework到HAL层的转换 Camera2Client 使⽤ API1 传递参数采⽤的逻辑是还是在Java层预留了setParameters接⼝,只是当Parameter在设置时⽐起CameraClient⽽⾔,是将这个Parameter根据不同的TAG形式直接绑定到CameraMetadatamPreviewRequest/mRecordRequest/mCaptureRequest中,这些数据会由Capture_Request转为camera3_capture_request中的camera_metadata_t settings完成参数从Java到native到HAL3的传递。
但是在Camera API2下,不再需要那么复杂的转换过程,在Java层中直接对参数进⾏设置并将其封装到Capture_Request即可,即参数控制由Java层来完成。
这也体现了API2中Request和Result在APP中就⼤量存在的原因。
对此为了和Framework Native层相关TAG数据的统⼀,在Java层中⼤量出现的参数设置是通过Section Tag的name来交由Native完成转换⽣成在Java层的TAG。
(1)Java层对应代码位置:frameworks\base\core\java\android\hardware\camera2\impl\CameraMetadataNative.javaprivate <T> T getBase(Key<T> key) {int tag = nativeGetTagFromKeyLocal(key.getName());byte[] values = readValues(tag);if (values == null) {// If the key returns null, use the fallback key if exists.// This is to support old key names for the newly published keys.if (key.mFallbackName == null) {return null;}tag = nativeGetTagFromKeyLocal(key.mFallbackName);values = readValues(tag);if (values == null) {return null;}}int nativeType = nativeGetTypeFromTagLocal(tag);Marshaler<T> marshaler = getMarshalerForKey(key, nativeType);ByteBuffer buffer = ByteBuffer.wrap(values).order(ByteOrder.nativeOrder());return marshaler.unmarshal(buffer);}(2)Native层对应代码位置:frameworks/base/core/jni/android_hardware_camera2_CameraMetadata.cppstatic const JNINativeMethod gCameraMetadataMethods[] = {// static methods{ "nativeGetTagFromKey","(Ljava/lang/String;J)I",(void *)CameraMetadata_getTagFromKey },{ "nativeGetTypeFromTag","(IJ)I",(void *)CameraMetadata_getTypeFromTag },{ "nativeSetupGlobalVendorTagDescriptor","()I",(void*)CameraMetadata_setupGlobalVendorTagDescriptor },// instance methods...... 其中CameraMetadata_getTagFromKey是实现将⼀个Java层的string转为⼀个tag的值,如:android.control.mode。
CameraHardwareStub学习&CameraHAL设计初步CameraHardwareStub是Android提供的一个fake camera工具。
其代码主要包含三个部分:init、preview和picture。
1、InitCameraHardwareStub()()构造函数|initDefaultParameters()|setParameters(const CameraParameters& params)|initHeapLocked(){mRawHeap = new MemoryHeapBase(picture_width * 2 * picture_height);mPreviewHeap = new MemoryHeapBase(mPreviewFrameSize * kBufferCount);mBuffers[i] = new MemoryBase(mPreviewHeap, i * mPreviewFrameSize, mPreviewFrameSize);mFakeCamera = new FakeCamera(preview_width, preview_height);}2、PreviewstartPreview()|PreviewThread(this)|previewThread(){mlockinit...munlockfakeCamera->getNextFrameAsYuv422(frame);}3、PicturePicture又可以分为autofocus和picture两个部分,autofocus 暂时不看,无法实现。
takePicture()|beginPictureThread(void *cookie)|pictureThread(){case CAMERA_MSG_RAW_IMAGEcam.getNextFrameAsYuv422((uint8_t *)mRawHeap->base());case CAMERA_MSG_COMPRESSED_IMAGEmemcpy(heap->base(), kCannedJpeg, kCannedJpegSize);}4、FakeCamera.cpp中,除了本身的构造函数,只有getNextFrameAsYuv422经常被调用,所以如果从真实摄像头获取一帧数据,应该也可以。
android camera HAL v3.0详细介绍(二)android camera HAL v3.0详细介绍(二)2015-12-21 11:11412人阅读评论(0)收藏举报分类:android camera(20)3.Startup and expected operation sequence这段描述了使用camera API的详细步骤。
其中涉及到的结构体和函数请参考文件:platform/hardware/libhardware/include/hardware/camera3. h1. Framework层调用函数camera_module_t->common.open(),将返回一个hardware_device_t类型的结构体。
2. Framework层检查字段hardware_device_t->version,根据版本信息,实例化一个适合这个版本的camera硬件设备的句柄。
例如版本号是CAMERA_DEVICE_API_VERSION_3_0,则这个设备将被转化为camera3_device_t。
3. Framework层调用函数camera3_device_t->ops->initialize(),并传递了framework层的回调函数指针。
这个函数只能被调用一次,且在调用函数open()之后,在其他函数被调用之前。
4. Framework层调用函数camera3_device_t->ops->configure_streams(),向这个HAL层设备传递了输入输出的流信息。
5. Framework层分配grallocbuffer;调用函数camera3_device_t->ops->register_stream_buffers(),至少使用一个configure_streams中列举的输出流。
AndroidCameraManager类详解本⽂实例为⼤家分享了Android CameraManager类的具体代码,供⼤家参考,具体内容如下先看代码:private SurfaceView mSurfaceView;private SurfaceHolder mSurfaceHolder;private CameraManager cameraManager;cameraManager = new CameraManager(this);mSurfaceView = (SurfaceView) findViewById(R.id.java_surface_view);mSurfaceHolder = mSurfaceView.getHolder();// mSurfaceView 不需要⾃⼰的缓冲区mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// mSurfaceView添加回调mSurfaceHolder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) { //SurfaceView创建try {cameraManager.openDriver(mSurfaceHolder);cameraManager.startPreview();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) { //SurfaceView销毁holder.removeCallback(this); // Camera is being used after Camera.release() was calledcameraManager.stopPreview();cameraManager.closeDriver();}});⾃定义⼀个 CameraManager 类,在关闭当前页⾯,释放camera资源时偶尔报错Camera is being used after Camera.release() was called第⼀次,加了⼀句 holder.removeCallback(this); 运⾏发现还是时不时出现报错。
AndroidCameraHal类图分析先看⼀下CameraHAL整体的类图。
很乱,我们⼀块⼀块的看。
第⼀部分,CameraAdapter的继承关系:V4LCameraAdapter: V4LCameraAdapter是处于最底层的类,他负责跟硬件的通讯,并且实现了⼤部分的控制功能。
V4LCameraAdapter内部定义了PreviewThread线程。
V4LCameraAdapter的mVideoinfo实现了对VideoInfo的引⽤,⽽VideoInfo定义了Camera Video的相关信息。
BaseCameraAdapter: BaseCameraAdapter实现了MessageNotifier及FrameNotifier的全部接⼝,及⼀些不需要与硬件交互的接⼝。
⽽下列接⼝都由V4LCameraAdapter实现: takePicture [android::BaseCameraAdapter] stopImageCapture [android::BaseCameraAdapter] startBracketing [android::BaseCameraAdapter] stopBracketing [android::BaseCameraAdapter] beginAutoFocusThread [android] autoFocus [android::BaseCameraAdapter] cancelAutoFocus [android::BaseCameraAdapter] startSmoothZoom [android::BaseCameraAdapter] stopSmoothZoom [android::BaseCameraAdapter] startPreview [android::BaseCameraAdapter] stopPreview [android::BaseCameraAdapter] useBuffers [android::BaseCameraAdapter] fillThisBuffer [android::BaseCameraAdapter] getFrameSize [android::BaseCameraAdapter] getFrameDataSize [android::BaseCameraAdapter] getPictureBufferSize [android::BaseCameraAdapter] startFaceDetection [android::BaseCameraAdapter] stopFaceDetection [android::BaseCameraAdapter] switchToExecuting [android::BaseCameraAdapter] disableMirror [android::BaseCameraAdapter] BaseCameraAdapter定义了两个消息队列mFrameQ及mAdapterQ,但这两个消息队列没有被使⽤到。
Android的Camera架构介绍1.1 Camera概述Android 的Camera 包含取景器(viewfinder)和拍摄照片的功能。
目前Android发布版的Camera程序虽然功能比较简单,但是其程序的架构分成客户端和服务器两个部分,它们建立在Android的进程间通讯Binder的结构上。
以开源的Android为例,Camera的代码主要在以下的目录中:Camera的JAVA程序的路径:packages/apps/Camera/src/com/android/camera/在其中Camera.java是主要实现的文件frameworks/base/core/java/android/hardware/Camera.java这个类是和JNI中定义的类是一个,有些方法通过JNI的方式调用本地代码得到,有些方法自己实现。
Camera的JAVA本地调用部分(JNI):frameworks/base/core/jni/android_hardware_Camera.cpp这部分内容编译成为目标是libandroid_runtime.so。
主要的头文件在以下的目录中:frameworks/base/include/ui/Camera底层库在以下的目录中:frameworks/base/libs/ui/这部分的内容被编译成库libui.so。
Camera服务部分:frameworks/base/camera/libcameraservice/这部分内容被编译成库libcameraservice.so。
为了实现一个具体功能的Camera,在最底层还需要一个硬件相关的Camer库(例如通过调用video for linux驱动程序和Jpeg编码程序实现)。
这个库将被Camera的服务库libcameraservice.so调用。
1.2 Camera的接口与架构Camera的整体框架图Camera的各个库之间的结构可以用下图的表示:在Camera系统的各个库中,libui.so位于核心的位置,它对上层的提供的接口主要是Camera类,类libandroid_runtime.so通过调用Camera类提供对JAVA的接口,并且实现了android.hardware.camera类。
AndroidCameraHAL3分析剖析1Android Camera HAL3 分析本⽂均属⾃⼰阅读源码的点滴总结,转账请注明出处谢谢。
欢迎和⼤家交流。
qq:1037701636email:gzzaigcn2009@/doc/f6376fb26394dd88d0d233d4b14e852459fb396f.htmlSoftware :系统源码Android 5.1Camera3研读前沿:当初在研读Camera1.0相关的内容时,主要围绕着CameraClient 、CameraHardwareInterface 等⽅⾯进⾏⼯作的开展,⽆论是数据流还是控制流看起来都很简单、明了,⼀系列的流程化操作使得整个框架学起来特别的容易。
因为没有Camera2.0相关的基础,所以这次直接看3.0相关的源码时,显得⼗分的吃紧,再加上底层⾼通HAL3.0实现的过程也是相当的复杂,都给整个研读过程带来了很多的困难。
可以说,⾃⾝⽬前对Camera3.0框架的熟悉度也⼤概只有70%左右,希望通过总结来进⼀步梳理他的⼯作原理与整个框架,并进⼀步熟悉与加深理解。
1.Camera3下的整体架构图。
整个CameraService 建⽴起⼀个可⽤操作底层Camera device ⼤致需要经过Camera2Client 、Camera3Device 以及HAL 层的camera3_device_t 三个部分。
2从上图中可以发现Camera3架构看上去明显⽐camera1来的复杂,但他更加的模块化。
对⽐起Android4.2.2 Camer 系统架构图(HAL 和回调处理)⼀⽂中描述的单顺序执⾏流程,Camera3将更多的⼯作集中在了Framework 去完成,将更多的控制权掌握在⾃⼰的⼿⾥,从⽽与HAL 的交互的数据信息更少,也进⼀步减轻了⼀些在旧版本中HAL 层所需要做的事情。
2. Camera2Client 的建⽴与初始化过程在建⽴好Camera2Client 后会进⾏initialize 操作,完成各个处理模块的创建:123 .... mStreamingProcessor = new StreamingProcessor(this);//preview 和recorder threadName = String8::format(C2-%d-StreamProc,mCameraId);4 5 6 7 8 91011141516171819202122232425 mStreamingProcessor->run(threadName.string());//预览与录像mFrameProcessor = new FrameProcessor(mDevice, this);// 3AthreadName = String8::format(C2-%d-FrameProc,mCameraId);mFrameProcessor->run(threadName.string()); //3AmCaptureSequencer = new CaptureSequencer(this);threadName = String8::format(C2-%d-CaptureSeq,mCameraId);mCaptureSequencer->run(threadName.string());//录像,拍照mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); threadName = String8::format(C2-%d-JpegProc, mCameraId);mJpegProcessor->run(threadName.string());....mCallbackProcessor = new CallbackProcessor(this);//回调处理threadName = String8::format(C2-%d-CallbkProc,mCameraId);mCallbackProcessor->run(threadName.string());依次分别创建了:StreamingProcessor并启动⼀个他所属的thread,该模块主要负责处理previews 与record两种视频流的处理,⽤于从hal层获取原始的视频数据FrameProcessor并启动⼀个thread,该模块专门⽤于处理回调回来的每⼀帧的3A等信息,即每⼀帧视频除去原始视频数据外,还应该有其他附加的数据信息,如3A值。
AndroidCamera详解相关的类1. android.hardware.camera22. Camera3. SurfaceView---这个类⽤于向⽤户呈现实时相机预览。
4. MediaRecorder---这个类⽤于从摄像机录制视频。
5. Intent---MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE可⽤于捕获图像或视频,⽽⽆需直接使⽤Camera对象。
清单声明在使⽤Camera API开始开发应⽤程序之前,应确保您的清单具有适当的声明,以允许使⽤相机硬件和其他相关功能。
相机权限 - 您的应⽤程序必须请求使⽤设备相机的权限。
<uses-permission android:name="android.permission.CAMERA" />注意:如果您通过调⽤现有的摄像头应⽤程序来使⽤摄像头,则应⽤程序不需要请求此权限。
相机功能 - 您的应⽤程序还必须声明使⽤相机功能,例如:<uses-feature android:name="android.hardware.camera" />存储权限 - 如果应⽤程序将图像或视频保存到设备的外部存储设备(SD卡),则还必须在清单中指定此选项。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />⾳频录制权限 - 对于使⽤视频捕获录制⾳频,应⽤程序必须请求获取⾳频捕获权限。
<uses-permission android:name="android.permission.RECORD_AUDIO" />创建⾃定义摄像头为应⽤程序创建⾃定义摄像头界⾯的⼀般步骤如下:1. 检测和访问摄像机 - 创建代码以检查摄像机是否存在并请求访问。
Android Camera HAL3中拍照Capture模式下多模块间的交互与帧Result与帧数据回调本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。
欢迎和大家交流。
qq:1037701636 email:gzzaigcn2009@Software:系统源码Android5.1前沿:之前的两篇博文算是比较详细的记录了整个Camera3 HAL3架构下完全不同于HAL1的preview预览处理过程,包括主要涉及到的控制流和视频流等。
比较详细的阐述了Camera2Client下streamProcessor、CallbackProcessor、CaptureSequencer等模块在Camera3架构下的功能。
分析得出每个模块下均会在Camera3Device下以一个Stream的形式存在,而每个stream又是由多个buffer来构成主体的。
与HAL3进行数据的交互时,以Request和result来作为数据传输的载体。
在这些基础上本文将描述具体拍照Capture模式下的数据流和控制流,主要会涉及到jpegprocessor、CaptureSequencer这几个模块的工作原理。
鉴于Capture模式下的数据流更复杂,在这里重点会分析数据流result回传时,每个模块的响应以及处理过程,填补前一博文的空白。
1. HAL3中Camera2Client下的take picture的入口函数作为标准的capture picture功能的入口,主要完成了以下两件事情:updateProcessorStream(mJpegProcessor, l.mParameters); mCaptureSequencer->startCapture(msgType)对于JpegProcessor模块而言,他的stream流第一次是在preview阶段进行了create与初始化,这里之所以再次调用JpegProcessor::updateStream目的是参考原先JpegProcessor stream的width与height是否变化即是否照片要求的分辨率发生了变化,如果是的话就需要delete原先的stream,重新建立一个stream。
1Android Camera HAL3 分析本文均属自己阅读源码的点滴总结,转账请注明出处谢谢。
欢迎和大家交流。
qq:1037701636 email:gzzaigcn2009@Software :系统源码Android 5.1Camera3研读前沿:当初在研读Camera1.0相关的内容时,主要围绕着CameraClient 、CameraHardwareInterface 等方面进行工作的开展,无论是数据流还是控制流看起来都很简单、明了,一系列的流程化操作使得整个框架学起来特别的容易。
因为没有Camera2.0相关的基础,所以这次直接看3.0相关的源码时,显得十分的吃紧,再加上底层高通HAL3.0实现的过程也是相当的复杂,都给整个研读过程带来了很多的困难。
可以说,自身目前对Camera3.0框架的熟悉度也大概只有70%左右,希望通过总结来进一步梳理他的工作原理与整个框架,并进一步熟悉与加深理解。
1.Camera3下的整体架构图。
整个CameraService 建立起一个可用操作底层Camera device 大致需要经过Camera2Client 、Camera3Device 以及HAL 层的camera3_device_t 三个部分。
2从上图中可以发现Camera3架构看上去明显比camera1来的复杂,但他更加的模块化。
对比起Android4.2.2 Camer 系统架构图(HAL 和回调处理)一文中描述的单顺序执行流程,Camera3将更多的工作集中在了Framework 去完成,将更多的控制权掌握在自己的手里,从而与HAL 的交互的数据信息更少,也进一步减轻了一些在旧版本中HAL 层所需要做的事情。
2. Camera2Client 的建立与初始化过程在建立好Camera2Client 后会进行initialize 操作,完成各个处理模块的创建: ?123 .... mStreamingProcessor = new StreamingProcessor(this);//preview 和recorder threadName = String8::format(C2-%d-StreamProc,mCameraId);4 5 6 7 8 910111213141516171819202122232425 mStreamingProcessor->run(threadName.string());//预览与录像mFrameProcessor = new FrameProcessor(mDevice, this);// 3AthreadName = String8::format(C2-%d-FrameProc,mCameraId);mFrameProcessor->run(threadName.string()); //3AmCaptureSequencer = new CaptureSequencer(this);threadName = String8::format(C2-%d-CaptureSeq,mCameraId);mCaptureSequencer->run(threadName.string());//录像,拍照mJpegProcessor = new JpegProcessor(this, mCaptureSequencer); threadName = String8::format(C2-%d-JpegProc,mCameraId);mJpegProcessor->run(threadName.string());....mCallbackProcessor = new CallbackProcessor(this);//回调处理threadName = String8::format(C2-%d-CallbkProc,mCameraId);mCallbackProcessor->run(threadName.string());依次分别创建了:StreamingProcessor并启动一个他所属的thread,该模块主要负责处理previews 与record两种视频流的处理,用于从hal层获取原始的视频数据FrameProcessor并启动一个thread,该模块专门用于处理回调回来的每一帧的3A等信息,即每一帧视频除去原始视频数据外,还应该有其他附加的数据信息,如3A值。
Android Camera HAL开发文档目录Android Camera HAL开发文档 (1)Android Camera1 (3)Android2.31.1 (3)Android4.01.2 (4)Camera配置2 (7)camera.cfg2.1 (7)media_profiles.xml2.2 (12)Example for Android2.3.42.2.1 (12)Example for Android4.02.2.2 (15)1Android CameraAndroid系统中Camera的整体架构图如下:对于系统开发人员来说, 只需要实现上图中右下角的部分, 我们称为Camera HAL层.Camera HAL层的实现方式在Android2.3和Android4.0中有较大的变化.1.1 Android2.3Android2.3.4中CameraHardwareInterface是一个纯虚基类, 我们实际的Camera HAL层只需要实现CameraHardwareInterface中定义的所有的接口即可.在Android2.3.4中CameraService的Android.mk中有如下:ifeq ($(USE_CAMERA_STUB), true)LOCAL_STATIC_LIBRARIES += libcamerastubelseLOCAL_SHARED_LIBRARIES += libcameraendif可以看出CameraService必须依赖libcamerastub或者libcamera, libcamerastub是一个虚拟的Camera HAL 模块, 用于没有物理Camera的系统能够正常的编译通过.如果系统中有实际的物理Camera存在, 在需要在device目录中的BoardConfigCommon.mk将USE_CAMERA_STUB定义为false, 这样系统才能链接到正确的Camera HAL, 如下:USE_CAMERA_STUB := falseifeq ($(USE_CAMERA_STUB), false)BOARD_CAMERA_LIBRARIES := libcameraendifCrane系统中Camera HAL的结构体如下, 虚线框中部分即为Camera HAL层.1.2 Android4.0在Android4.0中, CameraHardwareInterface不再是一个简单的纯虚接口类, 而是将所有的接口实现都转接到了camera_device_t对象中.HAL层模块CameraService中创建CameraHardwareInterface实例;CameraHardwareInterface对象调用camera_module_t的接口open, 获取hw_device_t对象, 赋值所有的camera_device_ops_t中的函数指针;CameraHardwareInterface对象赋值用于预览的函数指针;ics-exdroid中Camera HAL实现的结构图如下:2Camera配置对于非系统开发人员来说不需要关注Camera HAL的具体实现, 只要正确的配置两个配置文件即可. 2.1 camera.cfg为了使得Camera HAL的代码能够兼容各种不同的摄像头模组, 我们将一些差异性的属性列出来通过camera.cfg文件来配置, 在Camera HAL代码中通过读取camera.cfg来使用不同的模组.简要说明一下camera.cfg的配置文件:camera.cfg中定义分号开头为注释;基本格式为: key = value几个主要的key:Key Descriptionnumber_of_camera 告诉当前系统有几个摄像头, 单摄像头为1, 双摄像头为2camera_id Android系统中的摄像头id号, 如果只有一个摄像头则id号为0; 如果有两个摄像头则后置摄像头id为0, 前置摄像头id为1camera_facing 告诉系统这个摄像头是前置还是后置, Android系统中对于前置和后置摄像头在预览时的处理是不一样的, 前置摄像头预览会所有镜像camera_device 当前摄像头驱动的设备结点名称, 用于打开正确的摄像头. 如果两个摄像头分别接到不同的CSI上时, 那么两个摄像头的设备结点名称是不同的; 如果两个设想共用一个CSI接口, 那么这两个摄像头的设备结点相同, 此时需要通过下面的device_id来区分不同的摄像头device_id device_id是对于两个摄像头共用一个CSI接口时用于打开不同的摄像头用的,device_id为0是默认打开的摄像头; device_id为1则需要打开设备结点时切换到该摄像头剩下的几项基本上都是基于模式为:used_xxx: 为0表示系统不支持, 为1表示系统支持;如果系统支持, 那么:key_support_xxx后的值表明系统所支持的模式;key_ default_xxx后的值表明默认的模式;在camera.cfg中定义的used_xxx中有两项used_preview_size和used_picture_size是必须配置的, 其它都是可选项.典型的camera.cfg配置文件如下:;-------------------------------------------------------------------------------; 用于camera的配置;; 采用格式:; key = key_value; 注意: 每个key需要顶格写;; key_value紧跟着key后面的等号后面, 位于同一行中;; key_value限制大小为256字节以内;;;-------------------------------------------------------------------------------;-------------------------------------------------------------------------------; 1 for single camera, 2 for double camera;-------------------------------------------------------------------------------number_of_camera = 2;-------------------------------------------------------------------------------; CAMERA_FACING_BACK; gt2005;-------------------------------------------------------------------------------camera_id = 0;-------------------------------------------------------------------------------; 1 for CAMERA_FACING_FRONT; 0 for CAMERA_FACING_BACK;-------------------------------------------------------------------------------camera_facing = 0;-------------------------------------------------------------------------------; driver device name;-------------------------------------------------------------------------------camera_device = /dev/video0;-------------------------------------------------------------------------------; device id; for two camera devices with one CSI;-------------------------------------------------------------------------------device_id = 0used_preview_size = 1key_support_preview_size = 1600x1200,640x480key_default_preview_size = 640x480used_picture_size = 1key_support_picture_size = 1600x1200,1280x1024,1024x768,800x600,640x480key_default_picture_size = 1600x1200used_flash_mode = 0key_support_flash_mode = on,off,auto,red-eye,torchkey_default_flash_mode = offused_color_effect=1key_support_color_effect = none,mono,negative,sepia,aquakey_default_color_effect = noneused_frame_rate = 1key_support_frame_rate = 15, 30key_default_frame_rate = 30used_focus_mode = 0key_support_focus_mode = auto,infinity,macro,fixedkey_default_focus_mode = autoused_scene_mode = 0key_support_scene_mode = auto,auto,portrait,landscape,night,night-portrait,theatre,beach,snow,sunset,steadyphoto,firewo rks,sports,party,candlelight,barcodekey_default_scene_mode = autoused_white_balance = 1key_support_white_balance = auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylightkey_default_white_balance = autoused_exposure_compensation = 1key_max_exposure_compensation = 4key_min_exposure_compensation = -4key_step_exposure_compensation = 1key_default_exposure_compensation = 0; only for facing back cameraused_zoom = 1key_zoom_supported = truekey_smooth_zoom_supported = falsekey_zoom_ratios = 100,120,150,200,230,250,300key_max_zoom = 6key_default_zoom = 0;------------------------------------------------------------------------------- ; CAMERA_FACING_FRONT; gc0308;------------------------------------------------------------------------------- camera_id = 1;------------------------------------------------------------------------------- ; 1 for CAMERA_FACING_FRONT; 0 for CAMERA_FACING_BACK;------------------------------------------------------------------------------- camera_facing = 1;------------------------------------------------------------------------------- ; driver device name;------------------------------------------------------------------------------- camera_device = /dev/video1;------------------------------------------------------------------------------- ; device id; for two camera devices with one CSI;------------------------------------------------------------------------------- device_id = 0used_preview_size = 1key_support_preview_size = 640x480key_default_preview_size = 640x480used_picture_size = 1key_support_picture_size = 640x480,320x240key_default_picture_size = 640x480used_flash_mode = 0key_support_flash_mode = on,off,autokey_default_flash_mode = onused_color_effect=1key_support_color_effect = none,mono,negative,sepia,aquakey_default_color_effect = noneused_frame_rate = 1key_support_frame_rate = 25key_default_frame_rate = 25used_focus_mode = 0key_support_focus_mode = auto,infinity,macro,fixedkey_default_focus_mode = autoused_scene_mode = 0key_support_scene_mode = auto,auto,portrait,landscape,night,night-portrait,theatre,beach,snow,sunset,steadyphoto,firewo rks,sports,party,candlelight,barcodekey_default_scene_mode = autoused_white_balance = 1key_support_white_balance = auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylightkey_default_white_balance = autoused_exposure_compensation = 1key_max_exposure_compensation = 4key_min_exposure_compensation = -4key_step_exposure_compensation = 1key_default_exposure_compensation = 0; only for facing back cameraused_zoom = 0key_zoom_supported = truekey_smooth_zoom_supported = falsekey_zoom_ratios = 100,120,150,200,230,250,300key_max_zoom = 6key_default_zoom = 02.2 media_profiles.xmlmedia_profiles.xml用于配置录像参数.拿到一个模板后, 只需要修改几处地方即可.Android2.3.4和Android4.0稍有不同, Android4.0在Android2.3的基础上增加了延时录制模式, 所以需要多配置一下延时录制模式的参数.典型的对于双摄像头如下分了两段分别配置后置摄像头cameraId="0"和前置摄像头cameraId="1".这里需要根据实际摄像头参数修改下面例子中高亮标注的地方.关键字含义EncoderProfile quality 录像质量, 在Android2.3中必须要配置两项”low”和”high”; Android4.0中默认支持”1080p”, ”720p”, “480p”, 我们为了兼容以前的配置, 扩展了支持”low”和”high”, 此外Android4.0中支持了延时录制模式, 其关键字分别是在正常模式前加上” timelapse”, 例如” timelapse480p”等Video codec 编码格式, 这里为”h264”即可bitRate 通常说的视频文件的码率, 码率越高, 录制文件画面(视频)越清晰, 音质(音频)越高, 但占用磁盘空间越大width, height 录像文件的分辨率, 分别对应宽和高frameRate 视频文件的帧率, 实际的帧率需要与摄像头采集帧率一致sampleRate 声音的采样率, 采样率越高, 音质越好; 反之亦然channels 声音的通道数, 通常说的单声道或双声道ImageEncoding quality 是指拍照的质量, 分别对于及精细, 精细和一般2.2.1Example for Android2.3.4对于Android2.3.4, 典型配置如下(截取部分):<MediaSettings><!-- Each camcorder profile defines a set of predefined configuration parameters --><!-- Back Camera --><CamcorderProfiles cameraId="0"><EncoderProfile quality="low" fileFormat="mp4" duration="30"><Video codec="h264"bitRate="1000000"width="640"height="480"frameRate="30" /><Audio codec="aac"bitRate="12200"sampleRate="8000"channels="1" /></EncoderProfile><EncoderProfile quality="high" fileFormat="mp4" duration="30"><Video codec="h264"bitRate="3000000"width="1600"height="1200"frameRate="15" /><Audio codec="aac"bitRate="96000"sampleRate="44100"channels="1" /></EncoderProfile><ImageEncoding quality="90" /><ImageEncoding quality="80" /><ImageEncoding quality="70" /><ImageDecoding memCap="20000000" /></CamcorderProfiles><!-- Front Camera --><CamcorderProfiles cameraId="1"><EncoderProfile quality="high" fileFormat="mp4" duration="60"> <Video codec="h264"bitRate="1000000"width="640"height="480"frameRate="25" /><Audio codec="aac"bitRate="12200"sampleRate="44100"channels="1" /></EncoderProfile><EncoderProfile quality="low" fileFormat="mp4" duration="30"><Video codec="h264"bitRate="500000"width="320"height="240"frameRate="25" /><Audio codec="aac"bitRate="12200"sampleRate="8000"channels="1" /></EncoderProfile><ImageEncoding quality="90" /><ImageEncoding quality="80" /><ImageEncoding quality="70" /><ImageDecoding memCap="20000000" /></CamcorderProfiles><EncoderOutputFileFormat name="mp4" /><!--If a codec is not enabled, it is invisible to the applications In other words, the applications won't be able to use the codec or query the capabilities of the codec at all if it is disabled --><VideoEncoderCap name="h264" enabled="true"minBitRate="64000" maxBitRate="8000000"minFrameWidth="320" maxFrameWidth="1600"minFrameHeight="240" maxFrameHeight="1200"minFrameRate="1" maxFrameRate="30" /><AudioEncoderCap name="aac" enabled="true"minBitRate="8000" maxBitRate="320000"minSampleRate="8000" maxSampleRate="48000"minChannels="1" maxChannels="1" /></MediaSettings>2.2.2Example for Android4.0对于Android4.0典型配置如下(截取部分):<EncoderProfile quality="480p" fileFormat="mp4" duration="60"><Video codec="h264"bitRate="1000000"width="640"height="480"frameRate="25" /><Audio codec="aac"bitRate="12200"sampleRate="44100"channels="1" /></EncoderProfile><EncoderProfile quality="low" fileFormat="mp4" duration="30"><Video codec="h264"bitRate="500000"width="320"height="240"frameRate="25" /><Audio codec="aac"bitRate="12200"sampleRate="8000"channels="1" /></EncoderProfile><EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="30"> <Video codec="h264"bitRate="1000000"width="640"height="480"frameRate="25" /><!-- audio setting is ignored --><Audio codec="aac"bitRate="12200"sampleRate="44100"channels="1" /></EncoderProfile><EncoderProfile quality="timelapselow" fileFormat="mp4" duration="30"> <Video codec="h264"bitRate="500000"width="320"height="240"frameRate="25" /><!-- audio setting is ignored --><Audio codec="aac"bitRate="12200"sampleRate="8000"channels="1" /></EncoderProfile>。