EXC_BAD_ACCESS in a random time after start a task



我的应用程序有一段代码,就是我收到了一个错误,我不知道问题出在哪里,当我打开设备相机并开始获取捕捉帧时,就会出现这个错误。奇怪的是,这是有效的,但在捕获开始的短时间或长时间内会出现以下错误。

错误:"线程1:EXC_BAD_ACCESS(代码=1,地址=0xN)",其中"N"是假设的十六进制内存地址。

代码:

- (void)imageToBuffer:(CMSampleBufferRef)source
{ 
  NSData *data;
  CVImageBufferRef buffer = CMSampleBufferGetImageBuffer(source);
  CVPixelBufferLockBaseAddress(buffer, 0);
  size_t bytesPerRow = CVPixelBufferGetBytesPerRow(buffer);
  size_t height = CVPixelBufferGetHeight(buffer);
  void *bufferSrc = CVPixelBufferGetBaseAddress(buffer);
  data = [NSData dataWithBytes:bufferSrc length:bytesPerRow * height];
  CVPixelBufferUnlockBaseAddress(buffer, 0);
  [self.delegate didReceivedFrame:data];
}
@end

#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate implementation
@implementation AVCaptureManager (AVCaptureVideoDataOutputSampleBufferDelegate)
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
  dispatch_async(dispatch_get_main_queue(), ^{
    [self imageToBuffer:sampleBuffer];
  });
}

此错误通常发生在以下行:

CVPixelBufferLockBaseAddress(buffer, 0);

有什么想法吗?谢谢

我想说错误就在这里:

dispatch_async(dispatch_get_main_queue(), ^{
  [self imageToBuffer:sampleBuffer];
});

这个调用是异步调度的,据我所知,CMSampleBuffer不一定会保留它们的内容(数据可能会在示例缓冲区对象之前发布)。

请确保在主队列上同步调度它。

BTW:你为什么首先在主线程上调度?

相关内容

最新更新