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

相关推荐
沐怡旸19 小时前
【底层机制】【Android】Binder架构与原理
android·面试
木易士心20 小时前
Android setContentView源码与原理分析
android
00后程序员张21 小时前
iOS混淆与IPA文件加固全流程实战 防止苹果应用被反编译的工程级方案
android·ios·小程序·https·uni-app·iphone·webview
用户41659673693551 天前
Jetpack Compose 进阶:实现列表嵌套悬停(LazyColumn & HorizontalPager)
android
2501_915106321 天前
iOS 应用加固与苹果软件混淆指南,如何防止 IPA 被反编译与二次打包?
android·ios·小程序·https·uni-app·iphone·webview
huibin1478523691 天前
不能识别adb/usb口记录
android·adb
黄林晴1 天前
Kotlin 2.3.0-Beta1 重磅发布:这些新特性让代码更安全、更高效!
android·kotlin
2501_915921431 天前
iOS 应用加固与苹果软件混淆全解析 IPA 文件防反编译、混淆加密与无源码加固策略
android·macos·ios·小程序·uni-app·cocoa·iphone