Android Media3 ExoPlayer 开启缓存功能

news2024/12/26 10:48:26

    ExoPlayer 开启播放缓存功能,在下次加载已经播放过的网络资源的时候,可以直接从本地缓存加载,实现为用户节省流量和提升加载效率的作用。

方法一:采用 ExoPlayer 缓存策略

第 1 步:实现 Exoplayer

参考 Exoplayer 官网 Release notes :

对应关系:

2.19.0 (2023-07-05)  -- AndroidX Media3 1.1.0 release.

2.19.1 (2023-08-14)  -- AndroidX Media3 1.1.1 release

    Exoplayer 从 2.19.0 开始迁移至 AndroidX 的 Media3 框架内,2.19.1 是 Exoplayer 作为独立项目发布的最后一个版本,所以引入 Exoplayer 2.19.1 有以下两个方式,建议采用最新的方式 2。

# 方式1
implementation 'com.google.android.exoplayer:exoplayer-core:2.19.1'
implementation 'com.google.android.exoplayer:exoplayer-dash:2.19.1'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.19.1'

# 方式2
implementation "androidx.media3:media3-exoplayer:1.1.1"
implementation "androidx.media3:media3-exoplayer-dash:1.1.1"
implementation "androidx.media3:media3-ui:1.1.1"

第 2 步:在应用程序类中创建缓存策略

public SimpleCache simpleCache;
@Override
    public void onCreate() {
        super.onCreate();
        //缓存最大值为100M
        LeastRecentlyUsedCacheEvictor leastRecentlyUsedCacheEvictor = new LeastRecentlyUsedCacheEvictor(100 * 1024 * 1024);
        if (simpleCache == null) {
            simpleCache = new SimpleCache(getCacheDir(), leastRecentlyUsedCacheEvictor, new ExoDatabaseProvider(this));
        }
}

第 3 步:加载数据源,实现缓存

//本地资源(如:/sdcard/media/1.mp4)或 HTTP 资源
Uri videoUri = Uri.parse("YOUR URL");
MediaItem mediaItem = MediaItem.fromUri(videoUri);
DefaultHttpDataSource.Factory httpDataSourceFactory = new DefaultHttpDataSource.Factory().setAllowCrossProtocolRedirects(true);
// 这里的DefaultDataSource同时支持本地和HTTP请求的资源,自动实现检测 (The DefaultDataSource supports both local and Http sources. It automatically detects which one to use.)
DefaultDataSource.Factory defaultDataSourceFactory = new DefaultDataSourceFactory(requireContext(), httpDataSourceFactory);
//实现缓存
CacheDataSource.Factory cacheDataSourceFactory = new CacheDataSource.Factory()
                .setCache(MyApplication.getAppInstance().simpleCache)
                .setUpstreamDataSourceFactory(defaultDataSourceFactory)
                .setFlags(CacheDataSource.FLAG_IGNORE_CACHE_ON_ERROR);

MediaSource mediaSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
                .createMediaSource(mediaItem);
player.setMediaSource(mediaSource, true);

方法二:  通过 Android Video Cache Library

    开源库 AndroidVideoCache 的原理是通过代理的策略实现一个中间层,将网络视频请求转移到本地实现的代理服务器上,这样真正请求的数据就会被代理拿到,然后代理一边向本地写入数据,一边根据需要的数据看是读网络数据还是读本地缓存数据,从而实现数据的复用。

第 1 步:实现 VideoCache

implementation 'com.danikula:videocache:2.7.1'

第 2 步:在应用程序类中存储共享代理

public class MyApplication extends Application {

        private HttpProxyCacheServer proxy;

        public static HttpProxyCacheServer getProxy(Context context) {
            MyApplication app = (MyApplication) context.getApplicationContext();
            return app.proxy == null ? (app.proxy = app.newProxy()) : app.proxy;
        }
    
        private HttpProxyCacheServer newProxy() {
            return new HttpProxyCacheServer.Builder(this)
                    .maxCacheSize(1024 * 1024 * 1024)
                    .build();
    
        }

}

第 3 步:Exoplayer 接入缓存

HttpProxyCacheServer proxy = getProxy(activity);
//注意应采用来自代理的 url 而不是原始 url 来添加缓存
String proxyUrl = proxy.getProxyUrl(VIDEO_URL);
PlayerView playerView = findViewById(R.id.video_view);
ExoPlayer player = ExoPlayerFactory.newSimpleInstance(VideoActivity.this,
                new DefaultRenderersFactory(this),
                new DefaultTrackSelector());
MediaSource mediaSource = buildMediaSource(proxyUrl);
player.prepare(mediaSource, true, false);
playerView.setPlayer(player);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

概述 目前快递、外卖、团购、网购等行业 :为了简化用户在收发件地址填写时的体验感,使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家;让大家理解辅助定位及模糊地址检索的功能实现过程,以及开发出自己理想的作品…

【Java】应用层协议HTTP和HTTPS

HTTP和HTTPS协议 HTTPHTTP协议的工作过程HTTP协议格式抓包工具抓包结果 HTTP请求(Request)URL方法GET方法POST请求其他方法 报头(header)HostContent-lengthContent-TypeUser-AgentRefererCookie 正文(body) HTTP响应HTTP状态码响应报头(header)响应正文(body) 通过form表单构造…

【RocketMQ】(四)消息的拉取

在上一讲中,介绍了消息的存储,生产者向Broker发送消息之后,数据会写入到CommitLog中,这一讲,就来看一下消费者是如何从Broker拉取消息的。 RocketMQ消息的消费以组为单位,有两种消费模式: 广播…

c++拷贝对象时的优化问题

博主是基于VS2019测试的&#xff0c;不同编译器可能情况不一样。示例分析只有传值传参传值返回一道例题 博主是基于VS2019测试的&#xff0c;不同编译器可能情况不一样。 看下面这一个类A&#xff1a; class A { public:A(int a 0):_a(a){cout << "A(int a 0)&q…

通过stream流实现分页、模糊搜索、按列过滤功能

通过stream实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后&#xff0c;需要经过一定的逻辑处理才进行前端展示&#xff0c;这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…

Win7开机进入修复界面处理方法

Win7开机进入修复界面处理方法 2023-09-18 呓语煮酒 大家在使用Windows7的时候是否出现过这样一个问题&#xff0c;就是电脑开机后进入修复界面&#xff0c;界面如下&#xff1a; 一般出现这样的问题基本都是电脑主机非正常关机导致的。一般家用主机都是按照正常关机&#xf…

浅谈C++|STL之deque篇

一.deque基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端插入删除操作 deque与vector区别: vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访问元素时的速度会比d…

Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。 我们按以下方式来部署通信实例&#xff1a;在Kongming20上运行wget客户端程序&#xff08;一个在命令行下使用的网络下载工具&#xff0c;它支持通过HTTP、HTTPS和FTP协议下载文件&#xff09;&#xff0c;在ernest-laptop上运行squi…

udp的简单整理

最近思考udp处理的一些细节&#xff0c;根据公开课&#xff0c;反复思考&#xff0c;终于有所理解&#xff0c;做整理备用。 0&#xff1a;简单汇总 1&#xff1a;udp是基于报文传输的&#xff0c;接收方收取数据时要一次性读完。 2&#xff1a;借助udp进行发包&#xff0c;…

车载软件架构 —— AUTOSAR Vector SIP包(一)

车载软件架构 —— AUTOSAR Vector SIP包(一) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语&#xff1a;在日常的开发过程中&#xff0c;我们经常遇到下拉刷新的场景&#xff0c;很方便的刷新游览的内容&#xff0c;在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…

机器学习算法基础--Generalized Linear Regression Model

目录 1.数据的处理及查看 2.数据的处理及可视化 3.模型的创建与拟合 4.算法可视化效果图 5.多维度模型可视化 线性回归讲了很多次了&#xff0c;广义线性回归无非就是拟合的多项式曲线的次数的变化&#xff0c;就不再推导公式和算法流程了。 1.数据的处理及查看 import num…

人工智能轨道交通行业周刊-第60期(2023.9.11-9.17)

本期关键词&#xff1a;巡检机器人、重庆最强大脑、数字铁路规划、高铁起步、Baichuan 2大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…

​使用拥抱脸的稳定扩散世界 — 使用文本提示创建 AI 生成图像的扩散器库​

一、简介 你可能已经看到人工智能生成的图像有所增加&#xff0c;这是因为潜在扩散模型的兴起。简单来说&#xff0c;稳定扩散是一种深度学习模型&#xff0c;它可以在给定文本提示的情况下生成图像。 图1&#xff1a;稳定扩散概述 从上图可以看出&#xff0c;我们可以传递文本…

一次Python无法安装模块的问题探索与解决之旅

源起 在Windows 10系统中安装 Python 3.11.5版本&#xff08;目前最新版&#xff09;并安装模块 (比如flask)&#xff0c;安装步骤很简单&#xff1a; 到官方下载安装档https://www.python.org/downloads/点击安装文件安装Python到命令行执行 pip install packagename 安装扩…

基于SpringBoot的图书商城系统

基于SpringBootVue的网上书城系统、图书商城、网上书店系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1…

STM32F4X SPI W25Q128

STM32F4X SPI W25Q128 什么是SPISPI的特点SPI通信引脚SPI接线方式SPI速率SPI通信方式SPI时钟相位和时钟极性 STM32F4X SPISTM32F4X SPI配置STM32F4X SPI频率 W25Q128W25Q128存储结构W25Q128读写操作W25Q128常用指令读取ID命令(0x90)写使能命令(0x06)禁止写使能命令(0x04)读取W2…

7.前端·新建子模块与开发(自动生成)

文章目录 学习地址视频笔记自动代码生成模式开发增删改查功能调试功能权限分配 脚本实现权限分配 学习地址 https://www.bilibili.com/video/BV13g411Y7GS/?p15&spm_id_frompageDriver&vd_sourceed09a620bf87401694f763818a31c91e 视频笔记 自动代码生成模式开发 …

30分钟吃掉YOLOv8实例分割范例

本范例我们使用 torchkeras来实现对 ultralytics中的YOLOv8实例分割模型进行自定义的训练&#xff0c;从而对气球进行检测和分割。 尽管ultralytics提供了非常便捷且一致的训练API&#xff0c;再使用torchkeras实现自定义训练逻辑似乎有些多此一举。 但ultralytics的源码结构相…