原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://vaero.blog.51cto.com/4350852/834878
Android Camera简述
好吧,别人的分析都是系统层面的==,我这算是酱油文章么?默默路过T^T。
一、Camera
package android.hardware
该类用于设定图像捕获设置,开启/关闭预览,抓拍图片以及获取帧用于编码视频。这个类是Camera服务的客户端,用于管理真实的照相机硬件。
为了能够访问照相机,你必须在你的Android Manifest内声明CAMERA权限。同时确保包括了<uses-feature>节点元素,来声明你所使用的camera功能。例如,如果你使用了照相机的自动对焦功能,你的Manifest应当包括以下内容:
- <uses-permission android:name="android.permission.CAMERA" />
- <uses-feature android:name="android.hardware.camera" />
- <uses-feature android:name="android.hardware.camera.autofocus" />
用该类拍照的执行步骤:
1. 通过open(int)函数,获得一个Camera实例。
2. 通过getParameters()函数,获得已有的设置(默认)。
3. 如果需要的话,调用setParameters(Camera.Parameters)函数,修改第二步返回的Camera.Parameters对象。
4. 如果需要的话,调用setDisplayOrientation(int)函数,设置屏幕水平或垂直。
5.
重要:传递一个已初始化好的SurfaceHolder对象给setPreviewDisplay(SurfaceHolder)函数。如果没有surface,camera将无法打开预览。
6.
重要:调用startPreview()函数开始更新预览surface。预览必须在你照相前启动。
7. 在你想要捕获一张照片时,调用takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback)函数。等待回调函数中给出的实际图像数据。
8. 在照相后,预览显示将会停止。如果要照更多相片,需要再次调用startPreview()函数(回至第六步)。
9. 调用stopPreview()函数,停止更新预览surface。
10.
重要:调用release()函数,释放camera引用,以便其他应用使用。应用应当在onPause()调用时立刻释放camera引用(在onResume()时重新打开它)。
快速转换到视频录像模式,用以下步骤:
1. 如上所述,获取一个初始化好的Camera对象并开启预览。
2. 调用unlock()函数,以允许media进程得以访问camera。
3. 传递当前camera对象至setCamera(Camera)函数。请查看MediaRecorder关于视频录制的信息。
4. 当结束录制时,调用reconnect()函数重新取的和加锁camera对象。
5. 如上所述,调用stopPreview()和release()函数,结束拍摄。
这个类是线程不安全的,意味着是通过event线程使用的该类。大多数长时间运行的操作(预览、聚焦、拍照等)都是非同步的,并且是在需要的时候才会回调。而这些回调函数是在event线程open(int)函数被调用时触发的。所以,该类的方法一定不能在多线程内调用。
警告:不同的Android设备有不同的硬件规格,如兆像素等级和自动对焦性能。为了使你的应用和更多设备兼容,最好不要限制camera规格。
翻译自:官方SDK文档(无聊的紧啊==)。
二、照相
1)系统相机
1.1)调用方式
系统相机的入口Action:MediaStore.ACTION_IMAGE_CAPTURE。只需以startActivityForResult(…)启动该Activity即可。
1.2)处理方式
在onActivityResult(…)中,处理返回信息。
2)自定义相机
2.1)照相预览
继承SufaceView写自己的预览界面,继而放到你的照相Activity的布局里。可以写个照相监听接口,用于在Activity里处理这些照相操作。
2.2)照相活动
就是我们自己做的照相Activity了。完成后调用自己的相机,也就是跳转入这个Activity。而获得照片后,可以直接处理或者存入媒体库。
2.3)照相调用
以startActivityForResult(…)方式跳转入照相Activity,在拍完照片后setResult(…)返回。建议存入媒体库,将照片的uri返回。直接data数据的话,多拍时,是承受不了的==。
ps:Android给每个应用都设置了内存上限。系统层修改的话,参见博文《
如何修改Android应用程序能够使用的默认最大内存值》。
2.4)照相处理
在onActivityResult(…)中,处理返回信息。
三、摄像
1)系统摄像
系统摄像的入口Action:MediaStore.ACTION_VIDEO_CAPTURE。视频捕捉intent可以包含以下附带信息:
MediaStore.EXTRA_OUTPUT——本设置需要一个Uri,用于指定保存视频的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置值,那么摄像应用将会把所请求的视频以默认文件名和路径进行保存,并将数据置入intent的Intent.getData()部分返回。
MediaStore.EXTRA_VIDEO_QUALITY——本值用0表示最低品质及最小的文件尺寸,用1表示最高品质和较大的文件尺寸。
MediaStore.EXTRA_DURATION_LIMIT——本值用于限制所捕获视频的长度,以秒为单位。
MediaStore.EXTRA_SIZE_LIMIT——本值用于限制所捕获视频的文件尺寸,以字节为单位。
2)自定义摄像
2.1)流程简述
Android框架的视频捕捉需要对Camera对象进行仔细的管理,还要与MediaRecorder类一起协同工作。使用Camera录制视频时,必须管理好Camera.lock()与Camera.unlock()的调用,使得MediaRecorder能够顺利访问摄像头硬件,并且还要进行Camera.open()和Camera.release()调用。
注意:自Android 4.0 (API level 14) 开始,Camera.lock()和 Camera.unlock()调用由系统自动管理。
与用摄像头拍照不同,视频捕获必需十分精确地按顺序进行调用。必须按照特定的顺序来执行,应用程序才能成功地准备并捕获视频,详细步骤如下。
1.
打开摄像头——用Camera.open()来获得一个camera对象的实例。
2.
连接预览——用Camera.setPreviewDisplay()将camera连接到一个SurfaceView,准备实时预览。
3.
开始预览——调用 Camera.startPreview()开始显示实时摄像画面。
4.
开始录制视频——严格
按照以下顺序执行才能成功录制视频:
a.
解锁Camera——调用Camera.unlock()解锁,便于MediaRecorder使用摄像头。
b.
配置MediaRecorder——
按照如下顺序调用MediaRecorder中的方法。详情请参阅MediaRecorder参考文档。
1. setCamera()——用当前Camera实例将摄像头用途设置为视频捕捉。
2. setAudioSource()——用MediaRecorder.AudioSource.CAMCORDER设置音频源。
3. setVideoSource()——用MediaRecorder.VideoSource.CAMERA设置视频源。
4. 设置视频输出格式和编码格式。对于Android 2.2 (API Level 8) 以上版本,使用MediaRecorder.setProfile方法,并用CamcorderProfile.get()来获取一个profile实例。对于Android prior to 2.2以上版本,必须设置视频输出格式和编码参数:
i. setOutputFormat()——设置输出格式,指定缺省设置或MediaRecorder.OutputFormat.MPEG_4。
ii. setAudioEncoder()——设置声音编码类型。指定缺省设置或MediaRecorder.AudioEncoder.AMR_NB。
iii. setVideoEncoder()——设置视频编码类型,指定缺省设置或者 MediaRecorder.VideoEncoder.MPEG_4_SP。
5. setOutputFile()——用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()设置输出文件,见保存媒体文件一节中的方法示例。
6. setPreviewDisplay()——用上面
连接预览中设置的对象来指定应用程序的SurfaceView预览layout元素。
警告: 必须
按照如下顺序调用MediaRecorder的下列配置方法,否则应用程序将会引发错误,录像也将失败。
c.
准备MediaRecorder——调用MediaRecorder.prepare()设置配置,准备好MediaRecorder。
d.
启动MediaRecorder——调用MediaRecorder.start()开始录制视频。
5.
停止录制视频——
按照顺序调用以下方法,才能成功完成视频录制:
a.
停止MediaRecorder——调用MediaRecorder.stop()停止录制视频。
b.
重置MediaRecorder——这是可选步骤,调用MediaRecorder.reset()删除recorder中的配置信息。
c.
释放MediaRecorder——调用MediaRecorder.release()释放MediaRecorder。
d.
锁定摄像头——用Camera.lock()锁定摄像头,使得以后MediaRecorder session能够使用它。自Android 4.0 (API level 14)开始,不再需要本调用了,除非MediaRecorder.prepare()调用失败。
6.
停止预览——activity使用完摄像头后,应用Camera.stopPreview()停止预览。
7.
释放摄像头——使用Camera.release()释放摄像头,使其它应用程序可以使用它。
注意: 也可以不必先创建摄像头预览就使用MediaRecorder,并跳过本节开始的几步。不过,因为用户一般都希望在开始录像前看到预览画面,这里就不讨论那类过程了。
摘录自:后记->参阅内容1
2.2)摄像预览
摄像头预览类,用于嵌入一个View布局中。其实现了SurfaceHolder.Callback接口来捕捉view创建和销毁时的回调事件。
2.3)摄像活动
按官方开发者指南里的流程实现的(参阅2.1流程简述)。但这不同版本和硬件下有些问题==,在代码里有稍带说明。
ps:至于想要实现一个优秀的Camera摄像,请看后记->参阅内容2。
2.4)摄像调用
以startActivity (…)方式跳转入摄像Activity即可。当然也可以用startActivityForResult(…),在摄像完成后setResult(…)返回^^。
四、后记
1)参阅内容
1.1)SDK docs->Dev Guide->Multimedia and Camera->Camera
ps:译文亦收录在
Android中文翻译组->Android开发指南->框架主题->多媒体与摄像头->摄像头(好热情的一帮家伙==,大家都多多支持他们啊^^)
1.2)Camera摄像在不同版本不同硬件环境下不通用==
想实现更优秀的方式,请参考Sipdroid开源项目^^
Google Code:
http://code.google.com/p/sipdroid/
参考文件:org.sipdroid.sipua.ui包下的VideoPreview.java&VideoCamera*.java
ps:可以考虑学习下该开源项目,求入手分析资料啊T^T
2)模块概览
2.1)Camera照相
2.2)Camera摄像
3)运行效果
1)相机调用
2)自定义相机
3)摄像调用
4)自定义摄像
本文出自 “-_--___---_-” 博客,请务必保留此出处http://vaero.blog.51cto.com/4350852/834878