android视频播放器缓存
来源:互联网 发布:手机八格切图软件 编辑:程序博客网 时间:2024/05/01 01:34
今天介绍一个视频离线缓存的框架,由于视频播放的时候下载多次是没有意义的。今天介绍的AndroidVideoCache支持VideoView/MediaPlayer, ExoPlayer等播放器实现离线缓存功能。
主要特征:
- 流媒体磁盘缓存;
- 资源离线缓存;
- 局部加载;
- 缓存限制 (最大缓存大小, 最大文件数);
- 支持多客户端.
注意,AndroidVideoCache只对媒体文件使用直接url,它不支持任何流技术,如DASH,平滑流,HLS。
开始使用
增加依赖
dependencies { compile 'com.danikula:videocache:2.7.0'}
并使用代理的url代替原来的url来添加缓存:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); HttpProxyCacheServer proxy = getProxy(); String proxyUrl = proxy.getProxyUrl(VIDEO_URL); videoView.setVideoPath(proxyUrl);}private HttpProxyCacheServer getProxy() { // should return single instance of HttpProxyCacheServer shared for whole app.}
为了保证正常工作,你应该在整个应用程序中使用一个HttpProxyCacheServer的实例。
public class App extends Application { private HttpProxyCacheServer proxy; public static HttpProxyCacheServer getProxy(Context context) { App app = (App) context.getApplicationContext(); return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy; } private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer(this); }}
或者使用简单工厂。更可取的方法是使用像Dagger这样的依赖注入器。
方法
磁盘缓存
默认情况下,HttpProxyCacheServer使用512Mb的缓存文件。你可以改变这个值:
private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) .maxCacheSize(1024 * 1024 * 1024) // 1 Gb for cache .build();}
或者可以限制缓存中的文件总数:
private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) .maxCacheFilesCount(20) .build();}
甚至实施你自己的DiskUsage策略:
private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) .diskUsage(new MyCoolDiskUsageStrategy()) .build();}
监听缓存进度
使用HttpProxyCacheServer。registerCacheListener(CacheListener listener)方法,可以用回调onCacheAvailable(File cacheFile,String url,int percentsAvailable)来设置监听器,以了解缓存的进度。不要忘记在HttpProxyCacheServer的帮助下取消订阅侦听器。unregisterCacheListener(CacheListener listener)方法以避免内存泄漏。
使用HttpProxyCacheServer。isCached(String url)方法检查url的内容是否完全缓存到文件中。
为缓存的文件提供名称
默认情况下,AndroidVideoCache使用MD5的视频url作为文件名。但在某些情况下,url不稳定,它可以包含一些生成的部分(例如会话标记)。在这种情况下,缓存机制将被破坏。要修复它,您必须提供自己的文件生成器:
public class MyFileNameGenerator implements FileNameGenerator { // Urls contain mutable parts (parameter 'sessionToken') and stable video's id (parameter 'videoId'). // e. g. http://example.com?videoId=abcqaz&sessionToken=xyz987 public String generate(String url) { Uri uri = Uri.parse(url); String videoId = uri.getQueryParameter("videoId"); return videoId + ".mp4"; }}...HttpProxyCacheServer proxy = HttpProxyCacheServer.Builder(context) .fileNameGenerator(new MyFileNameGenerator()) .build()
添加自定义http标头
您可以在HeadersInjector的帮助下添加定制的标题:
public class UserAgentHeadersInjector implements HeaderInjector { @Override public Map<String, String> addHeaders(String url) { return Maps.newHashMap("User-Agent", "Cool app v1.1"); }}private HttpProxyCacheServer newProxy() { return new HttpProxyCacheServer.Builder(this) .headerInjector(new UserAgentHeadersInjector()) .build();}
使用 exoPlayer
您可以使用exoPlayer和AndroidVideoCache。参见exoPlayer分支中的示例应用程序。注释exoPlayer也支持缓存。
例子
详细使用方法见sample
项目地址
AndroidVideoCache : https://github.com/danikula/AndroidVideoCache
- android视频播放器缓存
- Android视频播放之边缓存边播放
- Android视频播放之边缓存边播放
- Android 视频播放器
- android 视频播放器
- android视频播放器
- Android 视频播放器
- android 视频播放器
- android视频播放器
- Android视频播放器
- Android视频播放器
- Android--视频播放器
- Android 视频播放器
- android 视频播放器
- Android-视频播放器
- Android 视频播放器
- android视频播放器
- Android 视频播放器
- Android高级的总结
- 【常识】户型图要怎么看?买房时销售员不会说的注意事项
- 使用localstorage.setItem()存储对象
- 基于Echart.js一点总结
- 12槽位PCIe扩展箱
- android视频播放器缓存
- Hbase Java API
- Java核心技術卷_2_注釋與數據類型
- JSON.parse()方法将数据转换为javascript对象
- React-Native 安卓出现图片资源路径正确,却无法加载显示
- JAVA 模拟瞬间高并发
- 外观模式(Facade)
- Android 调用echart图表,实现牛逼的效果
- 数据库第一课