为了节省流量,安卓移动设备有需求:实现边播放边缓存.对于音乐重复播放的几率很大.有必要缓存下来.
现状是:MediaPlayer类只实现播放,和临时缓存数据的进度通知,但没有实现本地保存.
考虑了一下应该有几种方案;
- 重写MediaPlayer类,实现缓存自动通知或者上报通知给调用者保存. 需要修改底层源码
- 开2个线程,先下载一部分,立即通知mediaPlayer.setDataSource(path)播放; 同步继续下载,mediaPlayer继续播放,可能要重新定位播放位置
- 实现本地HTTP PROXY代理. 熟悉proxy和nginx原理,比较容易理解. 通过url生成本地代理后的url. 访问proxy,proxy模拟了http服务器提供数据流.内部又从外部请求数据,并保存到本地.后续请求可以直接从本地放回数据.
if(path.startsWith("http")){
path=proxy.getProxyUrl(path);
}
mediaPlayer.setDataSource(path);
目前来看,对MediaPlayer侵入最少的.还是PROXY的方式. 本来打算自己实现的.发现网上已经有几个实现的方案了
其中金山云Android HTTPCache SDK 提供的方案使用非常简单省事.
https://segmentfault.com/a/1190000007273843
https://github.com/ksvc/ksyhttpcache_android/releases
使用前,项目加载其提供的jar,可以在Application启动时初始化
private void initHttpProxy(){
proxy=new KSYProxyService(getApplicationContext()) ;
proxy.setCacheRoot(getExternalCacheDir());
proxy.setMaxCacheSize(2048*1024*1024l);
proxy.registerLogEventListener(new OnLogEventListener() {
@Override
public void onLogEvent(String var1) {
MyLog.d(TAG, var1);
}
});
proxy.startServer();
}
金山云提供封装更全的播放器,也可以考虑直接使用:KSYMediaPlayer