我目前正在使用 aCADisplayLink
从AVPlayerItemVideoOutput
. 显示链接是这样更新的;
func displayLinkUpdated(link: CADisplayLink) {
let time = output.itemTime(forHostTime: CACurrentMediaTime())
guard output.hasNewPixelBuffer(forItemTime: time), let buffer = output.copyPixelBuffer(forItemTime: time, itemTimeForDisplay: nil) else { return }
...
}
我想用同样output
的方法提前 1 秒抓取一个像素缓冲区。由于我的视频是 30fps,我想我可以CMTimeMakeWithSeconds
用来做以下事情;
func displayLinkUpdated(link: CADisplayLink) {
let time = output.itemTime(forHostTime: CACurrentMediaTime())
let timeB = CMTimeAdd(CMTimeMakeWithSeconds(CMTimeGetSeconds(time) + 1, preferredTimescale: time.timescale), time)
guard output.hasNewPixelBuffer(forItemTime: time), let buffer = output.copyPixelBuffer(forItemTime: time, itemTimeForDisplay: nil) else { return }
guard let bufferB = output.copyPixelBuffer(forItemTime: timeB, itemTimeForDisplay: nil) else { return }
...
}
当我尝试这样做,然后执行我...
的后期处理时,我体验到的回放非常不稳定。如果我let timeB = time
只是为了测试而设置的话,我的后期处理和播放就恢复了正常和流畅。
是否有任何解释为什么这种方法不起作用或更有效