captureOutput:didOutputSampleBuffer:fromConnection: размер буфера изображения всегда 360x480 даже на iPad

Я использую captureOutput:didOutputSampleBuffer:fromConnection: метод делегата AVCaptureVideoDataOutput, При тестировании на iPad размер буфера изображения всегда равен 360x480, что кажется странным, я думаю, это будет размер экрана iPad.

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 

    @autoreleasepool {

        CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
        /*Lock the image buffer*/
        CVPixelBufferLockBaseAddress(imageBuffer,0); 
        /*Get information about the image*/
        uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
        size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
        size_t width = CVPixelBufferGetWidth(imageBuffer); 
        size_t height = CVPixelBufferGetHeight(imageBuffer);  

        /*Create a CGImageRef from the CVImageBufferRef*/
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
        CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
        CGImageRef newImage = CGBitmapContextCreateImage(newContext);

        NSLog(@"image size: h %zu, w %zu", height, width);

        /*We unlock the  image buffer*/
        CVPixelBufferUnlockBaseAddress(imageBuffer,0);

        CGRect zoom = CGRectMake(self.touchPoint.y, self.touchPoint.x, 120, 120);
        CGImageRef newImage2 = CGImageCreateWithImageInRect(newImage, zoom);

        /*We release some components*/
        CGContextRelease(newContext); 
        CGColorSpaceRelease(colorSpace);

        UIImage* zoomedImage = [[UIImage alloc] initWithCGImage:newImage2 scale:1.0 orientation:UIImageOrientationUp];
        [self.zoomedView.layer performSelectorOnMainThread:@selector(setContents:) withObject:(__bridge id)zoomedImage.CGImage waitUntilDone:YES];

        CGImageRelease(newImage);
        CGImageRelease(newImage2);

    }

}//end

Есть ли причина, по которой буфер изображений будет таким маленьким даже на iPad?

1 ответ

Решение

Качество AVCaptureSession определяется sessionPreset свойство, которое по умолчанию AVCaptureSessionPresetHigh, Неважно, какое разрешение экрана у устройства захвата; качество захвата зависит от камеры устройства.

Если вы хотите, чтобы разрешение захвата более точно соответствовало разрешению экрана, вам придется изменить sessionPreset, Просто отметьте, что ни одна из предустановок не соответствует напрямую какому-либо разрешению экрана, скорее, они соответствуют распространенным видеоформатам, таким как VGA, 720p, 1080p и т. Д.

NSString *const AVCaptureSessionPresetPhoto;
NSString *const AVCaptureSessionPresetHigh;
NSString *const AVCaptureSessionPresetMedium;
NSString *const AVCaptureSessionPresetLow;
NSString *const AVCaptureSessionPreset352x288;
NSString *const AVCaptureSessionPreset640x480;
NSString *const AVCaptureSessionPreset1280x720;
NSString *const AVCaptureSessionPreset1920x1080;
NSString *const AVCaptureSessionPresetiFrame960x540;
NSString *const AVCaptureSessionPresetiFrame1280x720;
Другие вопросы по тегам