一、基本概念
AVCaptureSession
苹果为了管理从摄像头、麦克风等设备捕获到的信息,写了一个AVCaptureSession的类来对输入和输出数据进行管理。AVFoundation官方文档
二、详细对象的介绍
1、AVCaptureSession
AVCaptureSession对象是用来管理采集和输出数据的,它负责协调从哪里采集数据,之后再输出到哪里。
2、 AVCaptureDevice
一个AVCaptureDevice对象代表一个物理采集设备,我们可以通过该对象来设置物理设备的属性。
3、AVCaptureInput
AVCaptureInput是AVCaptureSession的一个抽象类,AVCaptureSession的输入端必须是AVCaptureInput的实现类。这里我们用到的AVCaptureDeviceInput,作为采集设备输入端。
4、AVCaptureOutput
AVCaptureOutput是AVCaptureSession的一个抽象类,AVCaptureSession的输出端必须是AVCaptureOutput的实现类。这里我们用到的AVCaptureVideoDataOutput,作为视频数据的输出端。
5、AVCaptureConnection
AVCaptureConnection是AVCaptureSession用来建立和维护AVCaptureInput和AVCaptureOutput之间的连接的。
6、 AVCaptureVideoPreviewLayer
AVCaptureVideoPreviewLayer是AVCaptureSession的一个属性,集成自CALayer,通过类名我们可以知道这个layer是用来预览采集到的视频图像的,直接把这个layer加到UIView上面就可以实现采集道德视频实时预览了哦。_
三、视频采集の步骤
1、建立并初始化输入AVCaptureInput和AVCaptureOutput。
2、创建并初始化AVCaptureSession,然后把AVCaptureInput、AVCaptureOutput添加到AVCaptureSession中。
3、调用AVCaptureSession的startRunning开始采集。
四、初始化输入(摄像头camera)
通过AVCaptureDevice的devicesWithMediaType:方法获取摄像头,iPhone有前后摄像头,此处获取的是一个设备的数组,然后从数组里面拿到我们想要的前后摄像头,然后再将AVCaptureDevice转化为AVCaptureDeviceInput,用于添加到AVCaptureSession中。
// 获取所有摄像头
NSArray *cameras= [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
// 获取前置摄像头
NSArray *captureDeviceArray = [cameras filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"position == %d", AVCaptureDevicePositionFront]];
if (!captureDeviceArray.count)
{
NSLog(@"获取前置摄像头失败");
return;
}
// 转化为输入设备
AVCaptureDevice *camera = captureDeviceArray.firstObject;
NSError *errorMessage = nil;
self.captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:camera error:&errorMessage];
if (errorMessage)
{
NSLog(@"AVCaptureDevice转AVCaptureDeviceInput失败");
return;
}
注释:
1、captureDeviceArray.firstObject第一个数据就是前置摄像头,如果是lastObject那么就是后置摄像头。
2、errorMessage用于获取异常。
五、初始化输出
1、初始化视频输出,设置视频数据格式,设置采集数据的回调线程。
2、下面视频输出格式选的是kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,YUV数据格式。
重要单词:
Capture 英['kæptʃə] 美 ['kæptʃɚ] n.捕获、俘虏 vt.俘获、获得
网友评论