从档案构建的CADisplayLink出现卡顿问题

3

我有一个项目,它可以渲染视频播放并应用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:

设法让它表现得更好了,但是当项目和播放器状态都准备好时,将视频合成附加到播放器项后仍然会出现卡顿。

1个回答

0
经过一段时间的尝试,我发现问题所在,并非代码有误。问题出在我们的应用中嵌入了Appsee分析工具,需要在这些屏幕上暂停它,以便它们能够正确地呈现。之所以在调试模式下没有遇到这些问题,是因为AppDelegate中的条件语句阻止了Appsee在调试环境中的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接