您的位置:首页 > 移动开发 > IOS开发

iOS AV Foundation 二维码扫描 02 扫码

2015-03-21 14:27 381 查看
AVFoundation支持以下一维和二维码的扫描:

QR code
Aztec
EAN13
EAN8
UPC-E
PDF417
Code 93
Code 39
Code 39 mode 41

QR code就是我们所熟知的二维码。

打开ViewController.m,添加以下实例变量:
AVCaptureMetadataOutput *_metadataOutput;
当从视频帧中检测到元数据时,AVCaptureMetadataOutput会调用应用程序的回调函数。AV Foundation支持两种类型的元数据:机器可读的编码和人脸识别。

添加以下代码到setupCaptureSession的最后来实现对元数据的捕捉和处理:

_metadataOutput = [[AVCaptureMetadataOutput alloc] init];
dispatch_queue_t metadataQueue = dispatch_queue_create("com.yaming.ColloQR.metadata", 0);
[_metadataOutput setMetadataObjectsDelegate:self queue:metadataQueue];

if([_captureSession canAddOutput:_metadataOutput])
{
[_captureSession addOutput:_metadataOutput];
}
这里,我们首先创建AVCaptureMetadataOutput的实例,然后为其创建一个dispatch queue,这样避免在回调函数被调用时,阻塞主线程。

接下来,声明本类遵循AVCaptureMetadataOutputObjectsDelegate协议:

@interface ViewController () <AVCaptureMetadataOutputObjectsDelegate>
实现代理方法:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
[metadataObjects enumerateObjectsUsingBlock:^(AVMetadataObject *obj,
NSUInteger idx,
BOOL *stop)
{
NSLog(@"Metadata: %@", obj);
}];
}
每当AVCaptureMetadataOutput类检测到新的元数据时,调用captureOutput方法,在captureOutput方法中,我们打印所有检测到的元数据。

修改startRunning方法,在最后添加如下代码:

_metadataOutput.metadataObjectTypes = _metadataOutput.availableMetadataObjectTypes;
这样做的目的是设置要检测的元数据类型为所有类型。

编译运行,扫描以下二维码将得到如下输出:



2015-03-21 14:51:42.289 ColloQR[680:176124] Metadata: <AVMetadataMachineReadableCodeObject: 0x170221540, type="org.iso.QRCode", bounds={ 0.4,0.2 0.1x0.3 }>corners { 0.4,0.5 0.5,0.5 0.5,0.2 0.4,0.2 }, time 31026866447458, stringValue "iOS二维码扫描"
这样我们就完成了使用AV Foundation进行二维码扫描的功能。从log中可以看到,有bounds和conrners信息,下一节我们将利用这个信息,当扫码成功时,为用户提供可视的反馈。

转载请注明出处:/article/9358089.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: