我有一段我的应用程序的代码,我得到了错误,我不知道是什么问题,当我打开设备相机并开始获取捕获帧时会发生此错误。这里奇怪的是,这有效,但在捕获开始的短时间或长时间内得到以下错误。
错误:“线程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);
有什么想法吗?谢谢!
答案 0 :(得分:2)
我会说错误在这里:
dispatch_async(dispatch_get_main_queue(), ^{
[self imageToBuffer:sampleBuffer];
});
这个调用是异步调度的,据我所知,CMSampleBuffer
不一定要保留它们的内容(数据可能在样本缓冲区对象之前发布)。
确保在主队列上发送同步。
BTW:你为什么要首先在主线上发送?