Android Media3 ExoPlayer 开发全攻略:从基础集成到高级功能实战

news2025/3/14 19:45:13

目录

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 要 17
    def 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"
    // 可选,支持 RTSP
    implementation '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播放视频需要以下几个关键步骤:

  1. 初始化播放器
  2. 加载新闻
  3. 绑定到PlayerView
  4. 控制播放

3.1 XML 布局

        在activity_main.xml 参数PlayerView

    <androidx.media3.ui.PlayerView
        android: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. 释放播放器资源

        当ActivityFragment关闭时,需要释放ExoPlayer,避免内存泄漏:

    override fun onDestroy() {
        super.onDestroy()
        // 确保在Activity/Fragment销毁时释放播放器资源
        player?.release()
        player = null
    }

   内存管理

  •  在 onPause() 时暂停播放

  •  在 onStop() 时释放播放器资源

  •  使用 Player.STATE_IDLE 检测非常规状态

9. 从旧版迁移指南

主要变化点:

旧版 (com.google.android.exoplayer)新版 (androidx.media3)
SimpleExoPlayerExoPlayer
DefaultTrackSelector保持不变
PlayerViewPlayerView
MediaSourceMediaItem

10. 总结

功能代码示例
初始化播放器ExoPlayer.Builder(this).build()
播放本地视频MediaItem.fromUri("file:///path/to/video.mp4")
播放网络文学MediaItem.fromUri("https://www.example.com/sample.m3u8")
监听播放状态player.addListener(Player.Listener { ... })
自定义 UIPlayerControlView
手动切换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

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

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

相关文章

Trae与Builder模式初体验

说明 下载的国际版&#xff1a;https://www.trae.ai/ 建议 要选新模型 效果 还是挺不错的&#xff0c;遇到问题反馈一下&#xff0c;AI就帮忙解决了&#xff0c;真是动动嘴&#xff08;打打字就行了&#xff09;&#xff0c;做些小的原型效果或演示Demo很方便呀&#xff…

如何通过修改hosts文件、启动Apache服务器、修改httpd.conf文件、配置虚拟主机、创建站点目录和文件等步骤来配置虚拟主机并发布PHP站点

Web服务器配置——修改hosts文件&#xff0c;将域名解析到本地 核心内容&#xff1a;介绍了如何通过修改hosts文件来实现将任意域名解析到本地&#xff0c;以便在开发过程中使用自定义域名访问本地站点。步骤&#xff1a; 打开位于C:\Windows\System32\drivers\etc的hosts文件…

政策助力,3C 数码行业数字化起航

政策引领&#xff0c;数字经济浪潮来袭 在当今时代&#xff0c;数字经济已成为全球经济发展的核心驱动力&#xff0c;引领着新一轮科技革命和产业变革的潮流。我国深刻洞察这一发展趋势&#xff0c;大力推进数字化经济发展战略&#xff0c;为经济的高质量发展注入了强大动力。 …

MySQL数据库复制

文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库&#xff0c;支撑它如此出彩的因素主要有两个&am…

101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠

1. 前言 在使用 OpenLayers 进行地图开发时&#xff0c;我们经常需要在地图上添加点、线、区域等图形&#xff0c;并给它们附加文字标签。但当地图上的标注较多时&#xff0c;文字标签可能会发生重叠&#xff0c;导致用户无法清晰地查看地图信息。 幸运的是&#xff0c;OpenL…

uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序&#xff0c;理论支持全平台 亮点&#xff1a; 简单易用 使用js计算而不是resize属性&#xff0c;定制化程度更高 组件挂在后可播放指示线动画&#xff0c;提示用户可以拖拽比较图片…

深度学习与大模型-矩阵

矩阵其实在我们的生活中也有很多应用&#xff0c;只是我们没注意罢了。 1. 矩阵是什么&#xff1f; 简单来说&#xff0c;矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵&#xff0c;可以写成这样&#xff1a; 这个矩阵有2行3列&#xff0c;每个数字都有一个位置&a…

搭建基于chatgpt的问答系统

一、语言模型&#xff0c;提问范式与 Token 1.语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词的监督学习方式进行训练的&#xff0c;通过预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力。 a.基础语言模型 &#xff08;Base LLM&…

LuaJIT 学习(2)—— 使用 FFI 库的几个例子

文章目录 介绍Motivating Example: Calling External C Functions例子&#xff1a;Lua 中调用 C 函数 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子&#xf…

解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目

大家好&#xff01;今天我要向大家介绍一个充满潜力的开源项目——coze-sharp&#xff01;这是一个基于 C# 开发的 Coze 客户端&#xff0c;旨在帮助开发者轻松接入 Coze AI 平台&#xff0c;打造智能应用。项目地址在这里&#xff1a;https://github.com/zhulige/coze-sharp&a…

全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行

在使用多媒体处理软件或进行视频编辑时&#xff0c;你可能会遇到一个常见的问题——ffmpeg.dll文件丢失。这个错误不仅会中断你的工作流程&#xff0c;还可能导致软件无法正常运行。ffmpeg.dll是FFmpeg库中的一个关键动态链接库文件&#xff0c;负责处理视频和音频的编码、解码…

Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)

一、计算机眼中的图像 像素 像素是图像的基本单元&#xff0c;每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像&#xff0c;在计算机中&#xff0c;图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同&#xff0c;每个像…

小米路由器SSH下安装DDNS-GO

文章目录 前言一、下载&#xff06;安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS&#xff1f; DDNS&#xff08;Dynamic Domain Name Server&#xff09;是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP&#xff0c;DDNS可以将路由器变化的外网I…

go语言zero框架拉取内部平台开发的sdk报错的修复与实践

在开发过程中&#xff0c;我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时&#xff0c;尤其是在连接到私有平台&#xff0c;如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误&#xff0c;通常是因为 Go 没有适当的认证…

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线&#xff0c;一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线&#xff0c;插入手机充电口&#xff08;可能会需要转接头&#xff09; 然后确保手机开机 按下键盘…

工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式

在现代化铁路系统的庞大网络中&#xff0c;其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中&#xff0c;AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系&#xff0c;开创了铁路行业移动端数字…

LInux基础--apache部署网站

httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时&#xff0c;会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2&#xff0c;其…

Linux内核套接字以及分层模型

一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中&#xff0c;而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题&#xff1a; 如何建立物理连接&#xff1f;使用什么样的线缆&#xff1f;通信介质有那些限制和特殊…

Linux《基础开发工具(中)》

在之前的Linux《基础开发工具&#xff08;上&#xff09;》当中已经了解了Linux当中到的两大基础的开发工具yum与vim&#xff1b;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式&#xff0c;那么接下来在本篇当中将接下去继续来了解另…

使用1Panel一键搭建WordPress网站的详细教程(全)

嘿&#xff0c;各位想搭建自己网站的朋友们&#xff01;今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话&#xff0c;我之前对服务器运维一窍不通&#xff0c;但通过这次尝试&#xff0c;我发现原来建站可以这么简单&#xff01;下面是我的亲身经历和一些小技巧…