Android视频缓存支持库

Android视频缓存支持库

公司是做线上教育的,在整个服务器的成本中,我们发现存储的成本很低约占总支出的5%,流量成本大约占95%,所以视频缓存势在必行。经过调研在github上找到了一个很不错的第三方缓存库(https://github.com/danikula/AndroidVideoCache),这个库封装的很不错,对原有的代码侵入性很低,下面把他的用法做一个介绍(主要翻译github上的使用方法)。

1.为什么要做视频缓存
VideoView / MediaPlayer,ExoPlayer或任何其他播放器添加缓存支持!
2.该视频缓存库的特点
  • 流媒体缓存到磁盘;
  • 可以使用缓存资源进行离线播放;
  • 部分装载 缓存限制(最大缓存大小,最大文件数);
  • 同一网址的多个客户端。

注意:AndroidVideoCache只能播放地址是url的媒体文件,它不支持任何流技术,如DASH,SmoothStreaming,HLS。

3.开始使用
  • 首先添加依赖:
dependencies {
    compile 'com.danikula:videocache:2.7.0'
}
  • 使用代理的url代替原始网址添加缓存:
@Override
protected 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的单例。
    例如,您可以在Application中存储共享代理:
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这样的依赖注入。

4.方法
  • 磁盘缓存限制

HttpProxyCacheServer 默认缓存空间为512M,你可以通过下面的方法修改缓存大小:

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不稳定,并且可以包含一些生成的部分(例如会话令牌)。 在这种情况下,缓存机制将被破坏。 要修复它,你必须提供自己的FileNameGenerator:

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()
  • 使用exoPlayer
    可以使用exoPlayer中使用AndroidVideoCache。 请参阅exoPlayer分支中的示例应用程序。 注意exoPlayer也支持缓存。

  • 已知问题
    在某些情况下,客户端无法连接到本地代理服务器(’Error pinging server’ error)。 可能是以前的错误。 注意在这种情况下,视频可以正常播放,但没有缓存。

文末再次附上链接:https://github.com/danikula/AndroidVideoCache

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值