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. windows 下apache 以fastcgi形式执行php

    以xampp为例解说,过程例如以下: 1:下载相应的mod_fastcgi .下载參考站点:http://www.apachelounge.com/download/VC11/ 2:拷贝mod_fas ...

  2. linux中添加开机自启服务的方法

    往文件/etc/rc.d/rc.local中追加内容即可,如: /mongodb/start_mongoDB.sh

  3. Hibernate开发环境搭建

    一.下载Hibernate包的下载 官网地址:http://hibernate.org/orm/ 下载版本:hibernate-release-4.3.11.Final 二.Hibernate jar ...

  4. js实现图片的等比例缩放

      js实现图片的等比例缩放 CreateTime--2018年3月6日14:04:18 Author:Marydon 1.代码展示 /** * 图片按宽高比例进行自动缩放 * @param ImgO ...

  5. Unity 背包道具搜索

    因为背包有很多道具,用户要根据不同需要搜索出不同的道具.  道具的属性有非常居多,游戏快开发完毕的时候,突然发现ItemManager类里面几乎每一个搜索方法都有一个foreach循环, 循环里面因为 ...

  6. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境(转)

    前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装.部署和升级,非常 ...

  7. DRUPAL性能优化【转】

    1.启用memcache代替Mysql的缓存表处理缓存数据. 2.添加一个opcode缓存可以让 PHP能够重用前面编译过的代码,这样就会跳过解析和编译.常见的opcode缓存有Alternative ...

  8. 你不知道的js技巧

    JS进阶 说起这个应该算是老生常谈了吧.所谓的高级,其实就是讲了一些我们平常用不到(或许用了不知道),但是非常实在的东西.算是熟练掌握js的一个必经road吧. 检测函数类型 其实检测函数的类型应该算 ...

  9. Java Collection之Queue具体解释及用途

    Queue是一种常见的数据结构,其主要特征在于FIFO(先进先出),Java中的Queue是这样定义的: public interface Queue<E> extends Collect ...

  10. PHP拿到别人项目如何修改为自己

    以下为借助google翻译的,个人润色了一下,官方版里面感觉有很多问题,我这里有我个人修改大部分问题的版本,包括翻译完善,有需要的可以联系我:qyj8411@163.com 1. 在您网站的根目录创建 ...