gpt4 book ai didi

ios - 如何在不等待处理的情况下将 CIFilter 应用于 Swift 中的视频

转载 作者:行者123 更新时间:2023-11-28 05:37:59 25 4
gpt4 key购买 nike

我目前正在我的一个应用程序中开发一项功能,用户可以在其中向帖子添加照片和视频。他们可以录制视频或拍照,但之后我想让他们通过应用滤镜或更改亮度、对比度、曝光等来完全控制输出...

这对照片来说相对容易。为了简化工作流程,我使用了一个名为 BBMetalImage 的第三方库.这很好用,我可以对照片和视频应用滤镜,但处理视频需要很长时间,我不希望我的用户这样做。应用滤镜时,一个 15 秒的剪辑可能会很快花费 20 - 30 秒以上的时间来处理。

我目前是这样做的:

var lookupFilterName: String! = "lookup_1"
let outputURL = URL(fileURLWithPath: "\(NSTemporaryDirectory())\(NSUUID().uuidString).mp4")
try? FileManager.default.removeItem(at: outputURL)
videoWriter = BBMetalVideoWriter(url: outputURL, frameSize: BBMetalIntSize(width: 480, height: 600))
videoSource = BBMetalVideoSource(url: currentVideoURL!)
videoSource.audioConsumer = videoWriter
if(filter != 0) {
lookupFilterName = "lookup_\(filter)"
}
let lookupFilter = BBMetalLookupFilter(lookupTable: UIImage(named: lookupFilterName)!.bb_metalTexture!)
videoSource.add(consumer: lookupFilter).add(consumer: videoWriter)
videoSource.audioConsumer = videoWriter
videoWriter.start()
videoSource.start { [weak self] (_) in
guard let self = self else { return }
self.videoWriter.finish {
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
if(self.currentVideoURL != nil) {
self.queuePlayer?.pause()
self.queuePlayer?.removeAllItems()
if let playerLayer = self.playerLayer {
playerLayer.removeFromSuperlayer()
}
self.currentFinalVideoURL = outputURL
let playerItem = AVPlayerItem(url: outputURL)
self.queuePlayer = AVQueuePlayer(items: [playerItem])
self.playerLayer = AVPlayerLayer(player: self.queuePlayer)
self.playerLooper = AVPlayerLooper(player: self.queuePlayer!, templateItem: playerItem)
self.videoPreview.layer.addSublayer(self.playerLayer!)
self.playerLayer?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.width * 1.25)
self.playerLayer?.backgroundColor = UIColor.black.cgColor
self.queuePlayer?.play()
self.videoWriter = nil
self.videoSource = nil
} else {
self.videoWriter = nil
self.videoSource = nil
}
}
}
}

请不要误会我的意思。它完成了工作:它返回应用了过滤器的视频。基本上发生的事情是,它获取原始视频的源 URL,对其应用过滤器,将其写入另一个临时路径,然后将此视频显示给用户。

在我看来,这必须要快得多。我开始关注其他应用程序,尤其是 Instagram,在其中,当您应用过滤器时,它会立即更改(甚至不需要一秒钟)并继续播放视频而无需从第一帧重新开始。这才是我真正想要的。

我已经对此进行了一些研究,并发现我应该使用 CIFilter,因为 Core Image 提供了一种非常快速且可靠的方式来处理照片(和视频?)。

所以我的问题是:

  1. 我能否在使用 CIFilter 时应用定制的查找过滤器或 LUT,或者我是否只能使用 Core Image 框架中提供的内置过滤器(例如 GaussianBlur 等)?
  2. 我应该如何“实时”更改视频,而不会为最终用户造成延迟?我在某处读到这是使用缓冲区完成的,之后视频的每一帧都以所需的效果进行操作并实时播放。关于如何实现这一目标的任何引用或示例?我不知道从哪里开始处理这个具体问题。我还希望能够在用户停止编辑(滤镜、亮度、对比度……)时导出此视频。

干杯!欢迎提供所有信息。

最佳答案

AVFoundation 框架可以轻松地逐帧处理视频。它每次都会从当前时间的视频中生成像素缓冲帧,并让您根据需要在帧上添加任何效果(过滤器、亮度、对比度,无论您想要什么)。实时处理帧可以在 GPU 上完成。 OpenGLMetal 这些都可以用于此。它还将帮助您使用自己定制的过滤器。可以关注这个link开始。

关于ios - 如何在不等待处理的情况下将 CIFilter 应用于 Swift 中的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57991050/

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