2011-10-13 81 views
6

我实现了使用的iOS 4 & 5提供的AVFoundation框架摄像头,但一直在经历与captureStillImageAsynchronouslyFromConnection:completionHandler:功能,其中完成处理程序块是从来没有所谓不一致的问题。在这种情况下快门声音不会启动并且预览会冻结。的iOS AVFoundation captureStillImageAsynchronouslyFromConnection:completionHandler:无限期地挂起

我已经遵循苹果(WWDC 2010 & 2011视频)和非Apple指南(博客和SO帖子)来实现照片分辨率下的静态图像捕获,但几乎没有任何改进。我已经能够在一定程度上一致地重现了下列条件下:

  • 如果我设置闪到AVCaptureFlashModeAuto,并采取在低光照片,它挂起,从不完成块。闪光灯闪光,但快门声音不响。使用相同的代码,我可以在快门声闪烁的正常光线下拍摄照片,闪光灯不闪光,并且完成模块运行。
  • 如果我没有设置flashMode或将其设置为关闭,我可以拍摄一些照片,但在少量数字后(通常在1到5之间),完成块会停止发射。对于澄清,方案可能是:
    1. 采取在确认屏幕中的照片,并查看
    2. 回到拍照画面
    3. 重复1次& 2几次
    4. 命中拍照,并将它挂在完成块之前。

我实现

我有一个视图控制器处理的接口和独立的类来处理所有的AVFoundation东西。处理AVFoundation内容的独立类的实例变量位于ViewController中。它与示例实现不同,但我不明白为什么它会导致这种偶然的错误。

更多的观测

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

我很想知道,如果有什么东西,我可能会错过,属性未设置,或与周围的工作一个已知的问题。

谢谢。

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

回答

6

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

原来,相机的闪光灯对的时间量显著足够影响它在异步捕获某些内容时需要处理映像以引发问题。在通知从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]; 
} 

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