exoplayer 中的 CacheDataSource 与 SimpleCache?

2024-04-29

我对 ExoPlayer 及其文档非常困惑。请解释一下我们应该什么目的以及何时使用 CacheDataSource 以及何时使用 SimpleCache?


CacheDataSource and SimpleCache实现两个不同的目的。如果你看一下他们的类原型,你会发现CacheDataSource implements DataSource and 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);

While SimpleCache为您提供一个维护内存中表示的缓存实现。正如您在第一个代码块中看到的,CacheDataSourceFactory 构造函数需要一个Cache要使用的实例。您可以声明自己的缓存机制或使用默认的SimpleCacheExoPlayer 为您提供的类。如果您需要使用默认实现,您应该记住这一点:

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

根据文档 https://exoplayer.dev/doc/reference/com/google/android/exoplayer2/upstream/cache/SimpleCache.html。所以为了使用单个实例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; DR

We use CacheDataSource准备缓存媒体播放和SimpleCache来建立其DataSource.Factory实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

exoplayer 中的 CacheDataSource 与 SimpleCache? 的相关文章

随机推荐

  • SQL Server 2008 相对于 SQL Server 2005 有何优势? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • HTML5shiv 仅在 HEAD 部分有效?

    为了使我的网站尽可能快 我更喜欢在文档末尾加载 js 脚本 就在结束正文标记之前 为 HEAD 部分保留 css 但是 我发现下面的 html shiv 代码显然仅在 HEAD 部分实例化时才有效 有人知道解决方法吗 谷歌代码是NOTCDN
  • 将张量的完整值打印到控制台或写入张量流中的文件

    我需要将一个大张量 32 32 3 打印到控制台中 并且我只得到如下输出 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245
  • RCurl 和自签名证书问题

    我在获取时遇到问题RCurl功能getURL访问使用自签名证书的服务器上的 HTTPS URL 我在 Mac OS X 10 9 2 上运行 R 3 0 2 我已阅读FAQ http www omegahat org RCurl FAQ h
  • 如何才能随意关注一个react-select组件呢?

    使用react select v2 我想在用户按下某个键时显示并聚焦于 Select 元素 以下是我尝试过的一些事情或我走过的路 当我设置对 Select 元素的引用并尝试调用 focus上面说没有找到焦点功能 也许我应该以某种方式获取它的
  • Glassfish 3.1.1 上的 OpenJPA 2.1.1 增强问题

    我的问题是这个异常 Caused by
  • C 整数溢出

    我正在使用 C 中的整数 试图探索更多关于何时以及如何发生溢出的信息 我注意到 当我添加两个正数时 其总和会溢出 我总是得到一个负数 另一方面 如果我添加两个负数 其总和溢出 我总是得到一个正数 包括 0 我做了一些实验 但我想知道这是否适
  • Java PrintWriter 不工作

    我只是想将我的二维数组 拼图 写入文件 我有一个双 for 循环 它读取数组中的每个 char 值 并将它们写入文件 我似乎无法在我的代码中找到错误 该文件说当我运行程序时它已被修改 但它仍然是空白的 多谢你们 public void wr
  • 如何在 Visual Studio 2012 RC 中将数据库发布到提供者

    我的 Web 应用程序使用 MS SQL Server 2008 R2 Express 数据库 要在 Visual Studio 2010 中生成数据库脚本 我可以在服务器资源管理器中右键单击我的数据库 然后选择发布到提供程序 但是 Vis
  • 在 ViewPager 中设置操作栏标题

    我的 ViewPager 由许多片段组成 我在 actionBar 内显示片段的标题 并且使用下面的代码来设置标题 由于 ViewPager 还启动相邻片段 我在操作栏中看到下一个片段的标题 正确的处理方法应该是什么在viewpager的a
  • 如何从用户定义的 ansible.cfg 设置 ansible_config 变量

    我有一个目录结构 在其中保存我的剧本 如下所示 home monk Ansible work ansible cfg playbook dir 1 playbook 1 yml playbook dir 2 playbook 2 yml p
  • 关于Android自定义权限的几个问题

    我正在学习 Android 编程 我已经了解了自定义权限的概念 根据我的理解 这是自定义权限的工作原理 Base app 可以通过声明自定义权限 即使用
  • Google Maps API V3 关闭信息框

    我有一个 Google 地图版本 3 但我无法完全按照我想要的方式工作 当地图打开时 页面上有几个标记 单击或悬停在标记上会打开一个带有酒店名称的小信息框 单击另一个标记将关闭第一个信息框并在新标记上打开一个新信息框 问题在于关闭最后一个信
  • 如何在 IntelliJ 中将目录标记为生成的测试源根目录?

    我正在 ubuntu 上的 Intellij 2016 1 但不使用 gradle 中尝试 Dagger2 Intellij 在以下任一位置创建 dagger 的生成源 out production
  • 从 GraphicBuffer 读取时出现意外的像素数据布局

    我目前正在本机 Android 框架中的一个平台上工作 在该平台上我使用 GraphicBuffer 来分配内存 然后从中创建 EGLImage 然后将其用作 OpenGL 中的纹理 使用简单的全屏四边形 问题是 当我从 GraphicBu
  • 继承而不是 typedef

    C 无法从 typedef 中创建模板或将 typedef 制作为模板类 我知道如果我继承并使我的类成为模板 它就会起作用 例子 Illegal template
  • XCode 7 上的 libswiftSecurity.dylib “没有这样的文件或目录 (2)”

    我正在尝试构建一个在 XCode 6 上运行正常的项目 但出现错误 Applications Xcode beta app Contents Developer Toolchains XcodeDefault xctoolchain usr
  • 精美的上传器,为每个上传的文件添加下载按钮的惯用方式

    我已经成功实施了优秀上传者 http fineuploader com进入我的项目 我正在使用添加初始文件 http docs fineuploader com branch master api methods html addIniti
  • 如何使用listview.GetItemAtPosition(e.Position)获取用户点击的ListView项目的数据?

    在 Xamarin Android 应用程序中 我有一个之前填充的 ListView 在正确触发的 listview ItemClick 事件处理程序中 我想检索单击的 listview item 视图的文本 以便在 AlertDialog
  • exoplayer 中的 CacheDataSource 与 SimpleCache?

    我对 ExoPlayer 及其文档非常困惑 请解释一下我们应该什么目的以及何时使用 CacheDataSource 以及何时使用 SimpleCache CacheDataSource and SimpleCache实现两个不同的目的 如果