【问题标题】:AVCaptureSession addOutput takes very long time second time runningAVCaptureSession addOutput 第二次运行需要很长时间
【发布时间】:2015-02-17 18:07:49
【问题描述】:

在我的应用程序中,我有一个 QR 码扫描仪,它使用 AVFoundation 显示扫描预览并读取代码数据。出于某种原因,在视图控制器(管理捕获会话)第二次出现时,将用于 QR 读取的 AVCaptureMetadataOutput 添加到 AVCaptureSession 需要 非常 长时间。另一方面,它第一次出现时,视图控制器几乎可以在一秒钟内设置捕获会话、输入和输出。但是下一次,它会卡在AVCaptureSessionaddOutput: 上大约 15-20 秒,然后才最终返回。

管理 QR 扫描会话的视图控制器如下所示:

init() {
    session = AVCaptureSession()
}

func viewDidLoad() {
    dispatch_async(dispatch_get_global_queue(0, 0), {

        // Handle video input...

        let videoDevice = /* get AVCaptureDevice */

        self.videoDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(videoDevice, error: nil)

        self.session.addInput(videoDeviceInput)


        // Handle QR code output...

        self.metadataOutput = AVCaptureMetadataOutput()

        self.metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())

        self.session.addOutput(metadataOutput) /* takes 15 to 20 seconds after first time */

        self.metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode]

    })
}

func viewWillAppear(animated: Bool) {
    dispatch_async(dispatch_get_global_queue(0, 0), {
        self.session.startRunning()
    })
}

func viewWillDisappear(animated: Bool) {
    dispatch_async(dispatch_get_global_queue(0, 0), {
        self.session.stopRunning()
    })
}

所以往往会发生的是,当视图控制器第二次出现时,视频预览会立即出现,但需要 15 秒或更长时间才能扫描到相机指向的 QR 码(因为addOutput: 采取了这样的很久)。它发生在一个单独的线程上,因此至少用户界面保持响应,但是有没有办法修复addOutput: 的长时间?第一次扫描后我没有正确清理吗?还有别的吗?

【问题讨论】:

    标签: ios avfoundation qr-code avcapturesession


    【解决方案1】:

    我不知道为什么,但看起来花了这么长时间的原因是因为我使用的是dispatch_get_global_queue(0, 0)。相反,我创建了自己的队列:

    let queue = dispatch_queue_create("com.myApp.avfoundation", nil)
    

    并使用它而不是使用 AVFoundation 为所有操作获取全局队列:

    dispatch_async(queue, {
        …
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-21
      • 2021-05-23
      • 2019-04-15
      • 2022-01-13
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      相关资源
      最近更新 更多