质量:自定义 AVFoundation 相机应用程序 VS。 iOS 标准相机应用

Posted

技术标签:

【中文标题】质量:自定义 AVFoundation 相机应用程序 VS。 iOS 标准相机应用【英文标题】:Quality: Custom AVFoundation Camera App VS. iOS standard Camera App 【发布时间】:2016-02-06 19:14:09 【问题描述】:

我已经使用不同的主题和照明进行了许多测试。每个测试都显示标准 ios 相机应用程序的质量明显优于我的自定义基于 AVFoundation 的应用程序(颜色不会褪色、对焦更好、照明更好、颗粒感更少)。我无法解释巨大的差异。下面是使用两种方法(使用前置摄像头)拍摄的视频的示例屏幕截图。

iOS 标准相机应用

自定义 AVFoundation 录制的视频

自定义实现代码:

let chosenCameraType = AVCaptureDevicePosition.Front

//get camera
let devices = AVCaptureDevice.devices()
for device in devices

    if (!device.hasMediaType(AVMediaTypeVideo))
    
        continue
    

    if (device.position != chosenCameraType)
    
        continue
    

    camera = (device as? AVCaptureDevice)!


do

    captureSession = AVCaptureSession()
    captureSession!.sessionPreset = AVCaptureSessionPresetHigh      

    let video = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput
    captureSession!.addInput(video)

    let audio = try AVCaptureDeviceInput(device: AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeAudio)) as AVCaptureDeviceInput
    captureSession!.addInput(audio)

    fileOutput = AVCaptureMovieFileOutput()
    captureSession?.addOutput(fileOutput)

    captureSession!.startRunning()

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString

    let name = String(UInt64(NSDate().timeIntervalSince1970 * 1000))
    fileOutput?.startRecordingToOutputFileURL(NSURL(fileURLWithPath: "\(documentsPath)/" + name + ".mov"), recordingDelegate: self)

catch let error as NSError

    print(error)

请尝试!您也会看到不同之处...

【问题讨论】:

您的所有测试都是在低水平或人工照明下进行的吗?您可能需要启用“lowLightBoost”。 AVCaptureDevice 上有一个属性,automaticEnablesLowLightBoostWhenAvailable。这可能会弥补您所看到的差异。 是的,该测试是在弱光下进行的。我尝试启用您建议的该属性,但它说在使用前置摄像头进行测试时不支持它。我发布的主要图片显示了照明问题,但我所做的其他测试显示了更多问题(尤其是当我测试我的肖像时)。与我使用 AVFoundation 进行的测试相比,默认的相机应用看起来很壮观(没有褪色、适当的照明、更少的颗粒感、锐利等),看起来它是用 5 美分的 CMOS 传感器完成的。 您是否尝试过其他低光增强应用方法?您是否将您的结果与 Apple 的 AVCam-iOS 示例代码的结果进行了比较? 我不认为您的测试在某种程度上是有效的,AVFoundation 有很多选项可以重新创建相机应用程序的质量。例如,您没有设置 AVCaptureDeviceFormat,既没有设置曝光也没有设置焦点。您几乎没有使用默认值。所以你的结果很大程度上取决于你的代码实现,很抱歉,这很简单。要进行更好的测试,请尝试下载此developer.apple.com/library/prerelease/ios/samplecode/… 你的会话预设是什么? 【参考方案1】:

我注意到你在描述什么并且查看你的代码我没有看到你实现:

backCamera.focusPointOfInterest = focusPoint
backCamera.focusMode = AVCaptureFocusMode.autoFocus
backCamera.exposureMode = AVCaptureExposureMode.autoExpose

我在touchesBegan 内部实现了这一点,以便相机将聚焦在用户触摸屏幕的区域。这是那段代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
        let touchPoint = touches.first
        let x = (touchPoint?.location(in: self.view).x)! / self.view.bounds.width
        let y = (touchPoint?.location(in: self.view).y)! / self.view.bounds.height

        let realX = (touchPoint?.location(in: self.view).x)!
        let realY = (touchPoint?.location(in: self.view).y)!

        let focusPoint = CGPoint(x: x, y: y)

        let k = DrawSquare(frame: CGRect(
            origin: CGPoint(x: realX - 75, y: realY - 75),
            size: CGSize(width: 150, height: 150)))


        if backCamera != nil 
            do 
                try backCamera.lockForConfiguration()
                self.previewView.addSubview(k)
            
            catch 
                print("Can't lock back camera for configuration")
            
            if backCamera.isFocusPointOfInterestSupported 
                backCamera.focusPointOfInterest = focusPoint
            
            if backCamera.isFocusModeSupported(AVCaptureDevice.FocusMode.autoFocus) 
                backCamera.focusMode = AVCaptureDevice.FocusMode.autoFocus
            
            if backCamera.isExposureModeSupported(AVCaptureDevice.ExposureMode.autoExpose) 
                backCamera.exposureMode = AVCaptureDevice.ExposureMode.autoExpose
            
            backCamera.unlockForConfiguration()

        
        DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) 
            k.removeFromSuperview()
        
    

当相机显示暗图像时,用户只需点击屏幕,它就会调整曝光和焦点,从而使图像变亮。

【讨论】:

以上是关于质量:自定义 AVFoundation 相机应用程序 VS。 iOS 标准相机应用的主要内容,如果未能解决你的问题,请参考以下文章

AVFoundation的自定义相机

swift使用AVFoundation实现自定义相机

用AVFoundation自定义相机拍照

swift使用AVFoundation实现自定义相机

使用AVFoundation 自定义相机和录制视频

自定义相机纵横比