AndroidVideoCache研究
我们想让ijk支持边下边播的能力,通过AndroidVideoCache就可以实现,AndroidVideoCache的设计很优雅,能够解耦不同的播放器,比如可以支持ijk、系统播放器mediaplayer、exoplayer等等。
ijk我们还使用之前文章里的代码:
ijkplayer系列1:ijkplayer介绍
https://blog.csdn.net/a910626/article/details/93657087
下面主要展示怎么把AndroidVideoCache和ijk融合。
compile 'com.danikula:videocache:2.7.1'
public class Application extends android.app.Application {
public static Context context;
@Override
public void onCreate() {
super.onCreate();
context = this;
}
private HttpProxyCacheServer proxy;
public static HttpProxyCacheServer getProxy() {
Application app = (Application) context.getApplicationContext();
return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy;
}
private HttpProxyCacheServer newProxy() {
return new HttpProxyCacheServer(this);
}
}
activity中
// 2.长视频测试缓存下载机制
String VIDEO_URL = "http://vfx.mtime.cn/Video/2017/03/31/mp4/170331093811717750.mp4";
HttpProxyCacheServer proxy = Application.getProxy();
String proxyUrl = proxy.getProxyUrl(VIDEO_URL);
try {
videoPlayer.load(proxyUrl);
} catch (IOException e) {
Toast.makeText(this,"播放失败",Toast.LENGTH_SHORT);
e.printStackTrace();
}
在一般的播放器请求数据的模型中,播放器直接通过url连接到远程服务器,播放器下载后的数据直接交给播放器缓冲区,数据使用完了以后直接淘汰掉。
如果我们在播放器与远程server中间插入一个本地透明代理,这样透明代理就可以接管播放器的请求,透明代理从远程server下载完数据就可以先保存在本地,然后把所需要的数据交给播放器。类似于我们Charles抓包这样。下一次播放器请求相同的数据,就可以在本地代理这里找到对应的缓存文件,直接返回。
在看代码前,先说下它的整个设计思路,大体可以理解成两部分,这也是我看完后自己的理解:
1、开启一个线程池去给定的路径下下载文件,将下载的文件保存到本地;
2、视频播放的时候读保存到本地的文件,如果播放的地方还没保存到本地,那就需要等待视频下载到这个地方才能播放;
上面这种情况是边播边缓存,如果在已经缓存好去播视频时,这时执行的逻辑就是直接播放本地视频了;
待todo
可以通过debug追踪代码实现
AndroidVideoCache-视频边播放边缓存的代理策略
https://www.jianshu.com/p/4745de02dcdc
AndroidVideoCache源码详解以及改造系列-源码篇
https://www.jianshu.com/p/dfc18278b053
AndroidVideoCache解析
https://blog.csdn.net/zhqw_csdn/article/details/81514313
视频缓存AndroidVideoCache攻略
https://www.jianshu.com/p/53c4a6c9bd07