【发布时间】:2020-09-14 11:48:32
【问题描述】:
我对 ExoPlayer 及其文档感到非常困惑。请解释一下我们应该使用 CacheDataSource 和 SimpleCache 的目的和时间?
【问题讨论】:
标签: android exoplayer2.x
我对 ExoPlayer 及其文档感到非常困惑。请解释一下我们应该使用 CacheDataSource 和 SimpleCache 的目的和时间?
【问题讨论】:
标签: android exoplayer2.x
CacheDataSource 和 SimpleCache 实现两个不同的目的。如果你看看他们的类原型,你会看到CacheDataSource implements DataSource 和SimpleCache 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)));
}
}
我们使用CacheDataSource 准备缓存媒体播放,使用SimpleCache 构建它的DataSource.Factory 实例。
【讨论】:
Factory 类或接口,顾名思义,以更简单的方式为您完成实例创建工作,您将数据传递给工厂类,该类在需要时处理实例创建。在这种情况下,您构建一个CacheDataSourceFactory 实例并将其传递给构造一个MediaSource。 ProgressiveMediaSource.Factory 在您的 DataSource.Factory 实例上调用 createDataSource() 方法以创建 DataSource 实例。
mediaUri 来实例化MediaSource 对象。使用 Uri.parse(videoUrl) 将您的 url 转换为 uri。