2016-03-19 6 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 строки внутри Ьги блока до конца, или путем вызова функции, содержащую этот код из разных точек. Но во всех случаях в момент запуска этого:

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 

и все это работает.

Обратите внимание, что это код для установки режима, который использует вспышка, а не кода, который срабатывает при каждом включении вспышки (как это было предложено в начале этого сообщения).