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