安卓谷歌Exoplayer 2.2 HLS和DASH流媒体缓存

3
我正在尝试缓存HLS和DASH流视频,我已经尝试了许多解决方案,但在Exoplayer v2.2中无法正常工作。许多问题都指向以下链接,但没有得到任何适当的解决方案:https://github.com/google/ExoPlayer/issues/420Using cache in ExoPlayer
在一个解决方案中,“ExtractorSampleSource”类在Google Exoplayer 2.2中找不到。
OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new okhttp3.Cache(context.getCacheDir(), 1024000)).build();
OkHttpDataSource okHttpDataSource = new OkHttpDataSource(okHttpClient, "android", null);
OkHttpDataSource ok2 = new OkHttpDataSource(okHttpClient, "android", null);
HttpDataSource dataSource = new CacheDataSource(context, okHttpDataSource, ok2);
ExtractorSampleSource sampleSource = new ExtractorSampleSource(
                uri,
                dataSource,
                allocator,
                buffer_segment_count * buffer_segment_size,
                new Mp4Extractor(), new Mp3Extractor());

在其他解决方案中也出现了同样的错误“在v2.2中找不到'DefaultUriDataSource'类”。
DataSource dataSource = new DefaultUriDataSource(context, null, new OkHttpDataSource(getClient(context), userAgent, null, null/*, CacheControl.FORCE_CACHE*/));

所有的解决方案都是1到2年前的,而且不支持最新版本的Google Exoplayer v2.2。

有没有人有任何想法、样本或任何解决方法来缓存HLS和DASH流?

1个回答

2

使用下面的 buildDataSourceFactory 方法,并且它会将缓存存储起来。

    DataSource.Factory buildDataSourceFactory(boolean cache) {

       if (!cache) {
        return new DefaultDataSourceFactory(context, BANDWIDTH_METER,
                buildHttpDataSourceFactory(BANDWIDTH_METER));
       }else{

       return new DataSource.Factory() {
           @Override
           public DataSource createDataSource() {
               LeastRecentlyUsedCacheEvictor evictor = new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024);
               SimpleCache simpleCache = new SimpleCache(new File(context.getCacheDir(), "media_cache"), evictor);


               return new CacheDataSource(simpleCache, buildCachedHttpDataSourceFactory(BANDWIDTH_METER).createDataSource(),
                       new FileDataSource(), new CacheDataSink(simpleCache, 10 * 1024 * 1024),
                       CacheDataSource.FLAG_BLOCK_ON_CACHE | CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR, null);
           }

       };
   }
    }

    private DefaultDataSource.Factory buildCachedHttpDataSourceFactory(DefaultBandwidthMeter bandwidthMeter) {
        return new DefaultDataSourceFactory(context, bandwidthMeter, buildHttpDataSourceFactory(bandwidthMeter));
    }

buildHttpDataSourceFactory方法是什么? - David
@David,DefaultDataSourceFactory(Context context, DataSource.Factory baseDataSourceFactory) 在这个构造函数的第二个参数中,您传递了DataSource.Factory,它可以帮助您为Exoplayer媒体创建DataSource。 - Sumit Jangir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接