2016-03-19 20 views
1

Ich habe schwierige Zeiten, für etwas, das ich denke, sollte einfach sein. Ich möchte nur den Blitz anzünden, wenn ich ein Bild in meiner iOS App mache. Und alles, was ich versucht habe, scheiterte oder arbeitet nur 20 Prozent.Kann AVCaptureDevice nicht mit einem Blitz verwenden

Hier ist der Code gebrannt, um den Blitz zu beleuchten:

// 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) 
    } 

ich mehrere Varianten des Codes versucht haben, durch die zwei Linien innerhalb des try-Blocks bis zum Ende zu bewegen, oder durch Aufruf der Funktion enthalten, dieser Code von verschiedenen Punkten. Aber in allen Fällen zum Zeitpunkt der diese ausgeführt wird:

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

bekomme ich folgende Fehlermeldung:

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} 

Wenn ich dann ersetzen Sie die Zeile:

captureDevice.flashMode = .On 

von:

captureDevice.torchMode = .On 

Ich bekomme etwas mehr oder weniger funktioniert (leider eher weniger), ohne Fehler, aber das die Fackel verwendet, so dass ich Timing-Probleme:

Auch ist es nicht klar, ob ich diese Linie zu einem bestimmten Zeitpunkt verwenden, muß in meinem Code:

captureSession.commitConfiguration() 

Antwort

0

Falls jemand anderes das gleiche Problem hat (ich kann nicht denken, dass ich der einzige bin, der Pech hat!).

Hier ist die Lösung, die ich von der Suche endete:

Es scheint, dass unter diesen beiden Anweisungen, die erste zuerst ausgeführt werden muss (auf AVFoundation jeder Experte ist willkommen weitere Ausführungen zu machen, wenn erforderlich):

Und die Tatsache des Abfeuerns des Blitzes macht die Reihenfolge etwas zufällig. Um das zu lösen, habe ich den zweiten Befehl in den Completion-Block des ersten eingefügt, um sicherzustellen, dass die Reihenfolge immer gleich ist.

Dann kann ich verwenden:

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

und alles funktioniert.

Beachten Sie, dass es Code ist, um den Modus einzustellen, den der Blitz verwendet, nicht Code, der bei jeder Blitzbeleuchtung ausgelöst wird (wie zu Beginn dieses Beitrags vorgeschlagen).