0%

iOS循环播放视频

有一个需求需要循环播放一个视频,UI希望的效果是无缝循环播放。当时觉得应该问题不大,但事实却并非如此。如果只是单纯的循环播放,确实简单。但是想要无缝丝滑连贯的循环播放却并不那么简单。

方案一:ijkplayer

项目中用的ijkplayer,刚开始是监听播放完成通知,播放完后重新播放,结果发现每次播完后都要停顿一下才会继续播放。达不到无缝循环的要求。

一顿搜索之后,发现可以通过设置option的loop属性,设置为100就是循环播放100次,设置1就是播放一次,设置0就是无线循环播放。这一次以为稳了,然并卵,还是每次播完后都要停顿一下才会继续播放。

又是一顿搜索,发现了ijkplayer可以播放contact文件,所谓contact文件就是按照一定的格式将要播放的视频地址按顺序写入一个文件,把这个文件丢给ijkplayer,ijkplayer就会按照顺序一个个播放,当时就在想是不是这种方式可以无缝播放呢?于是将视频的地址写了1000遍,这样ijkplayer就会播放1000次,达到一个循环播放的假象。然而还是没有什么卵用,效果和上面一样。

总结一下:ijkplayer的播放机制就是播完后会暂停,这一暂停就导致不连贯了,因此可以很明显的看到会停顿一下才继续播放。使用ijkplayer基本上做不到无缝循环播放视频。当然也有可能是我才疏学浅没找到正确的方式。

方案二:AVPlayer

ijkplayer既然不行,那就只能试一下系统的AVPlayer了,还是同样的思路,监听播放完成通知,播放完后重新播放,结果发现效果一样。

方案三:AVQueuePlayer

最后找到一篇文章说是要使用AVPlayer的子类AVQueuePlayer,试了一下发现效果确实很不错,几乎看不出来有停顿的感觉。AVQueuePlayer应该会预加载要播放的资源,这样播放完后就可以立即加载渲染下一个视频的画面了。

总结:如果要无缝循环播放视频,AVQueuePlayer是一个不错的选择。

方案四:GIF/Webp播放

本来我们项目中对ijkplayer做了一些修改支持播放透明视频,结果因为ijkplayer循环播放不丝滑,只能另辟蹊径。而系统播放器可定制程度不高,如果你需要先处理视频画面再播放,那么AVQueuePlayer可能也不行了,比如透明视频的无缝循环播放。然而这个需求就是需要透明视频的无缝循环播放,这不是巧了吗,于是AVQueuePlayer也被pass了。

最后实在是没有办法了,突然想到反正是播一个没声音的视频,为什么不直接自己一帧一帧播图片呢,这样连贯性肯定有保障了。于是让UI出了一个Webp资源,配合YYAnimateImageView播放,可以说是非常的丝滑。唯一不足的是资源大小变大了一倍,不过还能接受。

觉得文章有帮助可以打赏一下哦!