CMSampleBufferGetImageBuffer возвращает ноль для захваченного JPEG stillImage - PullRequest
0 голосов
/ 18 января 2019

Я работаю над захватом экрана Mac в формате JPEG, а затем получаю pixelBuffer и imageBuffer захваченного сэмплебуфера JPEG. Но pixelBuffer всегда равен нулю, а когда я конвертирую буфер JPEG в NSImage, изображение можно получить и успешно отобразить.

-(void)createSession
{
if(self.session == nil)
        {
            self.session = [[AVCaptureSession alloc] init];
            self.session.sessionPreset = AVCaptureSessionPresetPhoto;
            CGDirectDisplayID displayId = [self getDisplayID];

            self.input = [[AVCaptureScreenInput alloc] initWithDisplayID:displayId];

            [self.session addInput:self.input];

            self.imageOutput = [[AVCaptureStillImageOutput alloc] init];

            NSDictionary *outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};

            [self.imageOutput setOutputSettings:outputSettings];

            [self.session addOutput:self.imageOutput];

            [self.session startRunning];
        }
}



-(void)processSampleBuffer
{
AVCaptureConnection *videoConnection = nil;
    for (AVCaptureConnection *connection in self.imageOutput.connections) {
        for (AVCaptureInputPort *port in [connection inputPorts]) {
            if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
                videoConnection = connection;
                break;
            }
        }
        if (videoConnection) { break; }
    }

    [self.imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *  error) {
        if(imageDataSampleBuffer != nil)
        {
            NSData * imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
            self.image = [[NSImage alloc] initWithData:imageData];

            CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
            CVPixelBufferLockBaseAddress(imageBuffer,0);

            size_t width = CVPixelBufferGetWidth(imageBuffer);
            size_t height = CVPixelBufferGetHeight(imageBuffer);

            NSLog(@"width %zu height %zu", width,height);

             CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer);
            float width1 = CVPixelBufferGetWidth(pixelBuffer);
            float height1 = CVPixelBufferGetHeight(pixelBuffer);

             NSLog(@"Pixelbuffer width %f height %f", width1,height1);

        }
        else
        {
            NSLog(@"error");
        }

    }];
}

in processSampleBuffer self.image может получить NSImage и успешно отобразиться в NSImageView. но imageBuffer и pixelBuffer равны нулю.

меня сильно смутило, может кто-нибудь помочь взглянуть?

1 Ответ

0 голосов
/ 19 января 2019

ОК, наконец, я нашел ответ здесь, надеюсь, он может помочь другим.

https://developer.apple.com/documentation/avfoundation/avcapturephoto/2873914-pixelbuffer?language=objc

Обсуждение

Если вы запросили захват фотографии в формате RAWили в обработанном формате без сжатия, таком как TIFF, вы можете использовать это свойство для доступа к базовому буферу выборок.

Если вы запрашивали захват в сжатом формате, таком как JPEG или HEVC / HEIF, значение этого свойства равноноль.Используйте метод fileDataRepresentation или CGImageRepresentation для получения сжатых данных изображения.

...