如何使用 swift avfoundation 设置前置摄像头变焦

Posted

技术标签:

【中文标题】如何使用 swift avfoundation 设置前置摄像头变焦【英文标题】:how to set fron-facing camera zoom with swift avfoundation 【发布时间】:2016-04-14 12:11:11 【问题描述】:

我正在尝试使用 swift 制作应用程序,并且我想使用前置摄像头。 我使用了 AVFoundation 并尝试了一些代码。但我无法设置前置缩放参数。是否可以?对于后置摄像头,一切正常。

我不想使用仿射变换。因为,它可能会降低图像质量。那么,如何以编程方式设置此参数?

谢谢。

【问题讨论】:

【参考方案1】:

您需要为您的相机添加一个 zoomFactor 变量。

  var zoomFactor: CGFloat = 1.0

接下来定义一个函数zoom,与捏合识别器一起使用。我假设您已经创建了一个前置捕获设备和输入。 frontDevice 是我相机上的可选捕捉设备。这是我缩放该设备的方法。

  public func zoom(pinch: UIPinchGestureRecognizer) 
    guard let device = frontDevice else  return 
    func minMaxZoom(_ factor: CGFloat) -> CGFloat  return min(max(factor, 1.0), device.activeFormat.videoMaxZoomFactor) 

    func update(scale factor: CGFloat) 
      do 
        try device.lockForConfiguration()
        defer  device.unlockForConfiguration() 
        device.videoZoomFactor = factor
       catch 
        debugPrint(error)
      
    

    let newScaleFactor = minMaxZoom(pinch.scale * zoomFactor)

    switch pinch.state 
      case .began: fallthrough
      case .changed: update(scale: newScaleFactor)
      case .ended:
        zoomFactor = minMaxZoom(newScaleFactor)
        update(scale: zoomFactor)
      default: break
    
  

最后在某个视图中添加捏合识别器。

  let pgr = UIPinchGestureRecognizer(target: self, action: #selector(zoom))
  view.addGestureRecognizer(pgr)

【讨论】:

【参考方案2】:

前面的答案可以不用内部方法来完成,让它更直接易懂。

完整解释代码:

zoom 变量会跟踪您在最后一个手势之后的缩放比例。在任何手势发生之前没有缩放,所以你在 1.0。

在手势期间,pinchscale 属性保存活动手势期间的捏合比例。当您的手指没有从其初始位置移动并随着捏合而增长和收缩时,这是 1.0。通过将其与先前持有的 zoom 相乘,您可以得到手势发生时的比例。将此比例保持在[1, device.activeFormat.videoMaxZoomFactor] 的范围内很重要,否则您将获得SIGABRT

当手势完成时 (pinch.state),您需要更新 zoom 以便下一个手势以当前缩放级别开始。

修改相机属性时锁定很重要,以避免并发修改。 defer 无论如何都会在代码块之后释放锁,类似于finally 块。

var zoom: CGFloat = 1.0

@objc func pinch(_ pinch: UIPinchGestureRecognizer) 
    guard let device = frontDevice
      else  return 
    let scaleFactor = min(max(pinch.scale * zoom, 1.0), device.activeFormat.videoMaxZoomFactor)

    if pinch.state == .ended 
      zoom = scaleFactor
    

    do 
      try device.lockForConfiguration()
      defer  device.unlockForConfiguration() 

      device.videoZoomFactor = scaleFactor
     catch 
      print(error)
    

【讨论】:

以上是关于如何使用 swift avfoundation 设置前置摄像头变焦的主要内容,如果未能解决你的问题,请参考以下文章

如何将代码 AVFoundation 目标 c 转换为 Swift?

如何使用 swift avfoundation 设置前置摄像头变焦

使用 AVFoundation 和 Swift 访问多个音频硬件输出/通道

swift使用AVFoundation实现自定义相机

swift 在Swift中使用AVFoundation修剪视频

swift使用AVFoundation实现自定义相机