从AVCaptureVideoPreviewLayer实时缩放

时间:2017-10-24 22:07:50

标签: ios swift swift3 ios-camera

我正在实施相机应用程序。我按照以下方式启动相机:

  let input = try AVCaptureDeviceInput(device: captureDevice!)
  captureSession = AVCaptureSession()
  captureSession?.addInput(input)
  videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
  videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
  videoPreviewLayer?.frame = view.layer.bounds
  previewView.layer.insertSublayer(videoPreviewLayer!, at: 0)

现在我希望在预览图层的顶部有一个小矩形。在该矩形区域中,我想从预览图层缩放特定区域。为此,我在其他视图之上添加了一个新的UIView,但我不知道如何从预览器中显示特定区域(例如缩放系数= 2)。 下图显示了我想要的内容: enter image description here 我该怎么办?

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案。 我们的想法是从摄像机的输出中提取实时帧,然后使用UIImage视图显示放大的帧。以下是添加视频输出的代码部分:

let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "sample buffer"))
guard captureSession.canAddOutput(videoOutput) else { return }
captureSession.addOutput(videoOutput)

我们需要实现一个委托函数:

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
    guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else { return }
    DispatchQueue.main.async { [unowned self] in
      self.delegate?.captured(image: uiImage)
    }
}

private func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage? {
    guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return nil }
    let ciImage = CIImage(cvPixelBuffer: imageBuffer)
    guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else { return nil }
    return UIImage(cgImage: cgImage)
}

代码来自此article