1

我目前正在使用 aCADisplayLinkAVPlayerItemVideoOutput. 显示链接是这样更新的;

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只是为了测试而设置的话,我的后期处理和播放就恢复了正常和流畅。

是否有任何解释为什么这种方法不起作用或更有效

4

0 回答 0