AVPlayer.seek () десинхронизирует наблюдателей времени? - PullRequest
0 голосов
/ 18 июня 2019

Мне нужно синхронизировать текст песни с музыкой. Все отлично работает, пока я не использую 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(). Это работает довольно хорошо, но это не очень чистое решение, поэтому вопрос остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...