Цикл 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)
}
}