HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iOS 8上的AVCaptureVideoDataOutput不会在指定的调度队列上发布样本缓冲区大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当使用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!!!");
}

解决方法

这里可能发生的是他们的队列com.apple.avfoundation.videodataoutput.bufferqueue已设置为使用dispatch_set_target_queue定位你的队列.这在功能上等同于调度到您的队列,但会解释名称,并且还会在您尝试调度回队列时解释死锁.

换句话说,仅仅因为队列名称不等于队列的名称并不意味着块没有在队列上执行.

大佬总结

以上是大佬教程为你收集整理的iOS 8上的AVCaptureVideoDataOutput不会在指定的调度队列上发布样本缓冲区全部内容,希望文章能够帮你解决iOS 8上的AVCaptureVideoDataOutput不会在指定的调度队列上发布样本缓冲区所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。