上一章传送:https://blog.csdn.net/mzy24511cs/article/details/80577418。
PS:最新补充说明,Vitamio各版本之间存在差异,我最近升级了5.0最新的版本,无法使用边播边缓存了。他们的最新版为了修复6.0以上系统的一个bug,更换了libffmpeg的库,估计还没有实现这个功能。否则会发生has text relocations 的闪退异常。如果你的编译版本低于23,可以继续使用4.2版本的Vitamio。否则,建议升级5.0版本并且暂时不要使用这个方法。
上一篇介绍了怎样做一款功能强大的视频播放器,是基于Vitamio框架开发的。这里我们再补充一个功能:如何做到视频边播放边缓存到本地?
这个需求还挺常见的。由于用户的网络环境复杂,经常会有网速较慢看视频时卡顿、缓冲的现象,并且有时候我们需要频繁的拖拽进度条,如果播放的是在线视频每次拖拽后的loading间隔十分影响用户体验。那么我们能不能在播放视频的时候同时将视频缓存保存到手机本地,再次播放的时候直接使用缓存播放呢?
答案是肯定的。 下面我们就来讲一下Vitamio框架下如何让自己的播放器实现边播边缓存。
首先我们找到这个方法:
io.vov.vitamio.MediaPlayer.setDataSource()
io.vov.vitamio.widget.VideoView.setVideoPath()
这两个方法是一样的,用来设置播放路径。既可以是离线的,也可以是在线的。现在只需要在播放路径参数前加一串字符,即:
cache:本地缓存的路径:视频播放路径
例如:
cache:/storage/emulated/0/Android/data/com.shengcai/readideoCache/0ad4144c-8f01-4e84-e32e-b7202ae.MP4:视频播放路径
这样Vitamio就会自动处理,将在线视频播放的同时,缓存到你制定的路径下面了。只要缓存文件存在,再次播放该视频时,将使用缓存文件,播放时的卡顿、缓冲,以及拖拽进度后的延迟都不复存在了。是不是很爽呢。
PS:这里不需要做任何处理,当然如果你想要在界面上显示缓存的信息或者提示。Vitamio也提供了相应的监听接口:
public interface OnCachingUpdateListener {
/**
* Called to update status in caching a media stream. Caching is storing
* data on external storage while buffering in memory.
*
* @param mp the MediaPlayer the update pertains to
* @param segments the cached segments in bytes, in format [s1begin, s1end,
* s2begin, s2end], s1begin < s1end < s2begin < s2end. e.g. [124,
* 100423, 4321412, 214323433]
*/
void onCachingUpdate(MediaPlayer mp, long[] segments);
/**
* Cache speed
*
* @param mp the MediaPlayer the update pertains to
* @param speed the cached speed size kb/s
*/
void onCachingSpeed(MediaPlayer mp, int speed);
/**
* Cache start
* @param mp
*/
void onCachingStart(MediaPlayer mp);
/**
* Cache compelete
*/
void onCachingComplete(MediaPlayer mp);
/**
* Cache not available
*
* @param mp the MediaPlayer the update pertains to
* @param info the not available info
* <ul>
* <li>{@link #CACHE_INFO_NO_SPACE}
* <li>{@link #CACHE_INFO_STREAM_NOT_SUPPORT}
* </ul>
*/
void onCachingNotAvailable(MediaPlayer mp, int info);
}
你只需要设置setOnCachingUpdateListener()方法就行了。
说明:onCachingUpdate将返回视频缓存片段的进度信息,单位时字节B
onCachingSpeed将返回视频缓存的速度,单位是KB/S
onCachingNotAvailable在视频无法缓存时返回,例如缓存路径不存在时。
需要注意的时onCachingStart和onCachingComplete这两个方法不知道是不是API的问题,缓存时并没有触发。若有需要监听缓存完成事件的,可以考虑从onCachingUpdate方法入手。
最后要做的就是缓存的管理了,毕竟缓存多了的话还是很消耗手机存储的。记得及时清理哦。