I am using exomedia library to play video through hls. I want to cache video as the video gets streamed. AndroidVideoCache library do this job well but it doesn't support HLS .
Asked
Active
Viewed 650 times
1 Answers
0
It can be done by configuring the okhttp client used by the Exomedia library.
First we need provide custom renderbuilder to emvideoview by using setVideoUri(uri,renderbuilder) method.
In order to provide custom hls render builder we need to override HlsRenderBuilder class and override createDataSource method. Here we need to return OkHttpDatasource(link) object.
Now we need to provide configured Okhttp client in OktthpDatasource class's consturctor.
In order to configure okhttp client . We need to add response interceptor to this client and add modify the original response header for enabling caching. Sample configuration can be.
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();
}

user3024215
- 196
- 1
- 7