核心类
AVCaptureDevice音频或视频捕获设备
AVCaptureDeviceInput 提供从捕获设备到捕获会话的媒体
AVCaptureSession 捕获会话,管理捕获活动并连接输入到输出数据流
AVCaptureMetadataOutput用于处理元数据的捕获输出,例如人脸识别及二维码
第一步:初始化
1.创建AVCaptureSession并设置质量
self.captureSession = [[AVCaptureSession alloc] init];
self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;
2.创建视频输入设备及捕获媒体
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *videoInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:error];
3.添加视频输入捕获媒体
[self.captureSession addInput:videoInput];
4.创建捕获输出AVCaptureMetadataOutput并添加到当前会话
self.metadataOutput = [[AVCaptureMetadataOutput alloc] init];
[self.captureSession addOutput:self.metadataOutput];
5.设置metadataObjectTypes,这个属性用来区分捕获的类型,例如人脸识别和二维码
人脸识别:
self.metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeFace];
二维码:
**self**.metadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeAztecCode, AVMetadataObjectTypeUPCECode]
6.设置AVCaptureMetadataOutputObjectsDelegate代理和捕获队列
[self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
第二步:启动会话
[self.captureSession startRunning];
第三步:创建预览图层,并设置AVCaptureSession会话
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layer];
[layer setSession:session];
第四步:处理捕获的数据,通过如下的代理方法进行处理
- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray< __kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection
我们需要的数据包含在metadataObjects数组里
如果是二维码,包含的是AVMetadataMachineReadableCodeObject类型,通过stringValue属性可以拿到我们想要的二维码数据
如果是人脸识别,包含的是AVMetadataFaceObject类型,通过faceID可以拿到人脸ID,通过bounds属性可以拿到人脸坐标,但是在这之前需要通过相机坐标和屏幕坐标的转换
如果我们需要获取到二维码或人脸识别结果的屏幕坐标,则需要通过AVCaptureVideoPreviewLayer的transformedMetadataObjectForMetadataObject方法进行坐标转换