【原创】关于视频播放器如何做到边播边缓存?【如何用Vitamio做一款功能强大的视频播放器补充篇】

上一章传送: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方法入手。

最后要做的就是缓存的管理了,毕竟缓存多了的话还是很消耗手机存储的。记得及时清理哦。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值