【发布时间】:2014-10-02 12:13:37
【问题描述】:
当使用 AVCaptureVideoDataOutput 并使用调度队列 (setSampleBufferDelegate:queue) 定义样本缓冲区委托时,我们在 iOS 8 上遇到 AVFoundation 不会将样本缓冲区发布到指定的调度队列,而是始终使用“com.apple. avfoundation.videodataoutput.bufferqueue"。
这在 iOS7 上按预期工作。
有其他人经历过吗?
一个明显的解决方法是在回调中手动调用 dispatch_sync 以将处理同步到自定义调度队列,但是奇怪的是,这会导致死锁......
产生此问题的示例代码:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
AVCaptureSession *session = [[AVCaptureSession alloc] init];
session.sessionPreset = AVCaptureSessionPresetMedium;
AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
captureVideoPreviewLayer.frame = self.view.bounds;
[self.view.layer addSublayer:captureVideoPreviewLayer];
[session addInput:[AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo] error:nil]];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
queue = dispatch_queue_create("our.dispatch.queue", DISPATCH_QUEUE_SERIAL);
[output setSampleBufferDelegate:self queue:queue];
[session addOutput:output];
[session startRunning];
}
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
NSLog(@"Running on queue %@, queue that was set is %@, this is %s", dispatch_get_current_queue(),
[captureOutput performSelector:@selector(sampleBufferCallbackQueue)],
queue == dispatch_get_current_queue() ? "our queue" : "not our queue!!!");
}
【问题讨论】:
标签: ios ios8 avfoundation grand-central-dispatch avcapturesession