2015-10-22 3 views
4

Там было some discussion прежде о том, как петлевой AVPlayer «s видео пункт, но не„решение“достаточно, чтобы обеспечить бесшовный лаг-менее зацикливания видео.Looping AVPlayer бесшовно

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

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

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

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

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

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

+0

Вы можете уточнить, что проблема в использовании GPUImage на tvOS это? Из того, что я видел, все зависимости поддерживаются на tvOS. – thomers

ответ

0

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

+0

Большое спасибо за ваш ответ - так как мои кадры - 1080p m4v (примерно 350 кадров), этот подход занимает слишком много памяти ... – Sarreph

0

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

+0

Спасибо, что ответили! Я действительно прочитал ваш блог-пост и ни в коем случае не пытался сбить вашу удивительную библиотеку, но я просто не мог заставить ее работать с высококачественным 10-секундным клипом, который 30 мегабайт при кодировании как H.264.Я потратил много часов, пытаясь создать файл .mvid, размер которого меньше 100 МБ (был 1 ГБ или больше), и при попытке напрямую импортировать H.264, как в примере вашего ходячего клипа, приложение по существу потерпело бы крах от обработки ... есть способ использовать AVAnimator с кадром размером 1080p m4v, что не приводит к огромным файлам формата Apple Animation? Благодаря! – Sarreph

+0

Ну, более 1 ГБ видеоданных будет много времени ввода-вывода и процессора. Было бы возможно обработать так много данных о процессоре, но на самом деле это не был бы «лучший» подход, учитывая время загрузки. В выпуске 3.0 есть новые классы в версии AVAnimatorOpenGLView и AVAssetFrameDecoder, которые могут использовать аппаратный оптимизированный путь рендеринга, который использует CoreVideo под обложками, но, честно говоря, даже это, скорее всего, не будет работать для вашего полного источника видео высокой четкости. То, что вам, возможно, потребуется рассмотреть, - это обычное решение для генерации длинного H.264, в котором циклы говорят 10 или 20 раз. – MoDJ

+0

Итак, я подумал о том, как реализовать бесшовный цикл H.264 с полным разрешением HD 1920x1080. В этом примере показано, как новые аппаратные кодировщики и декодеры VideoToolbox могут использоваться для создания ключевых кадров из исходного .mp4 и использовать их для отображения бесшовной анимации цикла на 24BPP. Требуется немного времени для перекодировки кадров, но затем он петли без сбоев. Наслаждайтесь: https://github.com/mdejong/H264SeamlessLooping – MoDJ

-1

Я использую два 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) 
     } 
    } 
+0

Спасибо за это. Я получил эту работу, но все равно имею такую ​​же задержку. Удалил ли вы задержку для вас? – Nabha

+2

Если это кому-то помогает: этот же шаблон (с несколькими дополнениями) реализован в iOS/tvOS 10 с помощью AVPlayerLooper: http://stackoverflow.com/a/38271221/192120 – Nabha

15

У меня была такая же проблема при потоковой передаче видео. После игры в первый раз на втором экране появился черный экран при загрузке видео. Я избавился от черного экрана, ища видео до 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() 
} 
Смежные вопросы