我想用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];
我的代码应该更改什么?
非常感谢!
答案 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键实际上确实有效并且是必需的。