无缝地循环播放AVPlayer

以前有关于如何循环播放AVPlayer的video项目的讨论,但没有一个“解决scheme”足够无缝地提供video的滞后循环

我正在开发一个tvOS应用程序,它在一个视图的背景中有一个高质量的“风景”10秒剪辑,并且简单地以“标准”方式重新启动AVPlayer(订阅NSNotification来捕捉它)太不灵活注意和减损用户体验。

似乎实现真正无缝循环的唯一方法是手动pipe理帧(在OpenGL中)…

尽pipe在这方面做了最大的努力,作为操纵videopipe道的新手,但我还没有接近到可以理解的解决scheme。

我知道外部库存在能够更容易地执行此行为; 最显着的是GPUImage 。 然而,我正在开发的应用程序是用于tvOS,因此难以使用相当多的第三方iOS库,包括GPUImage。 我遇到的另一个库是AVAnimator ,它为轻量级animationvideo提供了很好的function,但是不能用于以.H264编码的源素材的密集,高质量的video剪辑。

我到目前为止最接近的是苹果公司自己的AVCustomEdit源代码,但是这主要涉及静态生成一个“过渡”,虽然无缝,但对于我来说,要分辨如何使其执行简单的循环function是非常复杂的。

如果有人能够在较低的层次上操作AVPlayer经验,即使用image processing/缓冲区(或者不依赖于外部库的iOS开发),我会非常感兴趣的知道如何才能开始。

stream式传输video时遇到同样的问题 第一次播放后,第二次加载video时出现黑屏。 我通过寻找video提前5ms摆脱了黑屏。 它几乎是一个无缝的video循环。 (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() } 

如果video非常短(几秒钟),则可以将每个帧提取为CGImage,并使用CAKeyframeAnimation对其进行设置。 我正在使用这种技术在我的应用程序上播放GIF图像,animation非常stream畅。

你提到你在看AVAnimator,但是你看到了我的博客文章关于这个无缝循环的特定主题? 我专门构build了无缝循环逻辑,因为无法用AVPlayer和H.264硬件正确完成。

我在AVQueuePlayer中使用两个具有相同AVAsset的AVPlayerItems并切换项目:

  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) } } 
    Interesting Posts