AVFoundation - 如何在捕获图像之前将 Flash 设置为自动/关闭

Posted

技术标签:

【中文标题】AVFoundation - 如何在捕获图像之前将 Flash 设置为自动/关闭【英文标题】:AVFoundation - How to set the Flash on Auto/Off before the image is captured 【发布时间】:2017-07-22 09:44:50 【问题描述】:

我正在做一个类似 Instagram 的应用程序,我有 ATM 一个工作代码,可以捕获照片并将其保存在设备的照片库中。摄像头预览用作后/前摄像头开关。我现在遇到的问题是在捕获功能中提供一段代码,以便在我按下按钮时将闪光灯设置为 .auto 或 .off,这样当我拍摄照片时,闪光灯就会工作。这是我的捕获代码:

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) 

        if let error = error 
            print("error occure : \(error.localizedDescription)")
        

        if  let sampleBuffer = photoSampleBuffer,
            let previewBuffer = previewPhotoSampleBuffer,
            let dataImage =  AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer:  sampleBuffer, previewPhotoSampleBuffer: previewBuffer) 
            print(UIImage(data: dataImage)?.size as Any)

            let dataProvider = CGDataProvider(data: dataImage as CFData)
            let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent)
            let image = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right)
            UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)
            self.cameracapture.image = image
         else 
            print("some error here")
        
    

【问题讨论】:

【参考方案1】:

这是我使用的代码:

let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    if device.hasTorch 
        do 
            try device.lockForConfiguration()
            device.torchMode = AVCaptureTorchMode.On
            device.torchMode = AVCaptureTorchMode.Off
            device.torchMode = AVCaptureTorchMode.Auto
            device.unlockForConfiguration()
         catch 
            print(error)
        
    

希望对您有所帮助。 :)

【讨论】:

我试过这段代码,它可以工作,但第一行有一个不推荐使用的方法,ios 10 的新方法是:AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 关于其余代码,device 是可选的,xcode 8.2 告诉我放一个 ?在设备之后。 谢谢,我唯一需要了解的是如何在将实际图像保存到库中之前告诉应用程序使用闪光灯(如果它设置为自动)。在黑暗的环境中尝试过,不起作用:( 在相同的环境下,普通的相机闪光灯在自动模式下工作吗? 它没有。当我按下连接到捕获功能的按钮时,在 .auto 模式下,该过程只拍照,如果需要,它不会等待闪光灯【参考方案2】:
func toggleFlash() 
    let avDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
    if (avDevice?.hasTorch)! 
        do 
            _ = try avDevice?.lockForConfiguration()
         catch let err as NSError 
            report(err.localizedDescription)
        

        if (avDevice?.isTorchActive)! 
            avDevice?.torchMode = AVCaptureTorchMode.off
         else 
            do 
                _ = try avDevice?.setTorchModeOnWithLevel(1.0)
             catch let err as NSError 
                report(err.localizedDescription)
            
        
        avDevice?.unlockForConfiguration()
    

这是一个例子。您还可以设置自动模式:

avDevice?.torchMode = AVCaptureTorchMode.auto

【讨论】:

您好,感谢您的帮助。我实现了它并且它可以工作,但是代码使我的相机预览崩溃。图像冻结,但应用程序不会崩溃,直到我点击相机开关按钮。你能帮我解决这个问题吗? 更新:好的崩溃已解决(在前置摄像头模式下,在后面没有问题)。现在,当我按下按钮拍照时,应用程序会保存它,但在黑暗环境中设置为自动的闪光灯不起作用:(

以上是关于AVFoundation - 如何在捕获图像之前将 Flash 设置为自动/关闭的主要内容,如果未能解决你的问题,请参考以下文章

获取使用 AVFoundation 的 AVCaptureStillImageOutput 捕获的图像的地理位置

swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法

IOS8:AVFoundation 相机冻结

当预设为640x480时,为什么使用AVFoundation捕获图像会给我480x640图像?

AVFoundation 图像方向在预览中偏离了 90 度,但在相机胶卷中很好

使用 OpenCV 和 AVFoundation 框架的 iPhone 实时图像处理?