之前有some discussion关于如何循环AVPlayer
的视频项目,但没有“解决方案”足够无缝提供 无滞后循环播放视频。
我正在开发一个tvOS应用程序,它在其中一个视图的背景中具有高质量的10秒“风景”剪辑,只需以“标准”方式重新启动其AVPlayer(订阅NSNotification
即可抓住它)太过于注意不要注意并减损用户体验。
似乎实现真正无缝循环的唯一方法是在较低级别(在OpenGL中)手动管理帧...
尽管我已尽最大努力阅读此内容,并且作为操纵视频管道的新手,我还没有达到一个易于理解的解决方案。
我知道存在外部库可以更容易地执行此行为;最引人注目的是GPUImage。但是,我正在开发的应用程序是针对tvOS的,因此很难使用相当多的第三方iOS库,包括GPUImage。我遇到的另一个图书馆是AVAnimator,它为轻量级动画视频提供了强大的功能,但不适用于.H264中编码的源素材的密集,高质量视频剪辑。
我到目前为止最接近的是Apple自己的AVCustomEdit源代码,但这主要涉及静态生成“过渡”,虽然无缝,但对我来说太复杂了,无法辨别出如何使它执行简单的循环功能。
如果有人能够在较低级别操作AVPlayer
的经验,即使用图像处理/缓冲区(或不依赖于外部库的iOS开发),我会非常感兴趣知道如何我可以先行了。
答案 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)
}
}