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

相关推荐
00后程序员张6 小时前
python 抓包在实际项目中的合理位置,结合代理抓包、设备侧抓包与数据流分析
android·ios·小程序·https·uni-app·iphone·webview
灵感菇_7 小时前
Android Service全面解析
android·service·四大组件
alexhilton8 小时前
Jetpack ViewModel内幕:内部机制与跨平台设计
android·kotlin·android jetpack
_李小白10 小时前
【Android FrameWork】延伸阅读: Android应用安装过程
android
光头闪亮亮11 小时前
Android手持机扫码出入库的开发详解-6.APP下载更新
android
光头闪亮亮11 小时前
Android手持机扫码出入库的开发详解-7.SQLite CRUD操作
android
键来大师11 小时前
Android16 设置壁纸出现APK重启问题和悬浮控件等图标变成黑色图框
android·framework·rk3576
_李小白11 小时前
【Android FrameWork】第四十二天:PMS main函数
android
BoomHe12 小时前
Android LMK(Low Memory Killer)机制
android
时光呀时光慢慢走12 小时前
MAUI 开发安卓 MQTT 客户端:实现远程控制 (完整源码 + 避坑指南)
android·物联网·mqtt·c#