swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法

Posted

技术标签:

【中文标题】swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法【英文标题】:swift avfoundation AVCapturePhotoCaptureDelegate capture method 【发布时间】:2017-07-28 15:20:39 【问题描述】:

您好,我对 swift 和 avfoundation 框架比较陌生。我目前正在尝试实现一个使用图像处理的自定义玩具相机应用程序。我的问题是我正在尝试使用我的图像处理算法自动处理每个帧或每个 X 帧,然后将图层应用于预览,并且还允许用户捕获预览图像并使用 IBAction ui 按钮将该图像输出到屏幕。图像处理步骤将捕获不输出到屏幕的较低分辨率图像,而 ibaction 捕获应捕获标准 jpeg 并将其输出到屏幕。

我的问题是实现这样的事情的最佳方式是什么?

我注意到逻辑可能会进入 AVCapturePhotoCaptureDelegate 方法capture(_ captureOutput: AVCapturePhotoOutput, ...),但据我了解,还有两个不同的 AVCapturePhotoOutput() 对象调用capturePhoto(with: photoSettings, delegate: self) 调用capture(_ captureOutput: AVCapturePhotoOutput, ...)。我会检查 capture(_ captureOutput: AVCapturePhotoOutput, ...) 方法,哪个 captureOutput 对象是从不同的 AVCapturePhotoOutput() 对象调用的 capturePhoto(with: photoSettings, delegate: self) 方法发送的?

capture(_ captureOutput: AVCapturePhotoOutput, ...) 的完整方法签名在哪里

capture(_ captureOutput: AVCapturePhotoOutput,
                 didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?,previewPhotoSampleBuffer: CMSampleBuffer?,
                 resolvedSettings: AVCaptureResolvedPhotoSettings,
                 bracketSettings: AVCaptureBracketedStillImageSettings?,
                 error: Error?)

或者这两个不同的捕获函数会在两个不同的线程上完成吗?

为了进一步详细说明,我有两个工作相机应用程序,它们具有两种不同的功能。一个具有图像处理和图层实现,另一个具有预览捕获和输出到 UI 视图。各自的 AVCapturePhotoCaptureDelegate 捕获方法如下:

图像处理相机:

  public func capture(_ captureOutput: AVCapturePhotoOutput,
                      didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?,
                      previewPhotoSampleBuffer: CMSampleBuffer?,
                      resolvedSettings: AVCaptureResolvedPhotoSettings,
                      bracketSettings: AVCaptureBracketedStillImageSettings?,
                      error: Error?) 

    var imageTexture: MTLTexture?
    var previewImage: UIImage?
    if error == nil 
      imageTexture = convertToMTLTexture(sampleBuffer: photoSampleBuffer)
      previewImage = convertToUIImage(sampleBuffer: previewPhotoSampleBuffer)
    
    delegate?.videoCapture(self, didCapturePhotoTexture: imageTexture, previewImage: previewImage)
  

将图像捕获到 UI 相机:

func capture(_ captureOutput: AVCapturePhotoOutput,
             didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?,previewPhotoSampleBuffer: CMSampleBuffer?,
             resolvedSettings: AVCaptureResolvedPhotoSettings,
             bracketSettings: AVCaptureBracketedStillImageSettings?,
             error: Error?) 

    if let error = error 
        print("Error capturing photo: \(error)")
     else 
        if let sampleBuffer = photoSampleBuffer,
           let previewBuffer = previewPhotoSampleBuffer,
        let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer) 

            if let image = UIImage(data: dataImage) 
                self.capturedImage.image = image
            
        
    


这里 captureImage 是 @IBOutlet weak var capturedImage: UIImageView! 并且转换方法是自定义类中的函数。我将如何将这两种 capture(...) 方法的功能集成到一个应用程序中?

【问题讨论】:

最好是完成方法名` capture(_ captureOutput: AVCapturePhotoOutput, ...) `, 是func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?,已解决设置:AVCaptureResolvedPhotoSettings,括号设置:AVCaptureBrackedStillImageSettings?,错误:错误?) 正确。这是完整方法的名称。 【参考方案1】:

我认为苹果的文档AVCapturePhotoOutput 很清楚。你应该看看。

我不知道两个不同的捕获功能是否在两个不同的线程上完成。因为据我所知,AVFoundation Kit 不是开源的。

我认为这不重要。

作为苹果的文档,通过capturePhoto(with:delegate:)注册delegate,通过苹果默认实现的回调photoOutput(_:didFinishProcessingPhoto:error:)获取图片

顺便说一句,photoOutput(_:didFinishProcessingPhoto:previewPhoto:resolvedSettings:bracketSettings:error:) 方法已被弃用。你可以查看this page

【讨论】:

那么每个委托都可以有自己的 capture(...) 方法吗? 是的。每个委托都会监控捕获进度—— willBegin 、willCapture、didCapture、didFinish 。非常抱歉。刚才我把回复误认为是另一个问题。 @stochasticcrap,你遇到了什么问题吗?

以上是关于swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法的主要内容,如果未能解决你的问题,请参考以下文章

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

swift使用AVFoundation实现自定义相机

Swift 4 AVFoundation - 同时录制多个音频源

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

Swift AVFoundation 二维码扫描和生成

swift使用AVFoundation实现自定义相机