iOS AVFoundation captureStillImageAsynchronouslyFromConnection:completionHandler:无限期悬挂

时间:2011-10-13 03:49:30

标签: objective-c ios avfoundation

我使用iOS 4& A中提供的AVFoundation框架实现了一个摄像头。 5,但是在captureStillImageAsynchronouslyFromConnection:completionHandler:函数中遇到了一个不一致的问题,其中永远不会调用完成处理程序块。在这种情况下,快门声音不会闪烁,预览会冻结。

我已经跟随Apple(WWDC 2010和2011视频)和非Apple指南(博客和SO帖子)在Photo分辨率下实现静态图像捕获,几乎没有改进。我已经能够在以下条件下一致地重现::

  • 如果我将闪光灯设置为AVCaptureFlashModeAuto并在光线不足的情况下拍摄照片,它会挂起并且永远不会运行完成程序段。闪光灯闪光,但快门声没有。使用相同的代码,我可以在正常光线下拍摄照片,快门声音会闪光,闪光灯不闪光,完成程序段也会运行。
  • 如果我没有设置flashMode或将其设置为关闭,我可以拍摄一些照片,但是在少数(通常在1到5之间)后,完成程序段会停止发射。为了澄清,一个场景可能是:
    1. 在确认屏幕上拍照并查看
    2. 返回拍照屏幕
    3. 重复1& 2几次
    4. 点击拍照,它在完成块之前挂起。

我的实施

我在ViewController中处理接口,并在单独的类中处理所有AVFoundation的东西。处理AVFoundation内容的单独类的实例变量位于ViewController中。它与示例实现不同,但我不明白为什么它会导致这种偶然的错误。

更多观察

  • 即使检查[stillImageOutput isCapturingStillImage],它仍将继续返回false并继续运行captureStillImageAsynchronouslyFromConnection函数
  • 如果我切换到另一个应用程序,请锁定手机,在应用程序中执行某些其他操作,或点击“拍照”按钮一百万次我能够获得完成块以返回错误。它们根据哪个动作而不同。常见的是11800,11801和11830.它们似乎与悬挂无关。
  • 我让我们的测试手机(iPhone 4 GSM)坐了一个小时,看它是否会最终处理。没有骰子。

我很想知道是否有一些我可能会遗漏的东西,一个未设置的属性,或一个已解决的问题。

感谢。

(我看到了类似的帖子,但没有一个答案解决了我的问题。我需要在应用程序中使用Photo res。供参考: iPhone SDK 4 AVFoundation - How to use captureStillImageAsynchronouslyFromConnection correctly?

1 个答案:

答案 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];
}

我希望这可以帮助遇到类似事情的其他人。