AVCapture用于媒体采集,在媒体采集的流程中,会存在如下几个对象:

  • AVCaptureDevice。这里代表抽象的硬件设备。
  • AVCaptureInput。这里代表输入设备(可以是它的子类),它配置抽象硬件设备的ports。
  • AVCaptureOutput。它代表输出数据,管理着输出到一个movie或者图像。
  • AVCaptureSession。它是input和output的桥梁。它协调着intput到output的数据传输。

一、它们之间的关系

  有很多Device的input,也有很多类型的Output,都通过一个Capture Session来控制进行传输。即:CaptureDevice适配AVCaptureInput,通过Session来输入到AVCaptureOutput中。这样也就达到了从设备到文件等持久化传输的目的(如从相机设备采集图像到UIImage中)。

  【注意】:这里的关系是可以通过唯一一个Capture Session来同时控制设备的输入和输出。

  那么存在一个问题了:视频输入(input)就对应视频的输出(output),而音频输入就应对应音频的输出,因而需要建立对应的Connections,来各自连接它们。而这样的连接对象,是由AVCaptureSession来持有的,这个对象叫AVCaptureConnection。

  在一个ACCaptureConnection中,这里维持着对应的数据传输输入到数据输出的过程(detail过程)。这里,AVCaptureInput或其子类对象包含着各种input port,通过各种input port,我们的AVCaptureOutput可以获取到相应的数据。

  一个ACCaptureConnection可以控制input到output的数据传输。

二、Session及其使用模式

 AVCaptureSession *session = [[AVCaptureSession alloc] init];

 // Add inputs and outputs.

 [session startRunning];

  这里表明了,需要create一个session,然后发running消息给它,它会自动跑起来,把输入设备的东西,提交到输出设备中。

  若想在一个已经使用上的session中(已经startRunning了)做更换新的device、删除旧的device等一系列操作,那么就需要使用如下方法来进行处理:

 [session beginConfiguration];

 // Remove an existing capture device.

 // Add a new capture device.

 // Reset the preset.

 [session commitConfiguration];

  当然,如果session发生了异常,那么我们可以通过notification去observe相关的事件(可以在AVCaptureSession Class Reference中的Nofications中找到相应的情况),而session如果出现相应问题时,它会post出来,此时我们就可以处理了。

三、AVCaptureDevice

  InputDevice即是对硬件的抽象,一对一的。一个AVCaptureDevice对象,对应一个实际的硬件设备。

  那么显然,我们可以通过AVCaptureDevice的类方法devices或devicesWithMediaType去获取全部或局部设备列表。(当然也可以检测相应的设备是否可以使用,这里注意有设备抢占问题,当前是否可用)

相机设备可以用下面的方法判断设备是否支持相关属性(property),比如对焦方式或者对焦状态Focus modes。

 if([currentDeviceisFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus])

  此外,设置对焦点CGPoint时,需要注意位置:

  a CGPoint where {0,0} represents the top left of the picture area, and{1,1} represents the bottom right in landscape mode with the home button on the right。

  当我们需要对一个设备的属性进行观察,我们可以使用KVO来处理。(为啥观察,比如我们需要知道设备此时是否正在对焦or已经停止了对焦)

  对于一个device的属性更改,我们的做法通常是:

 if([deviceisFocusModeSupported:AVCaptureFocusModeLocked])
{
//do configuring
[device unlockForConfiguration];
}
else
{
//Respond to the failure as appropriate.
}

四、CaptureInput的构建和添加到Session中的方法

 /*创建并配置输入设备*/
AVCaptureDevice *device =
[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil; AVCaptureDeviceInput *input =
[AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; //添加input到session的模式是(检查可否添加到session,然后根据情况添加或者不添加):
AVCaptureSession *captureSession = <#Get a capture session#>; if ([captureSession canAddInput:input])
{
[captureSession addInput:captureDeviceInput];
}
else
{
//handle the failure.
}

五、output的分类和使用

  在ios中,分为MovieFile、VideoData、AudioData和StillImage几种output,使用方式类似,只是范围不同。另外,它们都继承于AVCaptureOutput。

  第一个是输出成movie文件,第二个适用于逐个Frame的处理,第三个适用于声音采集,第四个是still image(静态图像<拍照>)相关。

  它们的添加方式都是使用session的addOutput方法。

AVCapture编程理解的更多相关文章

  1. JavaScript 面向对象编程 · 理解对象

    前言:      在我们深入 面向对象编程之前 ,让我们先理解一下Javascript的 对象(Object),我们可以把ECMAScript对象想象成散列表,其值无非就是一组名值对,其中值可以是数据 ...

  2. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  3. 经典C#编程理解,概要,经典

    一.NET框架 ADO.NET微软提供的一组类库,可以帮助程序员和数据库交互. CLS(公共语言规范) CTS(通用语言类型) 类库: 可以看成一个承载了N个类的容器. 类库和命名空间: 一个类库对应 ...

  4. Java并发编程--理解ThreadLocal

    另一篇博文:Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文参考:http://blog.csdn.net ...

  5. 【05】js异步编程理解

    1.概念 同步:一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的.同步的.异步:每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务, ...

  6. 深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现

    一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 fu ...

  7. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  8. python3之面向对象编程理解

    面向对象主要有三个特征:封装,继承,多态度. 一.封装 定义类语 class Animal(): class为定义类的关键字,后面跟名字(): python命名规范建议:类一般首字母单词大写,属性变量 ...

  9. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

随机推荐

  1. springMVC配置静态资源访问的<mvc:resources>标签的使用

    在springmvc中,为了引用资源的访问不会类似Controller一样被拦截,区分出关注的资源的访问,一般我们在springMVC里面的拦截都会配置为"/",拦截所有的.但是这 ...

  2. 【笔记】探索js 的this 对象 (第一部分)

    最近在看 你不知道的javascript 这本书,在第二部分看到了一个比较重要的知识点 那就是 this对象的全面认识,于是做一下笔记 博主本人在看这本书之前也一直以为 this 是指一切引用类型的本 ...

  3. JVM基础(1)——内存模型

    转载:http://blog.csdn.net/weitry/article/details/53264262 系列文章规划: JVM基础(1)——内存模型 JVM基础(2)——内存管理 JVM基础( ...

  4. Uber 四年时间增长近 40 倍,背后架构揭秘

    据报道,Uber 仅在过去4年的时间里,业务就激增了 38 倍.Uber 首席系统架构师 Matt Ranney 在一个非常有趣和详细的访谈<可扩展的 Uber 实时市场平台>中告诉我们 ...

  5. Linux配置快捷方式路径

    快就一个字,我只说一次! 1.命令顺序: a)       先输入 cd / b)      gedit /etc/profile c)       最后添加路径,看到蓝色部分的没? 把/home更换 ...

  6. Hibernate关系映射(一) 基于外键的单向一对一

    模拟用户和地址的映射关系,一个用户只有一个地址,用户知道地址,但是地址不知道用户.用户对地址的单向一对一映射. 一.建立实体类 Account.cs类 package com.lxit.entity; ...

  7. 算法笔记_064:蓝桥杯练习 操作格子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求 ...

  8. 约瑟夫环 java实现

    问题: N个人从1到N编号.围城一圈,从1開始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再開始报数,直到全部人都出去 思路: 就是计数.移除,没有太深的思想,直接上代码: pack ...

  9. Vim快捷键整理

    Vim主要分为两种模式一种是Insert模式,该模式下可以像其它文本编辑器一样正常输入字符:另一种是Normal模式,该模式下Vim监听用户的按键可以对文本进行快速修改. 想要从Insert模式切换到 ...

  10. DevOps,不是一个传说!

    转自: http://www.infoq.com/cn/articles/devops-not-legend DevOps最近成了热词,望文生义,你也能猜个八九不离十,它就是在说"研发团队& ...