Цикл AVPlayer без проблем

Ранее было некоторое обсуждение о том, как зациклить AVPlayer видео, но ни одно "решение" не является достаточно плавным, чтобы обеспечить циклическое воспроизведение видео без задержек.

Я занимаюсь разработкой приложения для tvOS, которое имеет высококачественный 10-секундный клип "декорации" на фоне одного из своих видов и просто перезапускаю AVPlayer "стандартным" способом (подписавшись на NSNotification поймать это) слишком нервный, чтобы не замечать и не умалять опыта пользователя.

Кажется, что единственный способ добиться действительно бесшовного цикла - это вручную управлять кадрами на более низком уровне (в OpenGL)...

Несмотря на все усилия, чтобы прочитать об этом, и как новичок в манипулировании видео конвейерами, я не подошел достаточно близко к приемлемому решению.

Я знаю, что существуют внешние библиотеки, чтобы можно было легче выполнять это поведение; наиболее заметно GPUImage. Тем не менее, приложение, которое я разрабатываю, предназначено для tvOS и поэтому испытывает трудности с использованием довольно большого количества существующих сторонних библиотек iOS, включая GPUImage. Еще одна библиотека, с которой я столкнулся, - это AVAnimator, которая предоставляет отличные функциональные возможности для легких анимационных видеороликов, но не для плотных высококачественных видеоклипов исходного материала, закодированных в формате.H264.

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

Если кто-то может смириться с опытом манипулирования AVPlayer на более низком уровне, то есть с обработкой изображений / буферами (или разработкой iOS, которая не опирается на внешние библиотеки), мне было бы невероятно интересно узнать, как я мог бы начать.

4 ответа

У меня была такая же проблема при потоковой передаче видео. После воспроизведения в первый раз при загрузке видео во второй раз появился черный экран. Я избавился от черного экрана, ища видео на 5 мс вперед. Это сделало почти бесшовную петлю видео. (Swift 2.1)

// Create player here..
let player = AVPlayer(URL: videoURL)

// Add notification block
NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: player.currentItem, queue: nil)
{ notification in
   let t1 = CMTimeMake(5, 100);
   player.seekToTime(t1)
   player.play()
}

Если видео очень короткое (несколько секунд), вы, вероятно, можете извлечь каждый кадр как CGImage и использовать CAKeyframeAnimation для его анимации. Я использую эту технику для воспроизведения изображений GIF в моем приложении, и анимация очень плавная.

Вы упоминаете, что смотрели на AVAnimator, но видели ли вы мой пост в блоге на эту конкретную тему бесшовных циклов? Я специально встроил логику бесшовного зацикливания, потому что это не могло быть сделано должным образом с AVPlayer и оборудованием H.264.

Я использую два AVPlayerItems с одним AVAsset в AVQueuePlayer и переключаю элементы:

 weak var w = self
 NSNotificationCenter.defaultCenter().addObserverForName(AVPlayerItemDidPlayToEndTimeNotification, object: nil, queue: nil) { (notification) -> Void in
        let queuePlayer = w!.playerController.player! as! AVQueuePlayer
        if(queuePlayer.currentItem == playerItem1) {
            queuePlayer.insertItem(playerItem2, afterItem: nil)
            playerItem1.seekToTime(kCMTimeZero)
        } else {
            queuePlayer.insertItem(playerItem1, afterItem: nil)
            playerItem2.seekToTime(kCMTimeZero)
        }
    }
Другие вопросы по тегам