CVPixelBufferUnlockBaseAddress - 块 UI
CVPixelBufferUnlockBaseAddress - Block UI
我正在努力调试一个奇怪的问题。在 CVPixelBufferUnlockBaseAddress(imageBuffer,0);
之后的 captureOutput:didOutputSampleBuffer:fromConnection:
中,整个 UI 停止响应触摸。相机预览有效,但我所有的按钮都停止响应,我什至添加了一个 UITapGesture,但也不起作用。我试着把它放入派单中,但仍然没有成功。
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
if (state != CAMERA) {
return;
}
if (self.state != CAMERA_DECODING)
{
self.state = CAMERA_DECODING;
}
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
//Lock the image buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);
//Get information about the image
baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0);
int pixelFormat = CVPixelBufferGetPixelFormatType(imageBuffer);
switch (pixelFormat) {
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
//NSLog(@"Capture pixel format=NV12");
bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
width = bytesPerRow;//CVPixelBufferGetWidthOfPlane(imageBuffer,0);
height = CVPixelBufferGetHeightOfPlane(imageBuffer,0);
break;
case kCVPixelFormatType_422YpCbCr8:
//NSLog(@"Capture pixel format=UYUY422");
bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
width = CVPixelBufferGetWidth(imageBuffer);
height = CVPixelBufferGetHeight(imageBuffer);
int len = width*height;
int dstpos=1;
for (int i=0;i<len;i++){
baseAddress[i]=baseAddress[dstpos];
dstpos+=2;
}
break;
default:
// NSLog(@"Capture pixel format=RGB32");
break;
}
unsigned char *pResult=NULL;
int resLength = MWB_scanGrayscaleImage(baseAddress,width,height, &pResult);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
可能是因为您正在运行主线程上执行所有操作。
为会话创建输出,您有机会 运行 另一个队列上的回调:
AVCaptureVideoDataOutput * dataOutput = [[AVCaptureVideoDataOutput alloc] init];
[dataOutput setAlwaysDiscardsLateVideoFrames:YES];
[dataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
dispatch_queue_t queue = dispatch_queue_create("it.CloudInTouchLabs.avsession", DISPATCH_QUEUE_SERIAL);
[dataOutput setSampleBufferDelegate:(id)self queue:queue];
if ([captureSession_ canAddOutput:dataOutput]) {
[captureSession_ addOutput:dataOutput];
}
在此示例中,我创建了一个串行队列。
我正在努力调试一个奇怪的问题。在 CVPixelBufferUnlockBaseAddress(imageBuffer,0);
之后的 captureOutput:didOutputSampleBuffer:fromConnection:
中,整个 UI 停止响应触摸。相机预览有效,但我所有的按钮都停止响应,我什至添加了一个 UITapGesture,但也不起作用。我试着把它放入派单中,但仍然没有成功。
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
if (state != CAMERA) {
return;
}
if (self.state != CAMERA_DECODING)
{
self.state = CAMERA_DECODING;
}
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
//Lock the image buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);
//Get information about the image
baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0);
int pixelFormat = CVPixelBufferGetPixelFormatType(imageBuffer);
switch (pixelFormat) {
case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
//NSLog(@"Capture pixel format=NV12");
bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
width = bytesPerRow;//CVPixelBufferGetWidthOfPlane(imageBuffer,0);
height = CVPixelBufferGetHeightOfPlane(imageBuffer,0);
break;
case kCVPixelFormatType_422YpCbCr8:
//NSLog(@"Capture pixel format=UYUY422");
bytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer,0);
width = CVPixelBufferGetWidth(imageBuffer);
height = CVPixelBufferGetHeight(imageBuffer);
int len = width*height;
int dstpos=1;
for (int i=0;i<len;i++){
baseAddress[i]=baseAddress[dstpos];
dstpos+=2;
}
break;
default:
// NSLog(@"Capture pixel format=RGB32");
break;
}
unsigned char *pResult=NULL;
int resLength = MWB_scanGrayscaleImage(baseAddress,width,height, &pResult);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
可能是因为您正在运行主线程上执行所有操作。
为会话创建输出,您有机会 运行 另一个队列上的回调:
AVCaptureVideoDataOutput * dataOutput = [[AVCaptureVideoDataOutput alloc] init];
[dataOutput setAlwaysDiscardsLateVideoFrames:YES];
[dataOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];
dispatch_queue_t queue = dispatch_queue_create("it.CloudInTouchLabs.avsession", DISPATCH_QUEUE_SERIAL);
[dataOutput setSampleBufferDelegate:(id)self queue:queue];
if ([captureSession_ canAddOutput:dataOutput]) {
[captureSession_ addOutput:dataOutput];
}
在此示例中,我创建了一个串行队列。