我有一个项目,它可以渲染视频播放并应用CIFilters。我知道可以使用视频合成来获得带有滤镜的视频,但问题是需要可滑动的滤镜(并预览下一个滤镜,因此我们使用第一个imageview进行掩模,然后使用下一个滤镜对第二个imageview进行过滤)。
func displayLinkDidRefresh(link: CADisplayLink){
let itemTime = videoOutput.itemTime(forHostTime: CACurrentMediaTime())
if videoOutput.hasNewPixelBuffer(forItemTime: itemTime) {
if let pixelBuffer = videoOutput.copyPixelBuffer(forItemTime: itemTime, itemTimeForDisplay: nil){
unfilteredImage = CIImage(cvImageBuffer: pixelBuffer)
displayFilteredImage(unfilteredImage: unfilteredImage)
}
}
}
以下是用于创建AVPlayer实例和CADisplayLink的代码:
player = AVPlayer(playerItem: item)
player.isMuted = true
displayLink = CADisplayLink(target: self, selector: #selector(displayLinkDidRefresh(link:)))
displayLink!.preferredFramesPerSecond = 24
displayLink!.add(to: RunLoop.main, forMode: RunLoopMode.commonModes)
NotificationCenter.default.addObserver(self, selector: #selector(self.playerItemDidReachEnd(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.player.currentItem)
在调试器中运行时,我没有经历到卡顿(或者最小程度的卡顿),但是从归档中构建后就有很多卡顿。我的测试方法是删除手机上的应用程序,然后将其安装到手机上进行测试,就像说调试版本没问题,但是归档版本会出现问题。对此有什么建议吗?
编辑1:
设法让它表现得更好了,但是当项目和播放器状态都准备好时,将视频合成附加到播放器项后仍然会出现卡顿。