寻找设备相机分辨率的方法iOS

寻找将使用设置AVCaptureSessionPresetPhoto捕获图像分辨率的最佳方法是什么?
我想在捕获图像之前找到分辨率。寻找设备相机分辨率的方法iOS

回答:

有可能没有办法直接获取摄像头分辨率之前捕获图像。

苹果提供了表的各种设备和预设:

Capturing Still Images

回答:

这里是设备上的所有测试的相机sessionPreset`s的表,即支持的iOS 9

+-----------------------+--------------+---------------------------------+---------------+ 

| Device | Camera | AVCaptureSessionPreset | Resolution |

+-----------------------+--------------+---------------------------------+---------------+

| iPhone 4S | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 640x480 |

| | | AVCaptureSessionPresetHigh | 640x480 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | not supported |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 3264x2448 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPhone 5/5C/5S/6/6+ | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 3264x2448 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPhone 6S/6S | | | |

| | FRONT camera | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK camera | | |

| | | AVCaptureSessionPresetPhoto | 4032x3024 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPad 2 | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 640x480 |

| | | AVCaptureSessionPresetHigh | 640x480 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | not supported |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 960x720 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

+-----------------------+--------------+---------------------------------+---------------+

| iPad 3 | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 640x480 |

| | | AVCaptureSessionPresetHigh | 640x480 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | not supported |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 2592x1936 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPad 4/Air | | | |

| iPad Mini 1/2/3 | | | |

| iPod 5G | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 2592x1936 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPad Air 2 | | | |

| iPad Mini 4 | | | |

| iPad Pro | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 3264x2448 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPod Touch 5 | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 2592x1936 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

| iPod Touch 6 | | | |

| | FRONT | | |

| | | AVCaptureSessionPresetPhoto | 1280x960 |

| | | AVCaptureSessionPresetHigh | 1280x720 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | not supported |

| | BACK | | |

| | | AVCaptureSessionPresetPhoto | 3264x2448 |

| | | AVCaptureSessionPresetHigh | 1920x1080 |

| | | AVCaptureSessionPresetMedium | 480x360 |

| | | AVCaptureSessionPresetLow | 192x144 |

| | | AVCaptureSessionPreset640x480 | 640x480 |

| | | AVCaptureSessionPreset1280x720 | 1280x720 |

| | | AVCaptureSessionPreset1920x1080 | 1920x1080 |

+-----------------------+--------------+---------------------------------+---------------+

代码

+ (NSDictionary*) cameraResolutions { 

NSString* deviceModel = [self deviceModel];

// iPhone 4S

if ([deviceModel isEqualToString:@"iPhone4,1"]) {

NSString* lFrontCam = @"640x480,480x360,192x144";

NSString* lBackCam = @"3264x2448,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPhone 5/5C/5S/6/6+/iPod 6

else if ([deviceModel isEqualToString:@"iPhone5,1"]

|| [deviceModel isEqualToString:@"iPhone5,2"]

|| [deviceModel isEqualToString:@"iPhone5,3"]

|| [deviceModel isEqualToString:@"iPhone5,4"]

|| [deviceModel isEqualToString:@"iPhone6,1"]

|| [deviceModel isEqualToString:@"iPhone6,2"]

|| [deviceModel isEqualToString:@"iPhone7,1"]

|| [deviceModel isEqualToString:@"iPhone7,2"]

|| [deviceModel isEqualToString:@"iPod7,1"]) {

NSString* lFrontCam = @"1280x960,1280x720,640x480,480x360,192x144";

NSString* lBackCam = @"3264x2448,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPhone 6S/6S+

else if ([deviceModel isEqualToString:@"iPhone8,1"]

|| [deviceModel isEqualToString:@"iPhone8,2"]) {

NSString* lFrontCam = @"1280x960,1280x720,640x480,480x360,192x144";

NSString* lBackCam = @"4032x3024,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPad 2

else if ([deviceModel isEqualToString:@"iPad2,1"]

|| [deviceModel isEqualToString:@"iPad2,2"]

|| [deviceModel isEqualToString:@"iPad2,3"]

|| [deviceModel isEqualToString:@"iPad2,4"]) {

NSString* lFrontCam = @"640x480,480x360,192x144";

NSString* lBackCam = @"1280x720,960x720,480x360,192x144,640x480";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPad 3

else if ([deviceModel isEqualToString:@"iPad3,1"]

|| [deviceModel isEqualToString:@"iPad3,2"]

|| [deviceModel isEqualToString:@"iPad3,3"]) {

NSString* lFrontCam = @"640x480,480x360,192x144";

NSString* lBackCam = @"2592x1936,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPad 4/Air/Mini/Mini 2/Mini 3/iPod 5G

else if ([deviceModel isEqualToString:@"iPad3,4"]

|| [deviceModel isEqualToString:@"iPad3,5"]

|| [deviceModel isEqualToString:@"iPad3,6"]

|| [deviceModel isEqualToString:@"iPad4,1"]

|| [deviceModel isEqualToString:@"iPad4,2"]

|| [deviceModel isEqualToString:@"iPad4,3"]

|| [deviceModel isEqualToString:@"iPad4,4"]

|| [deviceModel isEqualToString:@"iPad4,5"]

|| [deviceModel isEqualToString:@"iPad4,6"]

|| [deviceModel isEqualToString:@"iPad4,7"]

|| [deviceModel isEqualToString:@"iPad4,8"]

|| [deviceModel isEqualToString:@"iPod5,1"]) {

NSString* lFrontCam = @"1280x960,1280x720,640x480,480x360,192x144";

NSString* lBackCam = @"2592x1936,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

// iPad Air 2/Mini 4/Pro

else if ([deviceModel isEqualToString:@"iPad5,3"]

|| [deviceModel isEqualToString:@"iPad5,4"]) {

NSString* lFrontCam = @"1280x960,1280x720,640x480,480x360,192x144";

NSString* lBackCam = @"3264x2448,1920x1080,1280x720,640x480,480x360,192x144";

NSDictionary* lCamResolutions = @{@"front":lFrontCam,

@"back":lBackCam};

return lCamResolutions;

}

return nil;

}

回答:

可以用这种方式来完成:

/* Callback that is called when you activate the capture session. */ 

- (void) avCaptureInputPortFormatDescriptionDidChangeNotification:(NSNotification *)notification {

CMFormatDescriptionRef formatDescription = nil;

NSArray *ports = [deviceInput ports];

AVCaptureInputPort *usePort = nil;

for (AVCaptureInputPort *port in ports) {

if (usePort == nil || [port.mediaType isEqualToString:AVMediaTypeVideo]) {

usePort = port;

break;

}

}

if (usePort != nil)

formatDescription = usePort.formatDescription;

if (formatDescription != nil) {

/*------------>>>>>>> THIS IS YOUR RESOLUTION */

CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription);

self.frameSize = CGSizeMake(dimensions.width, dimensions.height);

[[NSNotificationCenter defaultCenter] removeObserver:self];

NSLog(@"Capturing with %dx%d", (int)self.frameSize.width, (int)self.frameSize.height);

} else {

NSLog(@"Failed to detect resolution, using default one.");

self.frameSize = CGSizeMake(640.0f, 480.0f);

}

}

- (id) init {

if ((self = [super init])) {

/* Default framesize. */

self.frameSize = CGSizeMake(640.0f, 480.0f);

AVCaptureSession *capSession = [[AVCaptureSession alloc] init];

/* -------->>>>>>> REQUESTED RESOLUTION, CAN BE SOMTHING ELSE */

[capSession setSessionPreset:AVCaptureSessionPresetHigh];

// if (([modelName rangeOfString:@"iPhone 5"].length != 0) || ([modelName rangeOfString:@"iPhone 6"].length != 0)) {

// [capSession setSessionPreset:AVCaptureSessionPresetHigh];

// } else {

// [capSession setSessionPreset:AVCaptureSessionPreset640x480];

// }

//

self.captureSession = capSession;

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(avCaptureInputPortFormatDescriptionDidChangeNotification:)

name:AVCaptureInputPortFormatDescriptionDidChangeNotification object:nil];

}

return self;

}

- (void) dealloc

{

[[NSNotificationCenter defaultCenter] removeObserver:self];

if (self.captureSession.isRunning)

[self.captureSession stopRunning];

self.captureSession = nil;

}

- (void) addRawViewOutput

{

/* We setup the output */

AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];

/* While a frame is processes in -captureOutput:didOutputSampleBuffer:fromConnection: delegate methods

no other frames are added in the queue.

If you don't want this behaviour set the property to NO */

captureOutput.alwaysDiscardsLateVideoFrames = YES;

/*We specify a minimum duration for each frame (play with this settings to avoid having too many frames waiting

in the queue because it can cause memory issues). It is similar to the inverse of the maximum framerate.

In this example we set a min frame duration of 1/10 seconds so a maximum framerate of 10fps. We say that

we are not able to process more than 10 frames per second.*/

//captureOutput.minFrameDuration = CMTimeMake(1, 10);

/*We create a serial queue to handle the processing of our frames*/

dispatch_queue_t queue;

queue = dispatch_queue_create("com.YourApp.cameraQueue", NULL);

[captureOutput setSampleBufferDelegate:self queue:queue];

// dispatch_release(queue);

// Set the video output to store frame in BGRA (It is supposed to be faster)

NSString *key = (NSString*)kCVPixelBufferPixelFormatTypeKey;

NSNumber *value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];

NSDictionary *videoSettings = [NSDictionary dictionaryWithObject:value forKey:key];

[captureOutput setVideoSettings:videoSettings];

// Register an output

[self.captureSession addOutput:captureOutput];

}

- (bool) startWithDevicePosition:(AVCaptureDevicePosition)devicePosition

{

AVCaptureDevice *videoDevice = [self cameraWithPosition:devicePosition];

if (!videoDevice)

return FALSE;

NSError *error;

AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];

self.deviceInput = videoIn;

if (!error)

{

if ([[self captureSession] canAddInput:videoIn])

{

[[self captureSession] addInput:videoIn];

}

else

{

NSLog(@"Couldn't add video input");

return FALSE;

}

}

else

{

NSLog(@"Couldn't create video input");

return FALSE;

}

[self addRawViewOutput];

[self resume];

return TRUE;

}

-(void) pause

{

self.paused = YES;

if (self.captureSession.isRunning)

[captureSession stopRunning];

}

-(void) resume

{

if (!self.captureSession.isRunning)

[captureSession startRunning];

self.paused = NO;

}

#pragma mark -

#pragma mark AVCaptureSession delegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput

didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer

fromConnection:(AVCaptureConnection *)connection

{

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 width = CVPixelBufferGetWidth(imageBuffer);

size_t height = CVPixelBufferGetHeight(imageBuffer);

size_t stride = CVPixelBufferGetBytesPerRow(imageBuffer);

size_t size = CVPixelBufferGetDataSize(imageBuffer);

BGRAVideoFrame frame = {(int)width, (int)height, (int)stride, (int)size, baseAddress};

[delegate frameReady:frame];

/* We unlock the image buffer */

CVPixelBufferUnlockBaseAddress(imageBuffer,0);

}

回答:

与下面的功能,您可以通过编程从activeFormat获得分辨率拍摄开始前,虽然没有增加投入和产出之前: https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/index.html#//apple_ref/occ/instp/AVCaptureDevice/activeFormat

private func getCaptureResolution() -> CGSize { 

// Define default resolution

var resolution = CGSize(width: 0, height: 0)

// Get cur video device

let curVideoDevice = useBackCamera ? backCameraDevice : frontCameraDevice

// Set if video portrait orientation

let portraitOrientation = orientation == .Portrait || orientation == .PortraitUpsideDown

// Get video dimensions

if let formatDescription = curVideoDevice?.activeFormat.formatDescription {

let dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription)

resolution = CGSize(width: CGFloat(dimensions.width), height: CGFloat(dimensions.height))

if (portraitOrientation) {

resolution = CGSize(width: resolution.height, height: resolution.width)

}

}

// Return resolution

return resolution

}

回答:

尝试下面的代码,以获得设备摄像头的最大图像分辨率:

- (CMVideoDimensions) getCameraMaxStillImageResolution:(AVCaptureDevicePosition) cameraPosition { 

CMVideoDimensions max_resolution;

max_resolution.width = 0;

max_resolution.height = 0;

AVCaptureDevice *captureDevice = nil;

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

for (AVCaptureDevice *device in devices) {

if ([device position] == cameraPosition) {

captureDevice = device;

break;

}

}

if (captureDevice == nil) {

return max_resolution;

}

NSArray* availFormats=captureDevice.formats;

for (AVCaptureDeviceFormat* format in availFormats) {

CMVideoDimensions resolution = format.highResolutionStillImageDimensions;

int w = resolution.width;

int h = resolution.height;

if ((w * h) > (max_resolution.width * max_resolution.height)) {

max_resolution.width = w;

max_resolution.height = h;

}

}

return max_resolution;

}

- (void) printCamerasInfo {

CMVideoDimensions res;

res = [self getCameraMaxStillImageResolution:AVCaptureDevicePositionBack];

NSLog(@" Back Camera max Image resolution: %d x %d", res.width, res.height);

res = [self getCameraMaxStillImageResolution:AVCaptureDevicePositionFront];

NSLog(@" Front Camera max Image resolution: %d x %d", res.width, res.height);

}

以上是 寻找设备相机分辨率的方法iOS 的全部内容, 来源链接: utcz.com/qa/257664.html

回到顶部