Как добавить AVPlayerLooper в существующую AVPLayerQueue, не прерывая воспроизведение?

У меня есть сценарий использования воспроизведения видео, который требует смешивания разных видео, причем некоторые воспроизводятся один раз, а некоторые зацикливаются неопределенное количество раз - видео "один раз", как правило, принимает форму перехода между циклами или затухания. -в сценарии затухания.

Мне пришлось кодировать это вручную, и в конечном итоге это получилось более или менее работающим. С тех пор я обнаружил, что для меня есть инструмент AVPlayerLooper. Видео WWDC, в котором упоминается, также рассказывает о "беговой дорожке", которую я уже разработал для управления воспроизведением, и достаточно хорошо ее описывает.

Я хочу перейти на AVPlayerLooper, поэтому я создал проект, чтобы поэкспериментировать с ним. Я создал очередь воспроизведения из 4 видеофайлов, 2 из которых зациклились. Я реализовал шаблон KVO для player.currentItem свойство, придумав следующий код:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if object as? AVPlayer == self.player && keyPath == "currentItem" {
        if let newValue = change![.newKey] as? AVPlayerItem {
            if(self.loopingItems.first == newValue){
                self.looper = AVPlayerLooper(player: self.player!, templateItem: self.loopingItems[0])
                self.loopingItems.remove(at: 0)
            }
        }
    }
}

По сути, сначала я проверяю, что запускаемое KVO предназначено для соответствующего объекта и ключевого пути - здесь это на самом деле не нужно, но в моем опыте это хорошая практика. Затем я получаю новое значение и, если оно не равно нулю, сравниваю его со следующим элементом, который я ожидаю зациклить. Если он совпадает, я добавляю петлитель и удаляю элемент из списка (потому что я его уже зацикливаю)

У меня также есть базовый распознаватель жестов:

@objc func playerTapped(){
    print("Player tapped")
    if(self.looper != nil ){
        self.looper?.disableLooping()
    }
}

Этот код отключает петлитель, поэтому мы можем перейти к следующему файлу, предполагая, что он может входить / выходить из цикла. Он, безусловно, легко и без проблем переходит на следующий файл.

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

0 ответов

Другие вопросы по тегам