Android Camera简述

发布于 2020-01-09 09:39:35

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()开始录制视频。
  1. 停止录制视频——按照顺序调用以下方法,才能成功完成视频录制:
    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()调用失败。
  2. 停止预览——activity使用完摄像头后,应用Camera.stopPreview()停止预览。
  3. 释放摄像头——使用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

     原文:http://developer.android.com/guide/topics/media/camera.html
     译文:http://www.cnblogs.com/over140/archive/2011/11/16/2251344.html
     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照相
Camera照相
1.png

2.2)Camera摄像
Camera摄像
2.png

3)运行效果
1)相机调用
相机调用
3.png

2)自定义相机
自定义相机
4.png

3)摄像调用
摄像调用
5.png

4)自定义摄像
自定义摄像
6.png

0 条评论

发布
问题

官网
微信

官方微信