## 🧩 一、Media3 是什么?
Media3
是 Google 将 ExoPlayer
、MediaSession
、PlayerView
、Cast
等多个媒体相关组件统一整合后的新架构。
它的目标是:
用一套 API 统一 Android 多媒体播放体验,同时完全兼容 ExoPlayer 的底层强大性能。
🎬 二、模块结构分析
Media3 的模块以 androidx.media3:
开头,核心模块如下:
模块名 | 功能说明 |
---|---|
media3-exoplayer |
🎥 播放器核心(新版 ExoPlayer 实现) |
media3-exoplayer-ui |
🎨 提供 PlayerView 等 UI 控件 |
media3-common |
🧩 包含核心接口(Player、MediaItem、PlaybackException 等) |
media3-session |
🔁 与系统 MediaSession 交互(锁屏控制、蓝牙耳机控制) |
media3-datasource-okhttp |
🌐 使用 OkHttp 加载网络数据源 |
media3-transformer |
✂️ 支持音视频转码、剪辑 |
media3-cast |
📺 支持 Google Cast 投屏 |
media3-test-utils |
🧪 测试辅助工具 |
⚙️ 三、Gradle 依赖
arduino
dependencies {
// 核心库
implementation "androidx.media3:media3-exoplayer:1.4.1"
// 用于 DASH 内容(如果不需要可以省略)
implementation "androidx.media3:media3-exoplayer-dash:1.4.1"
// 用于 HLS 内容(如果不需要可以省略)
implementation "androidx.media3:media3-exoplayer-hls:1.4.1"
// 用于平滑流媒体(如果不需要可以省略)
implementation "androidx.media3:media3-exoplayer-smoothstreaming:1.4.1"
// 用于 UI 组件和 MediaSession 集成
implementation "androidx.media3:media3-ui:1.4.1"
// 用于使用 Transformer 进行媒体转换
implementation "androidx.media3:media3-transformer:1.4.1"
// 用于使用 Effect 进行音频/视频处理
implementation "androidx.media3:media3-effect:1.4.1"
// 用于使用 Common 和 Datasource 模块
implementation "androidx.media3:media3-common:1.4.1"
implementation "androidx.media3:media3-datasource:1.4.1"
}
🎥 四、基本使用示例
1️⃣ 初始化播放器
ini
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.common.MediaItem
val player = ExoPlayer.Builder(context).build()
binding.playerView.player = player
2️⃣ 加载播放源
ini
val mediaItem = MediaItem.fromUri("https://example.com/video.mp4")
player.setMediaItem(mediaItem)
player.prepare()
player.playWhenReady = true
3️⃣ 释放资源
kotlin
override fun onDestroy() {
super.onDestroy()
player.release()
}
🎚️ 五、Media3 与旧版 ExoPlayer 的主要区别
对比项 | ExoPlayer (旧版) | Media3 (新版) |
---|---|---|
包名 | com.google.android.exoplayer2 |
androidx.media3.exoplayer |
播放接口 | ExoPlayer |
同名但继承 androidx.media3.common.Player |
数据源 | DataSource.Factory |
同样支持,但封装更灵活 |
播放项 | MediaItem |
同名但支持更多属性(如字幕、广告、metadata) |
UI | PlayerView |
支持更多属性(如手势、全屏切换) |
生命周期集成 | 需手动管理 | 支持 LifecycleOwner 自动释放 |
音视频转换 | 不支持 | ✅ media3-transformer 原生支持转码、剪辑 |
🔄 六、状态监听(新版方式)
新版监听接口不变,但包路径变为 androidx.media3.common.Player.Listener
:
kotlin
player.addListener(object : Player.Listener {
override fun onPlaybackStateChanged(state: Int) {
when (state) {
Player.STATE_IDLE -> Log.d("Media3", "空闲")
Player.STATE_BUFFERING -> Log.d("Media3", "缓冲中")
Player.STATE_READY -> Log.d("Media3", "准备完成")
Player.STATE_ENDED -> Log.d("Media3", "播放结束")
}
}
override fun onPlayerError(error: PlaybackException) {
Log.e("Media3", "播放出错: ${error.message}")
}
})
💾 七、缓存播放(新版 Media3 实现)
scss
import androidx.media3.datasource.cache.*
import androidx.media3.datasource.*
val cache = SimpleCache(
File(context.cacheDir, "media3_cache"),
LeastRecentlyUsedCacheEvictor(200L * 1024 * 1024) // 最大缓存 200MB
)
val dataSourceFactory = DefaultDataSource.Factory(context)
val cacheDataSourceFactory = CacheDataSource.Factory()
.setCache(cache)
.setUpstreamDataSourceFactory(dataSourceFactory)
val mediaItem = MediaItem.fromUri("https://example.com/video.mp4")
val mediaSource = ProgressiveMediaSource.Factory(cacheDataSourceFactory)
.createMediaSource(mediaItem)
player.setMediaSource(mediaSource)
player.prepare()
player.play()
🧱 八、完整封装(推荐项目中使用)
下面是一个通用播放器管理类,适配音频/视频播放:
kotlin
object Media3PlayerManager {
private var exoPlayer: ExoPlayer? = null
fun init(context: Context) {
if (exoPlayer == null) {
exoPlayer = ExoPlayer.Builder(context).build()
}
}
fun play(playerView: PlayerView, url: String) {
exoPlayer?.apply {
playerView.player = this
setMediaItem(MediaItem.fromUri(url))
prepare()
playWhenReady = true
}
}
fun pause() {
exoPlayer?.pause()
}
fun resume() {
exoPlayer?.play()
}
fun release() {
exoPlayer?.release()
exoPlayer = null
}
fun addListener(listener: Player.Listener) {
exoPlayer?.addListener(listener)
}
}
🧠 九、Media3 的设计理念(重点)
Media3 的核心思想是:
"播放器只是框架的一部分,媒体体验应是端到端统一的。"
也就是说,它不仅仅是播放视频,还要处理:
- 系统音量控制
- 后台播放与通知栏控制
- 蓝牙耳机控制
- 投屏与转码
- 多音轨、多字幕、广告管理
因此,Media3 是未来 Android 多媒体开发的标准方向。
✅ 十、总结
分类 | 内容 |
---|---|
框架名 | Media3(ExoPlayer 的继任者) |
核心模块 | media3-exoplayer , media3-ui |
优点 | 架构统一、功能更强、兼容性高、扩展方便 |
场景 | 视频播放、音频播放、缓存播放、后台播放、转码、广告插入 |
推荐做法 | 封装 Media3PlayerManager ,配合 ViewModel/Lifecycle 使用 |