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

前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda:

  • Camera拍照
  • 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)

新旧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。

Camera自定义相机

CameraSample代码如下: MainActivity.java

SurfacePreview.java

activity_main.xml

效果图:

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

代码较多,不一一贴出,阅读原文可看代码

对应效果图:

从效果图上看出,新API功能更强大,拍照效果更好。 以上两个自定义相机案例完整下载地址: https://github.com/hejunlin2013/MultiMediaSample

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2016-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

虚拟内存管理请求分页存储管理方式

2967
来自专栏张宁的专栏

反爬虫和抗DDOS攻击技术实践

企鹅媒体平台媒体名片页反爬虫技术实践,分布式网页爬虫技术、利用人工智能进行人机识别、图像识别码、频率访问控制、利用无头浏览器PhantomJS、Selenium...

1.8K1
来自专栏编程

高级运维工程师学习路线

信息安全公益宣传,信息安全知识启蒙。 ? 运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎...

4147
来自专栏腾讯Bugly的专栏

《iOS APP 性能检测》

| 导语 最近组里在做性能优化,既然要优化,就首先要有指标来描述性能水平,并且可以检测到这些指标,通过指标值的变化来看优化效果,于是笔者调研了iOS APP性能...

1.4K5
来自专栏极客猴

爬取网易云音乐精彩评论

故事的小黄花 从出生那年就飘着 童年的荡秋千 随记忆一直晃到现在 Re So So Si Do Si La So La Si Si Si Si La Si L...

1042
来自专栏PHP在线

crontab设置定时任务

基本格式 : *  *  *  *  *  command 分 时 日 月 周 命令 第1列表示分钟1~59 每分钟用*或者 */1表示 第2列表示小时...

3508
来自专栏我爱编程

9行代码实现YouTube视频批量下载

仔细分析视频url的结构可以发现,最重要的是一个11位的videoId (不一定全都是11位)。并且可以发现videoId是由字母A-Za-z数字0-9和符号-...

6274
来自专栏张伟博客

多合一收款二维码合并原理及源码-支持支付宝、微信、QQ

最近去超市看到好多商户一个二维码同时支持支付宝、微信、QQ扫描付款,所以回来自己上网研究了一下。整理了一个现成的源码,有需要的朋友可以下载自己研究下。

3394
来自专栏*坤的Blog

Opera福利谷歌

1794
来自专栏州的先生

Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

2172

扫码关注云+社区