iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪) [英] iOS 7 AVCaptureMetadataOutput delegate (QRCode scanner)

查看:374
本文介绍了iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用新的iOS 7功能实现QRCode扫描程序,但我的代码没有调用主 AVCaptureMetadataOutputObjectsDelegate 方法。

I'm trying to implement a QRCode scanner with the new iOS 7 features but my code isn't calling the main AVCaptureMetadataOutputObjectsDelegate method.

之前我使用过AVFoundation相机并使用我当前的实现我已经预览层运行没有问题。甚至将我的输出切换回 AVCaptureVideoDataOutput 验证我的会话设置。

I've used the AVFoundation camera before and with my current implementation I've got the preview layer running without a problem. Even switching my output back to AVCaptureVideoDataOutput validates my session setup.

我正在使用此NSHipster的帖子作为指南,这是我的代码到目前为止:

I'm using this NSHipster post as a guideline and here's my code so far:

界面:

@import AVFoundation;

@interface QRCodeViewController () <AVCaptureMetadataOutputObjectsDelegate>

@property (strong, nonatomic) AVCaptureDevice* device;
@property (strong, nonatomic) AVCaptureDeviceInput* input;
@property (strong, nonatomic) AVCaptureMetadataOutput* output;
@property (strong, nonatomic) AVCaptureSession* session;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer* preview;

@end

设置:

- (void)setupCamera
{
    // Device
    self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    // Input
    self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

    // Output
    self.output = [[AVCaptureMetadataOutput alloc] init];
    [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    // Session
    self.session = [[AVCaptureSession alloc] init];
    [self.session addInput:self.input];
    [self.session addOutput:self.output];

    // Preview
    self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    [self.view.layer insertSublayer:self.preview atIndex:0];

    // Start
    [self.session startRunning];
}

委托方法:

// DELEGATE METHOD NOT CALLED
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
    NSLog(@"Metadata");
}

非常感谢任何帮助!

推荐答案

我想弄清楚自己。 文档似乎说如果你没有在metadataObjectTypes中设置你想要的类型,你将不会得到任何调用。但我的iPad Mini的后置摄像头为availableMetadataObjectTypes返回一个空数组。让我们知道你的想法。

I am trying to figure this out myself. The documentation seems to say that if you don't set the type(s) you want in metadataObjectTypes, you won't get any calls. But my iPad Mini's back camera returns an empty array for availableMetadataObjectTypes. Let us know what you figure out.

编辑:

我只是想通了,如果你添加了AVCaptureMetadataOutput对象到会话,可以填充availableMetadataObjectTypes,您可以添加条形码检测器。然后将调用captureOutput委托,如下所示:

I just figured out that if you add the AVCaptureMetadataOutput object to the session, the availableMetadataObjectTypes gets filled in and you can add the barcode detector to it. Then the captureOutput delegate will get called, so like this:

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

这篇关于iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆