知道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的帧大小。
在左边的图像中,宽度固定为300px,高度通过设置4:3的比例来检索,大小为400px。
在右边的图像中,高度固定为300px,宽度是通过设置3:4的比例来检索的,并且是225px。
- iPhone可以一次快速拍摄2张照片多快?
- AVAssetWriter如何创build没有压缩的movvideo?
- 获取audio驱动程序采样率的OSX AVAudioSession替代
- 如何播放背景Swift中的audio?
- iOS – AVAssestExportSession只能在播放AVPlayer后导出最多8首曲目
- 使用MPMovieController或AVFoundation可以使用NSURLProtocol的子类播放video?
- 如何发挥多个声音?
- 初始化The Amazing Audio Engine后,没有录像中的audio(使用GPUImage)
- SKVideoNode作为SCNSphere的纹理