Skip to content

Media3 媒体库

源:Media3 概览

Jetpack Media3 是处理音视频播放和编辑的下一代标准库。它整合了原本分散的 ExoPlayerMediaSessionMediaStyle 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) {
                // 播放结束
            }
        }
    })