iOS AV Foundation 二维码扫描 02 扫码

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信息,下一节我们将利用这个信息,当扫码成功时,为用户提供可视的反馈。

转载请注明出处:http://blog.csdn.net/yamingwu/article/details/44515625

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。