AVCaptureDevice 的输入与输出

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

原文链接:http://blog.csdn.net/shidongdong2012/article/details/21703251

0、媒体采集的几个东西。这里所需要明白的是,在这个流程中,这里会存在几个对象:
a、AVCaptureDevice。这里代表抽象的硬件设备。
b、AVCaptureInput。这里代表输入设备(可以是它的子类),它配置抽象硬件设备的ports。
c、AVCaptureOutput。它代表输出数据,管理着输出到一个movie或者图像。
d、AVCaptureSession。它是input和output的桥梁。它协调着intput到output的数据传输。

1、这些东东的关系。
高层面关系:
有很多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的数据传输。
2、Session及其使用模式
You use an instance to coordinate the flow of data from AV input devices to outputs. You add the capture devices and outputs you want to the session, then start data flow by sending the session a startRunning message, and stop recording by sending a stopRunning message.
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出来,此时我们就可以处理了。
3、谈谈AVCaptureDevice
InputDevice即是对硬件的抽象,一对一的。一个AVCaptureDevice对象,对应一个实际的硬件设备。
那么显然,我们可以通过AVCaptureDevice的类方法devices或devicesWithMediaType去获取全部或局部设备列表。(当然也可以检测相应的设备是否可以使用,这里注意有设备抢占问题,当前是否可用)
相机设备可以用下面的方法判断设备是否支持相关属性(property),比如对焦方式或者对焦状态Focus modes。
if([currentDevice isFocusModeSupported: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的属性更改,我们的做法通常是:
lock àsetà unlock
if([device isFocusModeSupported:AVCaptureFocusModeLocked])
//do configuring
[device unlockForConfiguration];
}
else{//Respond to the failure as appropriate.
4、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.}
5、output的分类和使用
在ios中,分为MovieFile、VideoData、AudioData和StillImage几种output,使用方式类似,只是范围不同。另外,它们都继承于AVCaptureOutput。
第一个是输出成movie文件,第二个适用于逐个Frame的处理,第三个适用于声音采集,第四个是still image(静态图像<拍照>)相关。

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

@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

时间: 2024-08-07 17:27:05

AVCaptureDevice 的输入与输出的相关文章

python入门(6)输入和输出

输出 >>> print 'hello, world' >>> print 'The quick brown fox', 'jumps over', 'the lazy dog' print会依次打印每个字符串,遇到逗号","会输出一个空格,因此,输出的字符串是这样拼起来的: >>> print 300 300 >>> print 100 + 200 300 因此,我们可以把计算100 + 200的结果打印得更漂亮

C++的输入和输出

C++是一种常用的编程语言.一个完整的程序至少要有一个输出,而我们也经常需要在程序内进行大量输入和输出.所以今天,我和大家谈一谈输入和输出. 1.cin和cout.可以连续输入,使用流(>>).有专门的输出的换行"endl". cin>>a>>b; cout<<"asdasdasd"<<endl; 2.scanf和printf.scanf和printf虽然需要占位符,不是很方便,而且容易因为系统影响在评测时

调用 get(fgetc) 和 putc(fputc) 函数进行输入、输出

当成功地打开文件后,接下来的事情就是对文件进行输入或输出操作,最简单的是调用 getc(或 fgetc) 和 putc(或 fputc) 函数进行字符的输入和输出. 1.调用 putc(或 fpuct) 函数输出一个字符 putc 函数的调用形式如下: putc(ch, fp); 这里 ch 是待输出的某个字符,它可以是一个字符常量,也可以是一个字符变量:fp 是文件指针.putc(ch, fp) 的功能是将字符 ch 写到文件指针 fp 所指的文件中去.如果输出成功,putc 函数返回所输出的

CString中Format函数与格式输入与输出

CString中Format函数与格式输入与输出 Format是一个很常用,却又似乎很烦的方法,以下是它的完整概貌,以供大家查询之用: 格式化字符串forma("%d",12)意思是将一个整形的格式化的字符(我认为是保持其形状不变) 1).格式说明总是以%字符开始,以下是不同类型数据的格式方式%号后的说明: d输出带符号十进制数 o输出无符号八进制数 x输出无符号十六进制数 u输出无符号数 c输出单个字符 s输出一串字符 f输出实数(6位小数) e以指数形式输出实数 g选用f与e格式中

c++文件输入输出流fstream,对输入&gt;&gt;和输出&lt;&lt;重载

1. fstream 继承自iostream --> 要包含头文件#include<fstream> 2. 建立文件流对象 3. 打开文件夹 4. 测试是否打开成功 5. 进行读写操作 6. 关闭文件 #include<iostream> #include<fstream> using namespace std; int main(){ ifstream ifile; ofstream ofile; ifile.open("d:\\fileIn.txt

C++ Primer Plus 第17章 输入,输出和文件

第17章 输入.输出和文件 1.当到达输入语句时,他将刷新输出缓冲区中当前所有的输出 2.streambuf类 提供了对缓冲区的各种操作 ios_base类表示流的一般特征 ios类基于ios_base,包含了一个指向streambuf对象的指针 ostream类从ios派生,提供可输出方法 istream类从ios派生,提供可输入方法 iostream类基于ostream和istream,继承了输入和输出方法 3.包含iostream则自动创建了8个流对象 cin 标准输入 wcin 宽字符流

第一天,数据的输入与输出,定义变量&#183;&#183;&#183;

初步应用vs2012这软件,语言选择c#   , 框架选择4(不要选择最前和太后的框架)然后改个名字和保存路径点确定就行了. 在main函数中写代码,大括号里面. 首先是最基本的输入与输出:  Console.WriteLine(");//直接会输出引号里面的内容(如果直接写入Write的话就不会换行.) Console.ReadLine();//让用户随意输入内容,按回车键结束,也可以用来防止程序闪退. 基本应用: Console.WriteLine("键盘敲烂,月入百万"

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

输入与输出,数据类型,强制转换,运算符

输入与输出 输出console.write();不换行 输出console.writeline();打印之后换行 输入console.read();不换行 输入console.readline();换行 字符串之间运用加号进行拼接,数字之间加号表示运算. 数据类型: int(整型)   long  double(双精度浮点数)  string(字符串型)  bool 强制转换: int a=covert.toint32(console.readline()); int a=int.parse(c