Android Media3 ExoPlayer 开发全攻略:从基础集成到高级功能实战
目录
1. 引言
2. 添加依赖
3. 初始化ExoPlayer并播放视频
3.1 XML 布局
3.2 初始化ExoPlayer
4. 控制播放
5. 监听播放状态
6. 播放网络流(HLS / DASH / RTSP)
7. ExoPlayer 进阶
7.1 手动切换功能
7.2 DRM 保护
8. 释放播放器资源
9. 从旧版迁移指南
10. 总结
相关推荐
1. 引言
Android Media3 是 Google 推出的新一代媒体处理框架,ExoPlayer 作为其核心组件,提供了比传统 MediaPlayer 更强大的功能和更高的灵活性。Media3 ExoPlayer 的主要优势包括:
-
支持 HLS、DASH、SmoothStreaming 等现代流媒体协议
-
高度可定制的播放器架构
-
自适应码率切换(ABR)优化
-
完善的 DRM 支持
-
改进的音频焦点处理
2. 添加依赖
首先,在build.gradle(模块级)中添加 Media3 ExoPlayer 依赖:
dependencies {//这里版本过高需要升级 SDK 至34 ,JDK 要 17def media3_version = "1.2.0"// 核心库implementation "androidx.media3:media3-exoplayer:$media3_version"// UI 组件implementation "androidx.media3:media3-ui:$media3_version"// 可选 DASH 支持implementation "androidx.media3:media3-exoplayer-dash:$media3_version"// 可选 HLS 支持implementation "androidx.media3:media3-exoplayer-hls:$media3_version"// 可选,支持 RTSPimplementation 'androidx.media3:media3-exoplayer-rtsp:$media3_versio'
}
这里版本过高需要升级 SDK 至34 ,JDK 要 17,否则会报如下错误:
Dependency 'androidx.media3:media3-ui:1.2.0' requires libraries and applications that
depend on it to compile against version 34 or later of the Android APIs.如果不想使用高版本可以使用1.0.0。
3. 初始化ExoPlayer并播放视频
使用ExoPlayer播放视频需要以下几个关键步骤:
- 初始化播放器
- 加载新闻
- 绑定到
PlayerView - 控制播放
3.1 XML 布局
在activity_main.xml 参数PlayerView:
<androidx.media3.ui.PlayerViewandroid:id="@+id/playerView"app:resize_mode="zoom"android:layout_width="match_parent"android:layout_height="match_parent"/>
3.2 初始化ExoPlayer
在MainActivity.kt(或MainActivity.java)中创建ExoPlayer并加载视频:
class ExoPlayerActivity : BaseActivity<ActivityExoplayerBinding>() {private var player: ExoPlayer? = null;override fun getLayoutID(): Int {return R.layout.activity_exoplayer}override fun init() {initExoPlayer()}private fun initExoPlayer() {player = ExoPlayer.Builder(this).build().also { exoPlayer ->mBind.playerView.player = exoPlayer//加载 raw 资源,网络资源替换Uri即可。val mediaItem: MediaItem = MediaItem.fromUri("android.resource://" + packageName + "/" + R.raw.sv_ad_video)exoPlayer.setMediaItem(mediaItem)exoPlayer.prepare()exoPlayer.playWhenReady = true}}override fun onDestroy() {super.onDestroy()// 确保在Activity销毁时释放播放器资源player?.release()player = null}
}
4. 控制播放
ExoPlayer 提供了一系列方法来控制播放状态:
player?.play() // 播放
player?.pause() // 暂停
player?.seekTo(20000) // 跳转到 20 秒
player?.stop() // 停止
player?.release() // 释放资源
5. 监听播放状态
您可以监听ExoPlayer播放状态,如播放错误、缓冲状态等:
player?.addListener(object : Player.Listener {override fun onPlaybackStateChanged(state: Int) {when (state) {ExoPlayer.STATE_READY -> {println("播放器已准备好")}ExoPlayer.STATE_BUFFERING -> {println("正在缓冲")}ExoPlayer.STATE_ENDED -> {println("播放完成")}}}override fun onPlayerError(error: PlaybackException) {println("播放错误: ${error.message}")}})

6. 播放网络流(HLS / DASH / RTSP)
ExoPlayer 支持 HTTP Live Streaming (HLS) 和 DASH 等流媒体格式。只需更改MediaItem即可:
// HLS 直播流
val mediaItem = MediaItem.fromUri("https://www.example.com/sample.m3u8")
player?.setMediaItem(mediaItem)
player?.prepare()
player?.play()
7. ExoPlayer 进阶
7.1 手动切换功能
如果视频流支持多种权限,可以手动选择播放质量:
val trackSelector = DefaultTrackSelector(this).apply {parameters = buildUponParameters().setMaxVideoSizeSd().build()
}
player = ExoPlayer.Builder(this).setTrackSelector(trackSelector).build()
7.2 DRM 保护
ExoPlayer也支持DRM(如Widevine),您可以这样加载受DRM保护的内容:
val drmSessionManager = DefaultDrmSessionManager.Builder().setKeyRequestParameters(mapOf("Content-Type" to "application/json")).build()
val mediaItem = MediaItem.Builder().setUri(videoUri).setDrmUuid(C.WIDEVINE_UUID).setDrmSessionManager(drmSessionManager).build()
player?.setMediaItem(mediaItem)
8. 释放播放器资源
当Activity或Fragment关闭时,需要释放ExoPlayer,避免内存泄漏:
override fun onDestroy() {super.onDestroy()// 确保在Activity/Fragment销毁时释放播放器资源player?.release()player = null}
内存管理:
-
在
onPause()时暂停播放 -
在
onStop()时释放播放器资源 -
使用
Player.STATE_IDLE检测非常规状态
9. 从旧版迁移指南
主要变化点:
| 旧版 (com.google.android.exoplayer) | 新版 (androidx.media3) |
|---|---|
| SimpleExoPlayer | ExoPlayer |
| DefaultTrackSelector | 保持不变 |
| PlayerView | PlayerView |
| MediaSource | MediaItem |
10. 总结
| 功能 | 代码示例 |
|---|---|
| 初始化播放器 | ExoPlayer.Builder(this).build() |
| 播放本地视频 | MediaItem.fromUri("file:///path/to/video.mp4") |
| 播放网络文学 | MediaItem.fromUri("https://www.example.com/sample.m3u8") |
| 监听播放状态 | player.addListener(Player.Listener { ... }) |
| 自定义 UI | PlayerControlView |
| 手动切换 | DefaultTrackSelector() |
| DRM 支持 | setDrmUuid(C.WIDEVINE_UUID) |
| 下载资源 | player.release() |
Media3 ExoPlayer 通过模块化设计和持续更新,为 Android 开发者提供了更现代、更强大的媒体播放解决方案。本文示例已实现基本播放功能,开发者可根据需求扩展实现:
-
字幕渲染
-
多音轨切换
-
播放速度控制
-
自定义 UI 皮肤
-
离线缓存管理
相关推荐
OkHttp深度解析:请求流程、分发器机制、拦截器工作及TCP连接复用-CSDN博客文章浏览阅读1.6k次,点赞78次,收藏64次。OkHttp是一个高效的HTTP客户端库,其请求流程包括创建OkHttpClient实例、Request对象,通过Call对象执行请求,并可选择同步或异步方式处理响应。OkHttp分发器负责调配请求任务,维护请求队列和线程池,确保请求有序执行。拦截器机制基于责任链模式,允许用户自定义请求和响应的处理逻辑。此外,OkHttp通过连接池机制复用TCP连接,提高性能并减少资源消耗。这些特性使得OkHttp成为处理HTTP请求的强大工具,广泛应用于各种Java和Android项目中。https://shuaici.blog.csdn.net/article/details/144860202Android内存优化指南:从数据结构到5R法则的全面策略_android 内存管理指南-CSDN博客文章浏览阅读1.5k次,点赞68次,收藏62次。Android内存优化涉及多个方面,从选择合适的数据结构如ArrayMap和SparseArray以减少内存占用,到避免使用内存开销大的枚举类型。谨慎使用多进程和large heap选项,同时充分利用NDK进行内存管理。图片优化是关键,通过采样、缓存和格式转换等方式减少内存占用。此外,遵循5R法则——释放、回收、减少、重用和检查,确保资源得到有效管理。这些策略共同构成了一套全面的Android内存优化方案,有助于提升应用性能和用户体验。_android 内存管理指南
https://shuaici.blog.csdn.net/article/details/145811726
相关文章:
Android Media3 ExoPlayer 开发全攻略:从基础集成到高级功能实战
目录 1. 引言 2. 添加依赖 3. 初始化ExoPlayer并播放视频 3.1 XML 布局 3.2 初始化ExoPlayer 4. 控制播放 5. 监听播放状态 6. 播放网络流(HLS / DASH / RTSP) 7. ExoPlayer 进阶 7.1 手动切换功能 7.2 DRM 保护 8. 释放播放器资源 9. 从旧…...
Trae与Builder模式初体验
说明 下载的国际版:https://www.trae.ai/ 建议 要选新模型 效果 还是挺不错的,遇到问题反馈一下,AI就帮忙解决了,真是动动嘴(打打字就行了),做些小的原型效果或演示Demo很方便呀ÿ…...
鸿蒙编译框架插件HvigorPlugin接口的用法介绍
鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。 在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或…...
如何通过修改hosts文件、启动Apache服务器、修改httpd.conf文件、配置虚拟主机、创建站点目录和文件等步骤来配置虚拟主机并发布PHP站点
Web服务器配置——修改hosts文件,将域名解析到本地 核心内容:介绍了如何通过修改hosts文件来实现将任意域名解析到本地,以便在开发过程中使用自定义域名访问本地站点。步骤: 打开位于C:\Windows\System32\drivers\etc的hosts文件…...
kotlin与MVVM的结合使用总结(二)
在 MVVM(Model - View - ViewModel)架构中,M 层即 Model 层,主要负责数据的管理、存储和获取,它与业务逻辑和数据处理相关。在 Kotlin 中实现 MVVM 的 M 层,通常会涉及数据类的定义、数据的本地存储与远程获…...
MOEFeedForward 模块
代码 class FeedForward(nn.Module):def __init__(self, config: LMConfig):super().__init__()if config.hidden_dim is None:hidden_dim 4 * config.dimhidden_dim int(2 * hidden_dim / 3)config.hidden_dim config.multiple_of * ((hidden_dim config.multiple_of - 1…...
笔记:代码随想录算法训练营day41:LeetCode121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
学习资料:代码随想录 121. 买卖股票的最佳时机 力扣题目链接 思路:注意题意只能买卖一次 定义:dp[i][0]表示不持有当前股票,dp[i][1]表示持有当前股票 递推公式:今天持有分之前就持有和今天才买,今天不…...
政策助力,3C 数码行业数字化起航
政策引领,数字经济浪潮来袭 在当今时代,数字经济已成为全球经济发展的核心驱动力,引领着新一轮科技革命和产业变革的潮流。我国深刻洞察这一发展趋势,大力推进数字化经济发展战略,为经济的高质量发展注入了强大动力。 …...
MySQL数据库复制
文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库,支撑它如此出彩的因素主要有两个&am…...
安装 ubuntu 2404 LTS 服务器 设置 服务器名称
安装 ubuntu服务器 设置 服务器名称 hostname 打开终端(Terminal),通过快捷键CtrlAltT或在应用程序中搜索"终端"来打开;在终端中输入以下命令:hostname,然后按下回车键即可查看本机服务器名称。…...
101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠
1. 前言 在使用 OpenLayers 进行地图开发时,我们经常需要在地图上添加点、线、区域等图形,并给它们附加文字标签。但当地图上的标注较多时,文字标签可能会发生重叠,导致用户无法清晰地查看地图信息。 幸运的是,OpenL…...
uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能
组件下载地址:https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序,理论支持全平台 亮点: 简单易用 使用js计算而不是resize属性,定制化程度更高 组件挂在后可播放指示线动画,提示用户可以拖拽比较图片…...
深度学习与大模型-矩阵
矩阵其实在我们的生活中也有很多应用,只是我们没注意罢了。 1. 矩阵是什么? 简单来说,矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵,可以写成这样: 这个矩阵有2行3列,每个数字都有一个位置&a…...
搭建基于chatgpt的问答系统
一、语言模型,提问范式与 Token 1.语言模型 大语言模型(LLM)是通过预测下一个词的监督学习方式进行训练的,通过预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力。 a.基础语言模型 (Base LLM&…...
LuaJIT 学习(2)—— 使用 FFI 库的几个例子
文章目录 介绍Motivating Example: Calling External C Functions例子:Lua 中调用 C 函数 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子…...
解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
大家好!今天我要向大家介绍一个充满潜力的开源项目——coze-sharp!这是一个基于 C# 开发的 Coze 客户端,旨在帮助开发者轻松接入 Coze AI 平台,打造智能应用。项目地址在这里:https://github.com/zhulige/coze-sharp&a…...
全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行
在使用多媒体处理软件或进行视频编辑时,你可能会遇到一个常见的问题——ffmpeg.dll文件丢失。这个错误不仅会中断你的工作流程,还可能导致软件无法正常运行。ffmpeg.dll是FFmpeg库中的一个关键动态链接库文件,负责处理视频和音频的编码、解码…...
Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)
一、计算机眼中的图像 像素 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同,每个像…...
Nginx 限流功能:原理、配置与应用
Nginx 限流功能:原理、配置与应用 在当今互联网应用的高并发场景下,服务器面临着巨大的压力。为了确保系统的稳定运行,保障核心业务的正常开展,限流成为了一项至关重要的技术手段。Nginx 作为一款高性能的 Web 服务器和反向代理服…...
【大模型学习】第十九章 什么是迁移学习
目录 1. 迁移学习的起源背景 1.1 传统机器学习的问题 1.2 迁移学习的提出背景 2. 什么是迁移学习 2.1 迁移学习的定义 2.2 生活实例解释 3. 技术要点与原理 3.1 迁移学习方法分类 3.1.1 基于特征的迁移学习(Feature-based Transfer) 案例说明 代码示例 3.1.2 基于…...
小米路由器SSH下安装DDNS-GO
文章目录 前言一、下载&安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS? DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP,DDNS可以将路由器变化的外网I…...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
树莓科技集团董事长:第五代产业园运营模式的深度剖析与展望
第五代产业园运营模式,以创新为核心驱动,强调数字化、网络化和资源整合。树莓科技集团在这一领域具有代表性,其运营模式值得深入剖析。 核心特征 数字化转型:第五代产业园高度重视数字化技术的应用,通过构建数字化平…...
go语言zero框架拉取内部平台开发的sdk报错的修复与实践
在开发过程中,我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时,尤其是在连接到私有平台,如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误,通常是因为 Go 没有适当的认证…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式
在现代化铁路系统的庞大网络中,其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中,AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系,开创了铁路行业移动端数字…...
LInux基础--apache部署网站
httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时,会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2,其…...
Linux内核套接字以及分层模型
一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中,而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题: 如何建立物理连接?使用什么样的线缆?通信介质有那些限制和特殊…...
Linux《基础开发工具(中)》
在之前的Linux《基础开发工具(上)》当中已经了解了Linux当中到的两大基础的开发工具yum与vim;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式,那么接下来在本篇当中将接下去继续来了解另…...
使用1Panel一键搭建WordPress网站的详细教程(全)
嘿,各位想搭建自己网站的朋友们!今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话,我之前对服务器运维一窍不通,但通过这次尝试,我发现原来建站可以这么简单!下面是我的亲身经历和一些小技巧…...
