我们如何在流式传输后缓存HLS视频网址

时间:2016-10-08 06:05:44

标签: android caching hls android-video-player exoplayer

我正在使用exomedia库通过hls播放视频。我希望在视频流式传输时缓存视频。 AndroidVideoCache库做得很好,但它不支持HLS。

1 个答案:

答案 0 :(得分:0)

可以通过配置Exomedia 库使用的okhttp客户端来完成。

首先,我们需要使用setVideoUri(uri,renderbuilder)方法为emvideoview提供自定义renderbuilder。

为了提供自定义hls渲染构建器,我们需要覆盖HlsRenderBuilder类并覆盖createDataSource方法。这里我们需要返回OkHttpDatasource (link)对象。

现在我们需要在OktthpDatasource类的consturctor中提供配置好的Okhttp客户端。

为了配置okhttp客户端。 我们需要向此客户端添加响应拦截器,并添加修改原始响应头以启用缓存。样本配置可以是。

 CacheControl cacheControl = new CacheControl.Builder()
                .maxStale(22, TimeUnit.DAYS)
                .maxAge(22, TimeUnit.DAYS)
                .build();

        Response originalResponse = chain.proceed(chain.request());

        if (originalResponse.code() == 206 || originalResponse.code() == 200) {
            if (originalResponse.code() == 200) {
                Headers newHeader = originalResponse.headers().newBuilder().removeAll("Expires").removeAll("Pragma").build();
                originalResponse = originalResponse.newBuilder().code(200).body(originalResponse.body()).headers(newHeader).build();
            } else {
                originalResponse = originalResponse.newBuilder().code(200).body(originalResponse.body()).build();
            }
        }

        if (isNetworkAvailable(mContext)) {
            int maxAge = 60; // read from cache for 1 minute
            return originalResponse.newBuilder()
                    .header("Cache-Control", cacheControl.toString())
                    .build();
        } else {
            int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
            return originalResponse.newBuilder()
                    .header("Cache-Control", cacheControl.toString())
                    .build();
        }