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];
            }

在此示例中,我创建了一个串行队列。