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 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术

几款效率神器助你走上人生巅峰之园友推荐

  在上篇文章中,我给大家推荐了我工作和生活中最常用的效率软件,引起了猿友的热烈反响,那么这篇文章,我们就来扒一扒猿友留言推荐的效率软件,望诸君笑纳~

1832
来自专栏*坤的Blog

Opera福利谷歌

2154
来自专栏Python爬虫实战

Python爬虫之五:抓取智联招聘基础版

运行平台: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome浏览器

1472
来自专栏FSociety

Python爬取猫眼「碟中谍」全部评论

昨天晚上看完碟中谍后,有点小激动,然后就有了这片文章。 我们将猫眼上碟中谍的全部评论保存下来,用于后期分析~ 总共评论3W条左右。

2893
来自专栏*坤的Blog

Opera福利谷歌

2853
来自专栏编程

高级运维工程师学习路线

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

4937
来自专栏张伟博客

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

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

5034
来自专栏Python与爬虫

抓取手机app的数据(摩拜单车)

前几天有人私信我,问能不能帮忙抓取摩拜单车的数据。。。 我想着授人以鱼不如授人以渔,所以本次我们就讲讲如何抓取手机app的内容吧 ? ?  Fiddle的安装...

46112
来自专栏张宁的专栏

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

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

1.9K1
来自专栏PHP在线

crontab设置定时任务

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

3558

扫码关注云+社区

领取腾讯云代金券