Jetpack —> Media3的分析和使用

595 阅读3分钟

​##  🧩 一、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 依赖

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️⃣ 初始化播放器

import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.common.MediaItem

val player = ExoPlayer.Builder(context).build()
binding.playerView.player = player

2️⃣ 加载播放源

val mediaItem = MediaItem.fromUri("https://example.com/video.mp4")
player.setMediaItem(mediaItem)
player.prepare()
player.playWhenReady = true

3️⃣ 释放资源

override fun onDestroy() {
    super.onDestroy()
    player.release()
}


🎚️ 五、Media3 与旧版 ExoPlayer 的主要区别

对比项ExoPlayer (旧版)Media3 (新版)
包名com.google.android.exoplayer2androidx.media3.exoplayer
播放接口ExoPlayer同名但继承 androidx.media3.common.Player
数据源DataSource.Factory同样支持,但封装更灵活
播放项MediaItem同名但支持更多属性(如字幕、广告、metadata)
UIPlayerView支持更多属性(如手势、全屏切换)
生命周期集成需手动管理支持 LifecycleOwner 自动释放
音视频转换不支持media3-transformer 原生支持转码、剪辑

🔄 六、状态监听(新版方式)

新版监听接口不变,但包路径变为 androidx.media3.common.Player.Listener

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 实现)

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()


🧱 八、完整封装(推荐项目中使用)

下面是一个通用播放器管理类,适配音频/视频播放:

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