目录
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