MediaPlayer实现边播放边缓存

为了节省流量,安卓移动设备有需求:实现边播放边缓存.对于音乐重复播放的几率很大.有必要缓存下来.

现状是:MediaPlayer类只实现播放,和临时缓存数据的进度通知,但没有实现本地保存.

考虑了一下应该有几种方案;

  1. 重写MediaPlayer类,实现缓存自动通知或者上报通知给调用者保存. 需要修改底层源码
  2. 开2个线程,先下载一部分,立即通知mediaPlayer.setDataSource(path)播放; 同步继续下载,mediaPlayer继续播放,可能要重新定位播放位置
  3. 实现本地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

金山云Android播放SDK

https://gitee.com/ksvc/KSYMediaPlayer_Android

你可能感兴趣的:(Java,Andorid)