【问题标题】:Android Google Exoplayer 2.2 HLS and DASH streaming cacheAndroid Google Exoplayer 2.2 HLS 和 DASH 流缓存
【发布时间】:2025-12-13 15:45:01
【问题描述】:

我正在尝试缓存 HLS 和 DASH 流媒体视频, 我尝试了很多解决方案,但无法使用 Exoplayer v2.2 许多问题重定向到以下链接,但没有得到任何适当的解决方案。 https://github.com/google/ExoPlayer/issues/420Using cache in ExoPlayer

在一个解决方案中,Google Exoplayer 2.2 中找不到“ExtractorSampleSource”类

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 流进行缓存?

【问题讨论】:

    标签: android caching streaming okhttp3 exoplayer


    【解决方案1】:

    用于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, DefaultDataSourceFactory(Context context, DataSource.Factory baseDataSourceFactory) 在此构造函数的第二个参数中,您传递 DataSource.Factory 它可以帮助您为 Exoplayer 媒体创建 DataSource。