2016-03-19 93 views
1

我有困難時期,因爲我覺得應該很簡單。 我只想在我的iOS應用程序中拍照時點亮閃光燈。我試過的所有失敗或只有20%。不能使用AVCaptureDevice和閃光燈

這裏是燒製以點亮閃光燈時的代碼:

// Here we have: captureDevice.hasFlash && captureDevice.isFlashModeSupported(.On) 
    do {try captureDevice.lockForConfiguration() 
     captureDevice.flashMode = .On 
     captureDevice.unlockForConfiguration() 
    } catch let error as NSError { 
     print("captureDevice.lockForConfiguration FAILED") 
     print(error.code) 
    } 

我已經嘗試了代碼的幾種口味,通過移動2行try塊到最後的內部,或者通過調用包含該函數這個代碼來自不同的點。但是,在時間的所有情況下,運行以下命令:

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { 
(imageDataSampleBuffer, error) -> Void in 

我收到以下錯誤:

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSUnderlyingError=0x13f079340 {Error Domain=NSOSStatusErrorDomain Code=-16800 "(null)"}, NSLocalizedFailureReason=An unknown error occurred (-16800), NSLocalizedDescription=The operation could not be completed} 

如果我再更換行:

captureDevice.flashMode = .On 

由:

captureDevice.torchMode = .On 

我得到了一些或多或少的工作(不幸的是寧可少),沒有錯誤,但是這是使用火炬,所以我得到的計時問題:

而且目前尚不清楚,如果我需要在我的代碼某個時候使用這行:

captureSession.commitConfiguration() 

回答

0

如果有人遇到同樣的問題(我不認爲我是唯一不幸的人)。

這裏是我最終通過尋找解決方案:

看來,這兩個指令中,第一個首先必須運行(如果需要的話就AVFoundation任何專家都歡迎作出進一步的評論):

stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) 
captureSession.stopRunning() 

而且發射閃光的事實使得訂單有些隨機。 爲了解決這個問題,我在第一個指令的完成塊中引入了第二條指令,通過這樣做確保指令總是相同的。

那麼我可以用:

captureDevice.flashMode = .On // or .Off or .Auto 

,它所有的作品。

請注意,它是設置閃光燈使用模式的代碼,而不是每次閃光燈閃光時觸發的代碼(如本帖開頭所示)。