【问题标题】:CacheDataSource vs SimpleCache in exoplayer?exoplayer 中的 CacheDataSource 与 SimpleCache?
【发布时间】:2020-09-14 11:48:32
【问题描述】:

我对 ExoPlayer 及其文档感到非常困惑。请解释一下我们应该使用 CacheDataSource 和 SimpleCache 的目的和时间?

【问题讨论】:

    标签: android exoplayer2.x


    【解决方案1】:

    CacheDataSourceSimpleCache 实现两个不同的目的。如果你看看他们的类原型,你会看到CacheDataSource implements DataSourceSimpleCache implements Cache。当您需要缓存下载的视频时,您必须使用CacheDataSource 作为您的DataSource.Factory 来准备您的媒体播放:

    // Produces DataSource instances through which media data is loaded.
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "AppName"));
    dataSourceFactory = new CacheDataSourceFactory(VideoCacheSingleton.getInstance(), dataSourceFactory);
    

    然后使用dataSourceFactory创建MediaSource

    // This is the MediaSource representing the media to be played.
    MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
            .createMediaSource(mediaUri);
    SimpleExoPlayer exoPlayerInstance = new SimpleExoPlayer.Builder(context).build();
    exoPlayerInstance.prepare(mediaSource);
    

    虽然SimpleCache 为您提供了一个缓存实现,它维护内存中的表示。正如您在第一个代码块中看到的那样,CacheDataSourceFactory 构造函数需要一个 Cache 实例才能使用。您可以声明自己的缓存机制,也可以使用 ExoPlayer 为您提供的默认 SimpleCache 类。如果您需要使用默认实现,请记住这一点:

    在给定时间,给定目录只允许一个 SimpleCache 实例

    根据documentation。因此,为了对文件夹使用 SimpleCache 的单个实例,我们使用单例声明模式:

    public class VideoCacheSingleton {
        private static final int MAX_VIDEO_CACHE_SIZE_IN_BYTES = 200 * 1024 * 1024;  // 200MB
    
        private static Cache sInstance;
    
        public static Cache getInstance(Context context) {
            if (sInstance != null) return sInstance;
            else return sInstance = new SimpleCache(new File(context.getCacheDir(), "video"), new LeastRecentlyUsedCacheEvictor(MAX_VIDEO_CACHE_SIZE_IN_BYTES), new ExoDatabaseProvider(context)));
        }
    }
    

    TL;博士

    我们使用CacheDataSource 准备缓存媒体播放,使用SimpleCache 构建它的DataSource.Factory 实例。

    【讨论】:

    • DataSource.Factory 和 DataSource 有什么不同?
    • Factory 类或接口,顾名思义,以更简单的方式为您完成实例创建工作,您将数据传递给工厂类,该类在需要时处理实例创建。在这种情况下,您构建一个CacheDataSourceFactory 实例并将其传递给构造一个MediaSourceProgressiveMediaSource.Factory 在您的 DataSource.Factory 实例上调用 createDataSource() 方法以创建 DataSource 实例。
    • @CoffeeJunkie 正如您在我的第二个代码块中看到的那样,我使用了mediaUri 来实例化MediaSource 对象。使用 Uri.parse(videoUrl) 将您的 url 转换为 uri。
    • 哦,好的,但它不适用于最新版本,你能检查我的问题并给我一个替代方案吗? stackoverflow.com/questions/70595132/…@Sdghasemi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多