iOS 7 AVCaptureMetadataOutput委托(QRCode扫描仪)

时间:2013-09-25 02:30:12

标签: ios avfoundation ios7 qr-code avcapturesession

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

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

我正在使用此NSHipster post作为指导原则,到目前为止这是我的代码:

接口

@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");
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:36)

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

编辑:

我刚才发现,如果将AVCaptureMetadataOutput对象添加到会话中,则会填充availableMetadataObjectTypes,您可以向其添加条形码检测器。然后将调用captureOutput委托,如下所示:

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

答案 1 :(得分:1)

iOS 10 对我造成了同样的问题。我目前在WWDC 2016上发布了开发人员版本。当我在iOS 9手机上运行应用程序时,再次调用了captureOutput:didOutputMetadataObjects:方法。