Avplayer все еще создает кадры после паузы

#swift #swiftui #avfoundation #avplayer

Вопрос:

Я работаю над приложением SwiftUI, в котором пользователи могут применять эффекты к видео в любой произвольный момент времени. После выбора эффекта его можно применить, запустив и остановив воспроизведение в нужное время.

Помимо проигрывателя, пользовательский интерфейс также содержит скруббер, который показывает миниатюры из видео и указывает текущую метку времени.

Проигрыватель и скруббер синхронизируются через a PeriodicTimeObserver , поэтому скруббер всегда перемещается вместе с видео. Поскольку проигрыватель работает асинхронно, я сталкиваюсь с проблемой, что, когда пользователь приостанавливает воспроизведение, наблюдатель все еще вызывается 3-4 раза после этого, что искажает результат. Вероятно, это вызвано каким-то внутренним асинхронным поведением плеера.

В настоящее время я «решаю» эту проблему с помощью своей собственной асинхронной pause реализации, которая регистрирует своего собственного наблюдателя, и каждый раз, когда это вызывается, таймер перезапускается. Когда этот таймер заканчивается, он вызывает данный обратный вызов.

Это выглядит примерно так (я знаю, что это не настоящий swift-код, я его сильно упростил)

 func pause(callback: () -> Void) {
  let timer = Timer(interval: 3, repeat: false) {
    callback()
  }
  timer.start()
  self.addPeriodicTimeObserver(forInterval: 1, queue: .main) { _ in
    timer.restart()
  }
}
 

У кого-нибудь есть идея получше узнать, когда игрок на самом деле перестал играть?