• Android Camera简述转载 邹


     
            好吧,别人的分析都是系统层面的==,我这算是酱油文章么?默默路过T^T。
     
    一、Camera

             package android.hardware

     
             该类用于设定图像捕获设置,开启/关闭预览,抓拍图片以及获取帧用于编码视频。这个类是Camera服务的客户端,用于管理真实的照相机硬件。

             为了能够访问照相机,你必须在你的Android Manifest内声明CAMERA权限。同时确保包括了<uses-feature>节点元素,来声明你所使用的camera功能。例如,如果你使用了照相机的自动对焦功能,你的Manifest应当包括以下内容:

    1. <uses-permission android:name="android.permission.CAMERA" /> 
    2. <uses-feature android:name="android.hardware.camera" /> 
    3. <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照相

    Camera照相

     
    2.2)Camera摄像

    Camera摄像

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

    相机调用

     
    2)自定义相机

    自定义相机

     
    3)摄像调用

    摄像调用

     
    4)自定义摄像

    自定义摄像

    本文出自 “-_--___---_-” 博客,请务必保留此出处http://vaero.blog.51cto.com/4350852/834878

  • 相关阅读:
    第三方驱动备份与还原
    Greenplum 解决 gpstop -u 指令报错
    yum安装(卸载)本地rpm包的方法(卸载本地安装的greenplum 5.19.rpm)
    Java JUC(java.util.concurrent工具包)
    netty 详解(八)基于 Netty 模拟实现 RPC
    netty 详解(七)netty 自定义协议解决 TCP 粘包和拆包
    netty 详解(六)netty 自定义编码解码器
    netty 详解(五)netty 使用 protobuf 序列化
    netty 详解(四)netty 开发 WebSocket 长连接程序
    netty 详解(三)netty 心跳检测机制案例
  • 原文地址:https://www.cnblogs.com/sight/p/2453671.html
Copyright © 2020-2023  润新知