Извлечение пиксельного буфера из разного времени с использованием CMTimeAdd? - PullRequest
0 голосов
/ 26 октября 2019

В настоящее время я использую CADisplayLink, чтобы получить текущий пиксельный буфер из 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 секунду вперед. Поскольку мое видео составляет 30 кадров в секунду, я подумал, что мог бы использовать 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 только для тестирования, моя постобработка и воспроизведение вернутся к нормальной и плавной работе.

Есть ли какое-либо объяснение, почему этот подход не будет работать или будет более эффективным

...