流式传输后如何缓存HLS视频网址 [英] How can we cache HLS video url once streamed

查看:370
本文介绍了流式传输后如何缓存HLS视频网址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用exomedia库通过hls播放视频。我想在视频流式传输时缓存视频。 AndroidVideoCache库可以很好地完成此工作,但是它不支持HLS。

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 .

推荐答案

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

It can be done by configuring the okhttp client used by the Exomedia library.

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

First we need provide custom renderbuilder to emvideoview by using setVideoUri(uri,renderbuilder) method.

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

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.

现在,我们需要在OktthpDatasource类的构造函数中提供已配置的Okhttp客户端。

Now we need to provide configured Okhttp client in OktthpDatasource class's consturctor.

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

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();
        }

这篇关于流式传输后如何缓存HLS视频网址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆