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