我使用iOS 4& A中提供的AVFoundation框架实现了一个摄像头。 5,但是在captureStillImageAsynchronouslyFromConnection:completionHandler:
函数中遇到了一个不一致的问题,其中永远不会调用完成处理程序块。在这种情况下,快门声音不会闪烁,预览会冻结。
我已经跟随Apple(WWDC 2010和2011视频)和非Apple指南(博客和SO帖子)在Photo分辨率下实现静态图像捕获,几乎没有改进。我已经能够在以下条件下一致地重现::
AVCaptureFlashModeAuto
并在光线不足的情况下拍摄照片,它会挂起并且永远不会运行完成程序段。闪光灯闪光,但快门声没有。使用相同的代码,我可以在正常光线下拍摄照片,快门声音会闪光,闪光灯不闪光,完成程序段也会运行。flashMode
或将其设置为关闭,我可以拍摄一些照片,但是在少数(通常在1到5之间)后,完成程序段会停止发射。为了澄清,一个场景可能是:
我的实施
我在ViewController中处理接口,并在单独的类中处理所有AVFoundation的东西。处理AVFoundation内容的单独类的实例变量位于ViewController中。它与示例实现不同,但我不明白为什么它会导致这种偶然的错误。
更多观察
[stillImageOutput isCapturingStillImage]
,它仍将继续返回false并继续运行captureStillImageAsynchronouslyFromConnection
函数我很想知道是否有一些我可能会遗漏的东西,一个未设置的属性,或一个已解决的问题。
感谢。
(我看到了类似的帖子,但没有一个答案解决了我的问题。我需要在应用程序中使用Photo res。供参考: iPhone SDK 4 AVFoundation - How to use captureStillImageAsynchronouslyFromConnection correctly?)
答案 0 :(得分:6)
我应该添加代码,它可能会帮助任何人查看此内容,但无论如何:
事实证明,相机Flash对处理图像所需的时间量有很大的影响,从而在异步捕获某些内容时导致问题。在从completionHandler块发送通知之前,我不小心结束了捕获会话。
- (void) saveImageFromCamera {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageCapturedFromCamera) name:@"FTW_imageCaptured" object:nil];
[cameraController captureStillImage];
// WRONG: Session was stopped here before
}
- (void) imageCapturedFromCamera {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"FTW_imageCaptured" object:nil];
[sharedAppController setBackgroundImage:[cameraController stillImage]];
sharedAppController.imageFromCamera = YES;
[self endCamera];
// CORRECT: Should have stopped session here
[self updateBackgroundImage];
}
我希望这可以帮助遇到类似事情的其他人。