AVCaptureSession分辨率不会随AVCaptureSessionPreset而改变

时间:2016-05-13 09:28:07

标签: objective-c macos avcapturesession

我想用AV Foundation改变我在OS X上用相机拍摄的照片的分辨率。

但即使我更改AVCaptureSession的分辨率,输出图片大小也不会改变。我总是有一张1280x720的照片。

我想要一个较低的分辨率,因为我在实时过程中使用这些图片,我希望程序更快。

这是我的代码示例:

 session = [[AVCaptureSession alloc] init];

if([session canSetSessionPreset:AVCaptureSessionPreset640x360]) {
    [session setSessionPreset:AVCaptureSessionPreset640x360];
}

AVCaptureDeviceInput *device_input = [[AVCaptureDeviceInput alloc] initWithDevice:
                                       [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0] error:nil];

if([session canAddInput:device_input])
    [session addInput:device_input];

still_image = [[AVCaptureStillImageOutput alloc] init];

NSDictionary *output_settings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil];
[still_image setOutputSettings : output_settings];

[session addOutput:still_image];

我的代码应该更改什么?

非常感谢!

2 个答案:

答案 0 :(得分:1)

我也遇到过这个问题并找到了似乎有效的解决方案。出于某种原因,在OS X上,StillImageOutput会中断捕获会话预设。

我所做的是直接更改AVCaptureDevice的活动格式。将StillImageOutput添加到Capture Session后立即尝试此代码。

//Get a list of supported formats for the device
NSArray *supportedFormats = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0] formats];

//Find the format closest to what you are looking for
//  this is just one way of finding it
NSInteger desiredWidth = 640;
AVCaptureDeviceFormat *bestFormat;
for (AVCaptureDeviceFormat *format in supportedFormats) {
    CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions((CMVideoFormatDescriptionRef)[format formatDescription]);
    if (dimensions.width <= desiredWidth) {
        bestFormat = format;
    }
}

[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0] lockForConfiguration:nil];
[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0] setActiveFormat:bestFormat]; 
[[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo][0] unlockForConfiguration];

可能还有其他方法可以解决这个问题,但这对我来说已经解决了。

答案 1 :(得分:0)

所以我也遇到了这个问题,但是使用原始的AVCaptureVideoDataOutput而不是JPG。

问题在于,会话预设的“低/中/高”实际上会以某种方式影响捕获设备,例如帧速率,但它不会更改硬件捕获分辨率-它将始终以1280x720捕获。我的想法是,如果会话预设为“中”,则普通的Quicktime输出设备将解决此问题,并向640x480(例如)添加缩放步骤。

但是当使用原始输出时,他们将不在乎预设的所需尺寸。

与Apple关于videoSettings的文档相反,该解决方案是将请求的尺寸添加到videoSettings:

        NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithDouble:640], (id)kCVPixelBufferWidthKey,
                    [NSNumber numberWithDouble:480], (id)kCVPixelBufferHeightKey,
                    [NSNumber numberWithInt:kCMPixelFormat_422YpCbCr8_yuvs], (id)kCVPixelBufferPixelFormatTypeKey,
                    nil];
    [captureoutput setVideoSettings:outputSettings];

我说与Apple文档相反,因为文档说FormatTypeKey是此处允许的唯一键。但是bufferheight / width键实际上确实有效并且是必需的。