Мне нужно синхронизировать текст песни с музыкой. Все отлично работает, пока я не использую AVPlayer.seek(to: CMTime)
. Моя лирика показывается в нужный момент, используя AVPlayer.addBoundaryTimeObserver()
.
Когда я использую seek
, текст на экране кажется немного всплывшим.
Итак, у меня есть два вопроса: это случилось с кем-нибудь? Как я могу это исправить?
Я пытался pause
аудио до seek
и play
после, но это не работает.
override func viewDidLoad() {
for syllable in self.lyrics {
self.player.addBoundaryTimeObserver(forTimes: syllable.time, queue: DispatchQueue.main) {
// Create temporary UILabel and add it to parent view (Nothing taking time)
}
}
// Comment the line below to be synchronised :)
self.player.seek(to: CMTime(seconds: 30, preferredTimescale: 60000))
self.player.play()
}
Метки появляются немного раньше (достаточно, чтобы увидеть десинхронизацию текста).
Я хочу использовать seek
и сохранить синхронизацию.
EDIT
После некоторых исследований кажется, что это аудио слишком поздно.
Я пытался запустить событие самостоятельно, используя Time.scheduledTimer()
, и проверять каждые 0.01 secs
для запуска событий, и получал те же результаты: отлично работает без seek
, но не синхронизируется с seek
.
Итак, я нашел обходной путь: я переключил свой AVPlayer
на AVAudioPlayer
и использую AVAudioPlayer.currentTime
для поиска и управления моими "наблюдателями временных границ" независимо от Time.scheduledTimer()
. Это работает довольно хорошо, но это не очень чистое решение, поэтому вопрос остается прежним.