gpt4 book ai didi

swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法

转载 作者:行者123 更新时间:2023-11-30 12:16:29 24 4
gpt4 key购买 nike

您好,我对 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 View 。各自的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
}
}
}

}

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

最佳答案

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

我不知道两个不同的捕获函数是否在两个不同的线程上完成。据我所知,由于 AVFoundation 套件不是开源的。

我认为这并不重要。

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

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

关于swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com