2017-01-06 3 views
0

Je veux synchroniser les appels setFocusModeLockedWithLensPosition, setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains et setExposureModeCustomWithDuration.Comment puis-je synchroniser AVCaptureDevice appel setFocusModeLockedWithLensPosition

Y a-t-il un ordre logique pour appeler ces fonctions?

Ce que je veux faire est de commencer la session en cours quand je suis sûr que l'accent, l'équilibre et l'exposition sont correctement réglés (je veux définir des valeurs, pas en automatique)

J'ai essayé de verrouiller la configuration, puis appelez les 3 fonctions, puis déverrouillez, puis démarrezRunning on session. Je mets zéro dans les 3 paramètres du gestionnaire d'achèvement. Ce que je vois dans ce cas est que mon aperçu d'image n'est pas joli (sorte de filtre bleu). Je dois attendre avant d'avoir une bonne qualité d'image. Ce que je veux c'est afficher l'image seulement quand c'est bon. Je veux être averti. J'ai donc essayé de mettre en cascade mes 3 appels avec le gestionnaire de complétion. dans certains cas, le gestionnaire d'achèvement n'est pas appelé. Je suppose que c'est quand je veux mettre ma position de l'objectif à 0,4 et la position actuelle de l'objectif est de 0,4.

Donc je ne sais pas quelle est la meilleure méthode.

Merci

Répondre

1

Vous pouvez définir vos options de la caméra dans le gestionnaire d'achèvement comme celui-ci. Il attendra que la mise au point ait été réglée pour régler l'exposition et le même principe fonctionnera avec la balance des blancs et l'exposition. Vous pouvez en savoir plus sur le réglage de l'appareil photo here.

var AVCGains:AVCaptureWhiteBalanceGains = AVCaptureWhiteBalanceGains() 
AVCGains.redGain = 1.0; 
AVCGains.greenGain = 1.0; 
AVCGains.blueGain = 1.0; 

self.camera?.focusMode = .locked 
self.camera?.exposureMode = .locked 
self.camera?.whiteBalanceMode = .locked 

self.camera?.setFocusModeLockedWithLensPosition(focus_point, completionHandler: {(timestamp:CMTime) -> Void in 
     print("Focus applied") 
     self.camera?.setExposureModeCustomWithDuration(CMTimeMake(1,10), iso: 100, completionHandler: {(timestamp:CMTime) -> Void in 
       print("Exposure applied") 
       self.camera?.setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains(AVCGains, completionHandler: {(timestamp:CMTime) -> Void in 
         print("White Balance applied") 
         // All settings have been applied, start running session 
       }) 
     }) 
}) 
+0

C'est exactement ce que j'ai essayé. Mais dans certains cas, le gestionnaire d'achèvement n'est pas appelé. Dans d'autres cas, je dois attendre quelques secondes après avoir démarré la session car il semble que les paramètres sont réellement appliqués quand la session est en cours – Bob5421

+0

Le gestionnaire d'achèvement sera toujours appelé (lorsque le réglage a été appliqué), assurez-vous que vous avez bien verrouillé , l'exposition et la balance des blancs autrement handler de fin [ne sera pas] (https://developer.apple.com/reference/avfoundation/avcapturedevice/1624568-setwhitebalancemodelockedwithdev#parameters) être appelé. Si ce code ne fonctionne pas, il se passe quelque chose d'autre parce que j'ai testé cela et cela fonctionne. – Tuc3k