让闪光灯与 AVFoundation Camera 一起工作

Getting flash to work with AVFoundation Camera

我使用 AVFoundation 创建了一个相机。我想将闪光灯设置为自动,这样用户就不必处理它。我尝试添加代码 backCamera.flashMode = AVCaptureFlashMode.Auto,但它似乎不起作用。非常感谢您提供的任何反馈!!

     func setUpCamera() {

              captureSession = AVCaptureSession()
              captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

              let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

    // CODE THAT SEEMS LIKE IT SHOULD WORK
                    if backCamera.hasFlash {

                       backCamera.flashMode = AVCaptureFlashMode.Auto
                    }
              var error: NSError?
              var input: AVCaptureDeviceInput!

              do {
                 input = try AVCaptureDeviceInput(device: backCamera)

              } catch let error1 as NSError {

                 error = error1
                 input = nil
              }

              if error == nil && captureSession!.canAddInput(input) {

                 captureSession!.addInput(input)

                 stillImageOutput = AVCaptureStillImageOutput()
                 stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

                 if captureSession!.canAddOutput(stillImageOutput) {

                    captureSession!.addOutput(stillImageOutput)
                    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                    previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
                    previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
                    previewVideoView.layer.addSublayer(previewLayer!)
                    captureSession!.startRunning()
                 }
              }
           }

   @IBAction func onSnapPhotoButtonPressed(sender: UIButton) {

      if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {

         videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
         stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(sampleBuffer, error) in

            if (sampleBuffer != nil) {

               let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
               let dataProvider = CGDataProviderCreateWithCFData(imageData)
               let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)

               let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
               self.imageView.image = image

               self.clearPhotoButton.hidden = false
               self.nextButton.hidden = false
               self.view.bringSubviewToFront(self.imageView)
            }
         })
      }
   }

弄明白了,以防其他人遇到这个问题。而不是

if backCamera.hasFlash {

     backCamera.flashMode = AVCaptureFlashMode.Auto
}

应该是...

if backCamera.hasFlash {

   do {

      try backCamera.lockForConfiguration()
      backCamera.flashMode = AVCaptureFlashMode.Auto
      backCamera.unlockForConfiguration()

    } catch {

// handle error
}

来自文档:

Before you attempt to set properties of a capture device (its focus mode, exposure mode, and so on), you must first acquire a lock on the device using the lockForConfiguration: method. You can then set the properties and release the lock using the unlockForConfiguration method.

我没看到你这样做。