我正在使用exomedia库通过hls播放视频。我希望在视频流式传输时缓存视频。 AndroidVideoCache库做得很好,但它不支持HLS。
答案 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();
}