AVCaptureSession addOutput第二次运行需要很长时间

时间:2015-02-17 18:07:49

标签: ios avfoundation qr-code avcapturesession

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

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

addOutput:

所以往往会发生的情况是,当视图控制器第二次出现时,视频预览会立即出现,但是在摄像头指向扫描的QR码之前需要15秒或更长时间(因为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() }) } 占用这么长的时间)。它发生在一个单独的线程上,所以至少用户界面保持响应,但有没有办法解决addOutput:期间的长时间?我第一次扫描后没有正确清理吗?还有别的吗?

1 个答案:

答案 0 :(得分:1)

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

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

并使用它来代替获取AVFoundation的所有操作的全局队列:

dispatch_async(queue, {
    …
}