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

相关推荐
zhangphil20 小时前
Android图像显示,CPU的Skia与GPU的Vulkan高性能渲染系统
android
故事不长丨21 小时前
安卓相机开发:Camera、Camera2与CameraX的使用对比及选型指南
android·相机·camera·camerax·camera2·移动设备·相机开发
_李小白21 小时前
【Android 美颜相机】第七天:GLTextureView 解析
android·数码相机
honortech21 小时前
Android studio中配置gradle和对应的AGP版本
android·ide·android studio
廋到被风吹走1 天前
【数据库】【MySQL】事务隔离深度解析:MVCC 实现与幻读解决机制
android·数据库·mysql
AC赳赳老秦1 天前
技术文档合著:DeepSeek辅助多人协作文档的风格统一与内容补全
android·大数据·人工智能·微服务·golang·自动化·deepseek
赛恩斯1 天前
安卓构建工具D8和R8的区别
android
—Qeyser1 天前
Flutter CustomScrollView 自定义滚动视图 - 完全指南
android·flutter·ios
鸣弦artha1 天前
Flutter 框架跨平台鸿蒙开发 —— Image Widget 图片处理:圆角、裁剪、阴影
android·flutter·harmonyos
—Qeyser1 天前
Flutter ListView 列表组件完全指南
android·flutter·ios