ios 找到设备相机分辨率iOS的方法
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19422322/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Method to find device's camera resolution iOS
提问by thar_bun
Whats the best method to find the image resolution going to be captured using setting AVCaptureSessionPresetPhoto
.
I am trying to find the resolution before capturing the image.
使用设置查找将要捕获的图像分辨率的最佳方法是什么AVCaptureSessionPresetPhoto
?
我试图在捕获图像之前找到分辨率。
采纳答案by Crashalot
With the function below, you can programmatically get the resolution from activeFormat
before capture begins, though not before adding inputs and outputs:
https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVCaptureDevice_Class/index.html#//apple_ref/occ/instp/AVCaptureDevice/activeFormat
使用下面的函数,您可以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
}
回答by Roman Slyepko
Here is the a table of all tested camera sessionPreset`s on devices, that support iOS 9
这是支持 iOS 9 的设备上所有经过测试的相机 sessionPreset 的表格
+-----------------------+--------------+---------------------------------+---------------+
| 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 |
+-----------------------+--------------+---------------------------------+---------------+
CODE
代码
+ (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;
}
回答by CouchDeveloper
There's probably no way to directlyget the camera resolution programmatically beforecapturing an image.
在捕获图像之前,可能无法以编程方式直接获取相机分辨率。
Apple provides a table for various devices and presets:
Apple 为各种设备和预设提供了一个表格:
回答by Cynichniy Bandera
Can be done in this way:
可以通过这种方式完成:
/* 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);
}
回答by Dmitry Soldatenkov
Try this code for get maximum Image resolution for device cameras:
试试这个代码以获得设备相机的最大图像分辨率:
- (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);
}