#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()
}
}
У кого-нибудь есть идея получше узнать, когда игрок на самом деле перестал играть?