Objective c iOS AVFoundation captureStillImageAsynchronouslyFromConnection:completionHandler:无限期挂起

Objective c iOS AVFoundation captureStillImageAsynchronouslyFromConnection:completionHandler:无限期挂起,objective-c,ios,avfoundation,Objective C,Ios,Avfoundation,我已经使用iOS 4和5中提供的AVFoundation框架实现了一个摄像头,但是在从未调用完成处理程序块的captureStillImageAsynchronouslyFromConnection:completionHandler:函数中遇到了一个不一致的问题。在这种情况下,快门声音不会触发,预览将冻结 我遵循了苹果(WWDC 2010和2011视频)和非苹果指南(博客等帖子),以照片分辨率实现了静态图像捕获,几乎没有改进。在以下条件下,我能够在一定程度上始终如一地繁殖: 如果我将flas

我已经使用iOS 4和5中提供的AVFoundation框架实现了一个摄像头,但是在从未调用完成处理程序块的
captureStillImageAsynchronouslyFromConnection:completionHandler:
函数中遇到了一个不一致的问题。在这种情况下,快门声音不会触发,预览将冻结

我遵循了苹果(WWDC 2010和2011视频)和非苹果指南(博客等帖子),以照片分辨率实现了静态图像捕获,几乎没有改进。在以下条件下,我能够在一定程度上始终如一地繁殖:

  • 如果我将flash设置为
    AVCaptureFlashModeAuto
    并在微光下拍照,它将挂起,并且永远不会运行完成块。闪光灯亮起,但快门声不亮。使用相同的代码,我能够在正常光线下拍摄照片,快门声音启动,闪光灯不闪烁,完成块运行
  • 如果我没有将
    flashMode
    设置为off,我可以拍摄一些照片,但在少量(通常在1到5之间)后,完成块停止启动。为了澄清,一个场景可能是:
  • 在确认屏幕上拍照并查看
  • 返回拍摄屏幕
  • 重复1和2两次
  • 点击拍照,它会挂在完成块之前
我的实施

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

更多观察结果

  • 即使在检查
    [stillImageOutput isCapturingStillImage]
    时,它也会继续返回false并继续从Connection异步运行
    CaptureSillImageAsynchronouslyFromConnection
    函数
  • 如果我切换到另一个应用程序,锁定手机,在应用程序中执行某些其他操作,或者点击“拍照”按钮一百万次,我就能够让完成块返回错误。它们根据具体的行动而有所不同。常见的是11800、11801和11830。他们似乎与绞刑无关
  • 我让我们的测试手机(iPhone4GSM)静置一个小时,看看它最终是否能正常工作。没有骰子
我很想知道是否有什么东西我可能会丢失,一个未处理的财产,或一个已知的问题与一个解决办法

谢谢

(我看到了一个类似的帖子,但没有一个答案解决了我的问题。我需要申请中的照片。供参考:
)

我应该添加代码,它可能会帮助任何人查看此内容,但无论如何:

事实证明,相机闪光灯对处理图像所需的时间有足够大的影响,从而在异步捕获某些内容时引发问题。在从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];
}
我希望这能帮助其他遇到类似情况的人