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

相关推荐
LSL666_2 小时前
5 Repository 层接口
android·运维·elasticsearch·jenkins·repository
alexhilton6 小时前
在Jetpack Compose中创建CRT屏幕效果
android·kotlin·android jetpack
2501_940094028 小时前
emu系列模拟器最新汉化版 安卓版 怀旧游戏模拟器全集附可运行游戏ROM
android·游戏·安卓·模拟器
下位子8 小时前
『OpenGL学习滤镜相机』- Day9: CameraX 基础集成
android·opengl
参宿四南河三10 小时前
Android Compose SideEffect(副作用)实例加倍详解
android·app
火柴就是我10 小时前
mmkv的 mmap 的理解
android
没有了遇见10 小时前
Android之直播宽高比和相机宽高比不支持后动态获取所支持的宽高比
android
shenshizhong11 小时前
揭开 kotlin 中协程的神秘面纱
android·kotlin
vivo高启强11 小时前
如何简单 hack agp 执行过程中的某个类
android
沐怡旸11 小时前
【底层机制】 Android ION内存分配器深度解析
android·面试