我的应用程序有一段代码,就是我收到了一个错误,我不知道问题出在哪里,当我打开设备相机并开始获取捕捉帧时,就会出现这个错误。奇怪的是,这是有效的,但在捕获开始的短时间或长时间内会出现以下错误。
错误:"线程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:你为什么首先在主线程上调度?