【问题标题】:Getting flash to work with AVFoundation Camera让闪光灯与 AVFoundation 相机一起工作
【发布时间】:2016-02-09 23:04:15
【问题描述】:

我使用 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)
            }
         })
      }
   }

【问题讨论】:

    标签: ios swift camera avfoundation


    【解决方案1】:

    来自文档:

    在您尝试设置捕获设备的属性(其焦点模式、曝光模式等)之前,您必须首先使用lockForConfiguration: 方法获取设备上的锁定。然后,您可以使用unlockForConfiguration 方法设置属性并释放锁定。

    我没有看到你这样做。

    【讨论】:

    • 是的,我在阅读文档时发现了这一点。感谢您的回复@Matt!
    【解决方案2】:

    想通了,以防其他人遇到这种情况。而不是

    if backCamera.hasFlash {
    
         backCamera.flashMode = AVCaptureFlashMode.Auto
    }
    

    应该是……

    if backCamera.hasFlash {
    
       do {
    
          try backCamera.lockForConfiguration()
          backCamera.flashMode = AVCaptureFlashMode.Auto
          backCamera.unlockForConfiguration()
    
        } catch {
    
    // handle error
    }
    

    【讨论】:

    • 还是不对,因为你忘记解锁了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多