Media3 媒体库
Jetpack Media3 是处理音视频播放和编辑的下一代标准库。它整合了原本分散的 ExoPlayer、MediaSession 和 MediaStyle notifications,提供了一个统一的 API 模型。
1. 为什么迁移到 Media3?
- 统一的 Player 接口: 以前 ExoPlayer 和 MediaSessionConnector 之间的桥接非常复杂,现在
ExoPlayer直接实现了Player接口。 - 更好的 Session 集成: 直接支持跨进程播放控制。
- 功能更全: 内置支持变速播放、音轨选择、边下边播等高级功能。
2. 添加依赖
kotlin
[versions]
media3 = "1.3.1"
[libraries]
androidx-media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" }
androidx-media3-ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3" }
androidx-media3-session = { group = "androidx.media3", name = "media3-session", version.ref = "media3" }kotlin
dependencies {
// 用于播放的基础库 (基于 ExoPlayer)
implementation(libs.androidx.media3.exoplayer)
// UI 组件 (PlayerView)
implementation(libs.androidx.media3.ui)
// MediaSession 支持
implementation(libs.androidx.media3.session)
}3. 实现基础视频播放
第一步:添加 PlayerView
xml
<androidx.media3.ui.PlayerView
android:id="@+id/player_view"
android:layout_width="match_parent"
android:layout_height="250dp" />第二步:初始化 Player
kotlin
private var player: ExoPlayer? = null
private fun initializePlayer() {
// 1. 创建 Player 实例
player = ExoPlayer.Builder(this).build().also { exoPlayer ->
binding.playerView.player = exoPlayer
// 2. 创建媒体项目
val mediaItem = MediaItem.fromUri("https://example.com/video.mp4")
exoPlayer.setMediaItem(mediaItem)
// 3. 准备并播放
exoPlayer.prepare()
exoPlayer.play()
}
}4. 后台播放 (MediaSessionService)
如果你需要应用在后台甚至锁屏时继续播放音乐,必须使用 MediaSessionService。
第一步:创建 Service
kotlin
class PlaybackService : MediaSessionService() {
private var mediaSession: MediaSession? = null
override fun onCreate() {
super.onCreate()
val player = ExoPlayer.Builder(this).build()
mediaSession = MediaSession.Builder(this, player).build()
}
override fun onGetSession(controllerInfo: MediaSession.ControllerInfo): MediaSession? = mediaSession
override fun onDestroy() {
mediaSession?.run {
player.release()
release()
mediaSession = null
}
super.onDestroy()
}
}第二步:Manifest 注册
xml
<service
android:name=".PlaybackService"
android:foregroundServiceType="mediaPlayback"
android:exported="true">
<intent-filter>
<action android:name="androidx.media3.session.MediaSessionService" />
</intent-filter>
</service>5. 常见功能
- 变速播放:
player.setPlaybackSpeed(1.5f) - 切换音轨: 通过
TrackSelectionParameters配置。 - 状态监听:kotlin
player.addListener(object : Player.Listener { override fun onPlaybackStateChanged(state: Int) { if (state == Player.STATE_ENDED) { // 播放结束 } } })