[置顶] Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

新API android.hardware.camera2

新旧API特点对比

Camera自定义相机

新API android.hardware.camera2自定义相机

Camera类被用于获取图片设置,start/stop 预览,快照图片,恢复视频编码的帧,Camera是一个client对于Camera Service来说,将管理Camera 硬件相关, 为了使用设备的camera, 须要在Manifest中加上相应的权限,如你须要自动聚焦功能,在Manifest.xml须加入

<uses-permission android:name=”android.permission.CAMERA” /><uses-feature android:name=”android.hardware.camera” /><uses-feature android:name=”android.hardware.camera.autofocus” />Camera拍照

用Camera去拍照,将遵循以下几个步骤:

获得一个Camera的实例,通过open方法

如果必要的话,可以修改一些默认参数

通过初始化SurfaceHolder去setPreviewDisplay(SurfaceHolder),没有Surface, camera不能开始预览

调用startPreview方法开始更新预览的surface,在拍照前,预览(preview)必须被开启。

当你想开始拍照时,使用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback), 等待回调提供真实的图像数据

当拍完一张照片时,预览(preview)将会停止,当你想要拍更多的照片时,须要再一次调用startPreview方法

当调用stopPreview方法时,将停止更新预览的surface

当调用release方法时,将马上释放camera

Camera录像

以上是拍照过程,当如果切换成视频录制模式时,将遵循以下步骤:

获取一个初始化Camera,且开始预览

调用unlock方法允许media进程去访问camera

通过camera去setCamera(Camera),了解更多,可看MediaRecorder

当完成录制时,调用reconnect方法重新获取且重新lock camera

调用stopPreview()方法且release方法时,作为以上描述

这个类是一个非线程安全类,意味着在被使用任何工作线程中,大多数长运行操作(preview,focus,photo capture 等)发生,异步调用回调是必要的。回调被调用在事件线程,Camera方法决不能一次被多个线程调用

不同的安卓设备可能有不同的硬件规格,如像素的评级和自动对焦功能。

新API android.hardware.camera2

从API-21(5.0)开始,新增一个android.hardware.camera2包,取代原来Camera.java。

Android平台支持拍照及录制视频,通过android.hardware.camera2相关API或camera Intent,下面是一些相关联的类

android.hardware.camera2 主要的API控制相机设备,被用于拍照及拍视频当build一个camera应用时

Camera Android 5.0之前控制相机设备的class

SurfaceView 呈现实时预览给用户

MediaRecorder 用户录制视频

Intent Intent action类型:MediaStore.ACTION_IMAGE_CAPTURE/MediaStore.ACTION_VIDEO_CAPTURE,拍照或录视频,不用直接用Camera(可通过调起第三方定义的Camera)

本文出自逆流的鱼yuiop:

新旧API特点对比

android.hardware.camera2与原来的camera API相比,不同之处在于:

原生支持RAW照片输出突发拍摄模式

制约拍照速度的不再是软件而是硬件。以Nexus 5为例,分辨率全开下Andorid L的连拍速度可达到30fps。

全自动控制快门、感光度、对焦、测光、硬件视频防抖等多种参数都被整合到了新的API内。

新的API中添加的手动控制功能列表:感光度手动对焦/AF开关AE/AF/AWB模式AE/AWB锁硬件视频防抖连续帧

可以用单个手指进行缩放

支持QR码识别

实例

使用Camera有两种方式:通过Intent使用已有的app和通过Camera构建自己的app。通过Camera API的方式拍照。

通过Camera API方式拍照需要引入几个关键的类:

Camera类:最主要的类,用于管理Camera设备,本文中主要用到以下方法:

open():通过open方法获取Camera实例。

setPreviewDisplay(SurfaceHolder):设置预览拍照

startPreview():开始预览

stopPreview():停止预览

release():释放Camera实例

takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg):这个是拍照要执行的方法,包含了三个回调参数。Shutter是快门按下时的回调,raw是获取拍照原始数据的回调,jpeg是获取经过压缩成jpg格式的图像数据。在本文中需要实现最后一个回调,参见下面。

Camera.PictureCallback接口:该回调接口包含了一个onPictureTaken(byte[]data, Camera camera)方法。在这个方法中可以保存图像数据。

SurfaceView类:用于控制预览界面

SurfaceHolder.Callback接口:用于处理预览的事件,需实现如下三个方法:

surfaceCreated(SurfaceHolderholder):预览界面创建时调用,每次界面改变后都会重新创建,需要获取相机资源并设置SurfaceHolder。

surfaceChanged(SurfaceHolderholder, int format, int width, int height):预览界面发生变化时调用,每次界面发生变化之后需要重新启动预览。

surfaceDestroyed(SurfaceHolderholder):预览销毁时调用,停止预览,释放相应资源。

通过Camera方式来实现拍照

通过Camera方式 会比通过Intent方式获得更为丰富的功能。通常创建一个定制化的Camera需要如下步骤:

(1) 通过Camera.open()来获取Camera实例。 (2) 创建Preview类,需要继承SurfaceView类并实现SurfaceHolder.Callback接口。 (3) 为相机设置Preview (4) 构建一个Preview的Layout来预览相机; (5) 为拍照建立Listener以获取拍照后的回调; (6) 拍照并保存文件; (7) 释放Camera。

本文出自逆流的鱼yuiop:

Camera自定义相机

CameraSample代码如下: MainActivity.java

每个人都有自己鲜明的主张和个性,

[置顶] Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

相关文章:

你感兴趣的文章:

标签云: