知道AVCaptureSession会话预设的parsing

我正在iOS中访问摄像头,并使用会话预设:

captureSession.sessionPreset = AVCaptureSessionPresetMedium; 

很标准的东西。 不过,由于这个预设,我想提前知道video的分辨率(尤其是因为根据设备的不同而不同)。 我知道有网上的表格,你可以看看这个(如在这里: http : //cmgresearch.blogspot.com/2010/10/augmented-reality-on-iphone-with-ios40.html )。 但是我希望能够以编程方式获得这个结果,这样我就不仅仅依靠魔术数字。

所以,这样(理论上):

 [captureSession resolutionForPreset:AVCaptureSessionPresetMedium]; 

这可能会返回一个CGSize {宽度:360,高度:480}。 我一直没有find任何这样的API,到目前为止,我不得不等待获得我的第一个捕获的图像,然后查询(由于其他原因,在我的程序stream程是不好的)。

根据苹果 ,没有这个API。 这很糟糕,我也有同样的问题。

我不是AVFoundation专业人士,但我认为要走的路是:

 captureSession.sessionPreset = AVCaptureSessionPresetMedium; AVCaptureInput *input = [captureSession.inputs objectAtIndex:0]; // maybe search the input in array AVCaptureInputPort *port = [input.ports objectAtIndex:0]; CMFormatDescriptionRef formatDescription = port.formatDescription; CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(formatDescription); 

我不知道最后一步,我没有自己尝试。 刚发现在文档中,认为它应该工作。

在Xcode中searchCMVideoDimensions ,你会发现RosyWriter示例项目。 看看这个代码(我现在没有时间去做)。

仅供参考,我在这里附上苹果的正式答复。


这是错误ID#13201137的后续操作。

工程部门根据以下信息确定此问题的行为如预期的那样:

包含的代码有几个问题:

1)AVCaptureSession没有input。 2)AVCaptureSession没有输出。

如果没有至less一个input(使用[AVCaptureSession addInput:]添加到会话)和兼容输出(使用[AVCaptureSession addOutput:]添加),则不会有活动连接,因此会话实际上不会在input中运行设备。 它不需要 – 没有输出来提供任何相机的数据。

3)JAViewController类假定video端口的-formatDescription属性在[AVCaptureSession startRunning]返回时不会为零。

不能保证一旦startRunning返回,格式描述将以新的相机格式更新。 -startRunning启动摄像机,并在完全启动并运行时返回,但不等待video帧主动stream经捕获pipe道,即更新格式描述的时间。

你只是查询得太快 如果你等了几个毫秒,它会在那里。 但正确的做法是听AVCaptureInputPortFormatDescriptionDidChangeNotification。

4)您的JAViewController类在retrieveCameraInfo中创build一个PVCameraInfo对象:并询问它一个问题,然后让它落在范围之外,在那里它被释放和释放。

因此,会话没有足够长的时间来满足您的尺寸要求。 你太快停止相机。

我们认为这个问题closures了。 如果您对此问题有任何问题或疑虑,请直接更新您的报告( http://bugreport.apple.com )。

感谢您花时间通知我们这个问题。

最好的祝福,

开发者Bug报告团队Apple全球开发者关系

也许你可以提供每个iPhone型号的所有可能的预设分辨率的列表,并检查应用程序运行在哪个设备型号? – 使用这样的东西…

 [[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G" 

但是,您必须更新每个较新设备型号的列表。 希望这可以帮助 :)

在捕获开始之前,您可以通过编程的方式从activeFormat获取parsing,不过在添加input和输出之前不需要: 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 } 

苹果iPhone相机使用4:3的比例。

您可以通过修正AVCaptureVideoPreviewLayer的宽度或高度约束,并将宽高比约束设置为4:3来获取捕获video的帧大小。

4:3比例

在左边的图像中,宽度固定为300px,高度通过设置4:3的比例来检索,大小为400px。

在右边的图像中,高度固定为300px,宽度是通过设置3:4的比例来检索的,并且是225px。