AVCapture编程理解

  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及其使用模式

1 AVCaptureSession *session = [[AVCaptureSession alloc] init];
2
3 // Add inputs and outputs.
4
5 [session startRunning];

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

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

1 [session beginConfiguration];
2
3 // Remove an existing capture device.
4
5 // Add a new capture device.
6
7 // Reset the preset.
8
9 [session commitConfiguration];

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

三、AVCaptureDevice

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

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

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

1 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的属性更改,我们的做法通常是:

1 if([deviceisFocusModeSupported:AVCaptureFocusModeLocked])
2 {
3     //do configuring
4     [device unlockForConfiguration];
5 }
6 else
7 {
8     //Respond to the failure as appropriate.
9 }

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

 1 /*创建并配置输入设备*/
 2 AVCaptureDevice *device =
 3         [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
 4 NSError *error = nil;
 5
 6 AVCaptureDeviceInput *input =
 7         [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
 8
 9 //添加input到session的模式是(检查可否添加到session,然后根据情况添加或者不添加):
10 AVCaptureSession *captureSession = <#Get a capture session#>;
11
12 if ([captureSession canAddInput:input])
13 {
14     [captureSession addInput:captureDeviceInput];
15 }
16 else
17 {
18     //handle the failure.
19 }

五、output的分类和使用

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

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

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

AVCapture编程理解

时间: 2024-08-29 20:45:01

AVCapture编程理解的相关文章

[转]ios编程--AVCapture编程理解

[转]:http://blog.163.com/chester_lp/blog/static/139794082012119112834437/

rxjs学习(一)响应式编程理解

响应式编程理解 响应式编程是为了解决异步的问题,异步的问题是指因为回调导致的代码难以维护的问题,一般在非常多异步的项目中 这种问题会恶化 我们来思考一下异步的产生,异步是因为一个对象与另外一个对象交互,因为需要等待,所以增加回调函数处理等待结果,所以我们可以想象一下 假如一个系统中有10个对象,然后这些对象之间都会互相交互,而且还存在顺序的问题,当然最终代码肯定是可以写出来的,不过很难以维护,这不仅是回调的问题,加入a对象与b对象交互,那么我们把a对象和b对象用线连起来,表示他们之间的一段业务联

python网络编程理解

TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了. 为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite

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

通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2.向系统注册wndclass对象(RegisterClass): 3.CreateWindow创建窗口,获得窗口句柄Hwnd; 4.显示窗口(ShowWindow): 5.通过GetMessage函数不断获取系统消息,交给程序处理,程序过通回调函数(wndproc)处理系统消息.(消息处理部分)程序代

js异步编程理解

1.概念 同步:一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的.同步的.异步:每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的.异步的. 案例分析:欣多多去火车票代售窗口买票,现在该欣多多购票了,欣多多后面是小王珂,他也等着买票. 同步解析:欣多多:买一张明天到大理的火车票售票MM:对不起,明天到大理的火车票已经没有了欣多

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

一.NET框架 ADO.NET微软提供的一组类库,可以帮助程序员和数据库交互. CLS(公共语言规范) CTS(通用语言类型) 类库: 可以看成一个承载了N个类的容器. 类库和命名空间: 一个类库对应一个命名空间,也可以多个. 二.自动属性 public string name{set;get;} 应用场景: 当不用做逻辑判定是,可以使用自动属性. 三.封装 信息隐藏,将抽象的数据和操作结合在一起,将私有字段封装成公有属性. 1.保证数据的安全性. 2.提供清晰的对外接口. 3.类内部实现可以任

20150331 【娱乐】如果昨天是明天的话就好了 你怎样编程理解这道题?初试编程解题

http://www.askci.com/news/2015/02/02/104634om5v_all.shtml [发文说明]博客园是面向开发者的知识分享社区,不允许发布任何推广.广告.政治方面的内容.博客园首页(即网站首页)只能发布原创的.高质量的.能让读者从中学到东西的内容.如果博文质量不符合首页要求,会被工作人员移出首页,望理解.如有疑问,请联系[email protected]. [发文说明]博客园是面向开发者的知识分享社区,不允许发布任何推广.广告.政治方面的内容.博客园首页(即网站

Python并发编程理解yield from、协程

一.首页,认识一下可迭代,迭代器和生成器 可迭代,如:list,dict,tuple,deque等都是可迭代对象: 验证,需要借助collections.abc这个模块(python2中没有)使用isinstance()来类别一个对象是否是可迭代的(Iterable),是否是迭代器(Iterator),是否是生成器(Generator) 代码如下:import collections   from collections.abc import Iterable.Iterator.Generato

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

一.抽象类与接口的异同 接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下: type IFormattedNumber = interface //定义接口 function FormattedString: string; end; TFormattedNumber = class //定义抽象类 public function FormattedString: string; virtual; abstract; end; 上面定义了一个接口IForma