无缝循环AVPlayer

时间:2015-10-22 16:21:45

标签: ios video opengl-es avfoundation tvos

之前有some discussion关于如何循环AVPlayer的视频项目,但没有“解决方案”足够无缝提供 无滞后循环播放视频

我正在开发一个tvOS应用程序,它在其中一个视图的背景中具有高质量的10秒“风景”剪辑,只需以“标准”方式重新启动其AVPlayer(订阅NSNotification即可抓住它)太过于注意不要注意并减损用户体验。

似乎实现真正无缝循环的唯一方法是在较低级别(在OpenGL中)手动管理帧...

尽管我已尽最大努力阅读此内容,并且作为操纵视频管道的新手,我还没有达到一个易于理解的解决方案。

我知道存在外部库可以更容易地执行此行为;最引人注目的是GPUImage。但是,我正在开发的应用程序是针对tvOS的,因此很难使用相当多的第三方iOS库,包括GPUImage。我遇到的另一个图书馆是AVAnimator,它为轻量级动画视频提供了强大的功能,但不适用于.H264中编码的源素材的密集,高质量视频剪辑。

我到目前为止最接近的是Apple自己的AVCustomEdit源代码,但这主要涉及静态生成“过渡”,虽然无缝,但对我来说太复杂了,无法辨别出如何使它执行简单的循环功能。

如果有人能够在较低级别操作AVPlayer的经验,即使用图像处理/缓冲区(或不依赖于外部库的iOS开发),我会非常感兴趣知道如何我可以先行了。

4 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:0)

如果视频非常短(几秒钟),您可以将每个帧提取为CGImage,并使用CAKeyframeAnimation为其设置动画。我正在使用这种技术在我的应用程序上播放GIF图像,动画非常流畅。

答案 2 :(得分:0)

你提到你看过AVAnimator,但是你在这个无缝循环的特定主题上看到了我的blog post吗?我专门构建了无缝循环逻辑,因为它无法通过AVPlayer和H.264硬件正确完成。

答案 3 :(得分:-1)

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

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