1

I am currently using a CADisplayLink to grab the current pixel buffer from an AVPlayerItemVideoOutput. The display link is updating like so;

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 }
    ...
}

I would like to use the same output to also grab a pixel buffer exactly 1 second ahead. Since my video is 30fps, I thought I could use CMTimeMakeWithSeconds to do the following;

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 }
    ...
}

When I attempt to do this, and then perform my ... post-processing, the playback I experience is incredibly choppy. If I set let timeB = time just for the sake of testing, my post-processing and playback is back to normal and smooth.

Is there any explanation for why this approach would not work, or be more efficient

ZbadhabitZ
  • 2,753
  • 1
  • 25
  • 45

0 Answers0