【问题标题】:iOS 7 AVCaptureMetadataOutput delegate (QRCode scanner)iOS 7 AVCaptureMetadataOutput 委托(二维码扫描器)
【发布时间】:2013-09-25 02:30:11
【问题描述】:

我正在尝试使用新的 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");
}

非常感谢任何帮助!

【问题讨论】:

    标签: ios avfoundation ios7 qr-code avcapturesession


    【解决方案1】:

    我正在尝试自己解决这个问题。 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];
    

    【讨论】:

    • 太棒了,先生!作为一个如此快速的自学者,额外的荣誉。我预计,一旦更多地参与 iOS 7 的新功能,许多开发人员会发现您的回答非常有用。
    • 我一想就明白了——在元数据对象与设备关联之前,显然无法知道元数据。
    • 如果有人感兴趣,我将我的小示例项目放在 github 上:github.com/kpmiller/ios7-barcode
    • @NedZepplin 你用它成功识别任何条码了吗?我尝试在 iPad 3 上识别 QR 和 PDF417,但没有成功(我使用了适当的元数据)。
    • @NedZepplin:我怎样才能只捕获 QRCode 的一张静止图像并进行处理?
    【解决方案2】:

    iOS 10 给我带来了同样的问题。我目前在 WWDC 2016 上发布了开发者版。当我在装有 iOS 9 的手机上运行该应用程序时,再次调用了 captureOutput:didOutputMetadataObjects: 方法。

    【讨论】:

    • 检查availableMetadataObjectTypes,iOS 10可以为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多