2011-10-13 85 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]; 
} 

我希望這可以幫助其他人遇到類似這樣的事情。