Как добавить 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()
}
}
Этот код отключает петлитель, поэтому мы можем перейти к следующему файлу, предполагая, что он может входить / выходить из цикла. Он, безусловно, легко и без проблем переходит на следующий файл.
Проблема в том, что всякий раз, когда я вхожу в цикл, я получаю белую вспышку - фон появляется в течение доли секунды. Я также получаю прерывистые белые вспышки во время зацикливания, которые я не получаю, если просто использую проигрыватель проигрывателя для зацикливания одного видео, что странно.