Jetpack —> Media3的分析和使用

​## 🧩 一、Media3 是什么?

Media3 是 Google 将 ExoPlayerMediaSessionPlayerViewCast 等多个媒体相关组件统一整合后的新架构。

它的目标是:

用一套 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 使用

相关推荐
牛哇网络工作室2 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
一笑的小酒馆2 小时前
Androidiot蓝牙配网简单封装
android
愚公搬代码5 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
g10565591396 小时前
LAMP博客平台Wordpress实战
android·mysql·nginx·php
hunterandroid7 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
pengyu7 小时前
【Kotlin 协程修仙录 · 元婴境 · 中阶】 | 操作符真解:Flow 中间操作符与数据流变幻术
android·kotlin
pengyu8 小时前
【Kotlin 协程修仙录 · 元婴境 · 初阶】 | 冷流初啼:Flow 的基础与响应式编程的入门
android·kotlin
wawo009 小时前
Kuikly实践-从Android compose迁移到kuikly compose
android
Carson带你学Android11 小时前
Android 版 MCP 正式登场:AppFunctions
android·ai编程·jetbrains
古法安卓14 小时前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio