上图是使用捕捉功能时可能用到的一些类和它们的关系
捕捉会话捕捉设备
AVCaptureSession
管理类,连接输入输出
AVCaptureDevice
AVCaptureDevice 定义了大量的方法用于访问系统的捕捉设备(例如摄像头)提供了控制摄像头的对焦 白平衡 闪光灯....的方法。
捕捉输入AVCaptureDeviceInput
如最上图所示,AVCaptureDevice要装在一个AVCaptureDeviceInput里面才能添加到AVCaptureSession中
当创建AVCaptureDeviceInput对象的时候,系统会弹出警告框询问“是否允许使用摄像头”,这时候系统内部其实已经返回了一个AVCaptureDeviceInput对象,只是在用户同意之前,返回的是静音设备或者相机黑白帧,知道用户同意之后才正常工作。如果这时候用户点击不允许,则本次会话期间AVCaptureDeviceInput不会记录任何能容,下次重启app时候,AVCaptureDeviceInput创建时候会返回一个nil,然后就会收到NSError消息,这时候最好弹出一个提示框告诉用户。
捕捉输出AVCaptureStillImageOutput、 AVCaptureMovieFileOutput
如最上图所示,AVCaptureStillImageOutput和AVCaptureMovieFileOutput是抽象类AVCaptureOutput的高级扩展类,使用它们可以很容易的实现捕捉静态图片和视频的功能,也可以使用AVCaptureAudioDataOutput活着AVCaptureVideoDataOutput实现更高级也更底层的功能。
捕捉连接AVCaptureConnection
当把一个输入和输出添加到AVCaptureSession之后,
AVCaptureSession就会在输入、输出设备之间建立连接,而且通过AVCaptureConnection可以获取这个连接对象
捕捉预览AVCaptureVideoPreviewLayer
AVCaptureVideoPreviewLayer:相机拍摄预览图层,也是core animation的calayer子类,和AVPlayerLayer类似。能实时查看拍照或视频录制效 果,创建该对象需要指定对应的AVCaptureSession对象,因为AVCaptureSession包含视频输入数据,有视频数据才能展示。
最简单的demo
- (void)viewDidLoad {
[super viewDidLoad];
AVCaptureSession *session = [[AVCaptureSession alloc]init];
AVCaptureDevice *devive = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = [NSError errorWithDomain:NSLocalizedDescriptionKey code:1 userInfo:@{@"info":@"出错了"}];
AVCaptureDeviceInput *cameraInput = [AVCaptureDeviceInput deviceInputWithDevice:devive error:&error];
if ([session canAddInput:cameraInput]) {
[session addInput:cameraInput];
}
AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc]init];
if ([session canAddOutput:output]) {
[session addOutput:output];
}
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
layer.frame = self.view.frame;
[self.view.layer addSublayer:layer];
[session startRunning];
}
使用以上概念可以做出一个最简单的显示摄像头画面的demo: