质量:自定义 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 标准相机应用的主要内容,如果未能解决你的问题,请参考以下文章