• 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

  • 相关阅读:
    磁盘分区,fdisk,gdisk,开机自动挂载,swap分区,修复文件系统,备份文件
    进程脱离窗口运行,僵尸、孤儿进程
    top命令、kill命令
    进程状态
    rpm包、挂载、yum命令
    DRF源码分析
    forms组件源码
    Django CBV源码分析
    魔法方法
    鸭子类型
  • 原文地址:https://www.cnblogs.com/sight/p/2453671.html
Copyright © 2020-2023  润新知