来自 AVCaptureVideoPreviewLayer 的实时缩放

Posted

技术标签:

【中文标题】来自 AVCaptureVideoPreviewLayer 的实时缩放【英文标题】:Realtime zoom from AVCaptureVideoPreviewLayer 【发布时间】:2017-10-24 22:07:49 【问题描述】:

我正在实现一个相机应用程序。我按如下方式启动相机:

  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)。 下图显示了我想要的: 我该怎么做?

【问题讨论】:

【参考方案1】:

最后,我找到了解决方案。 这个想法是从相机的输出中提取实时帧,然后使用 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。

【讨论】:

使用这个代码你能放大画在中间的特定线吗? 当然,只要把实时输出,缩放然后放到UIImageView中 但我猜它不可行。就像我每秒获取图像并将其设置为 imageview 一样,它会造成内存泄漏 嗯,它的工作原理实际上我没有写 CGImageRelease 这就是它造成内存泄漏的原因

以上是关于来自 AVCaptureVideoPreviewLayer 的实时缩放的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用

来自 viewDidAppear 的 Segue 调用有效,但不是来自 viewWillAppear

求职作业帮 C++方向面经

来自 CWnd 的 ReleaseDC 覆盖来自 winuser 的 ReleaseDC

来自麦克风的声音与来自扬声器的声音

Liferay,来自搜索的 Freemarker 错误模板,但不是来自其他链接