Android Media3 ExoPlayer 开发全攻略:从基础集成到高级功能实战

目录

1. 引言

2. 添加依赖

3. 初始化ExoPlayer并播放视频

3.1 XML 布局

3.2 初始化ExoPlayer

4. 控制播放

5. 监听播放状态

6. 播放网络流(HLS / DASH / RTSP)

7. ExoPlayer 进阶

7.1 手动切换功能

7.2 DRM 保护

8. 释放播放器资源

9. 从旧版迁移指南

10. 总结

相关推荐


1. 引言

        Android Media3 是 Google 推出的新一代媒体处理框架,ExoPlayer 作为其核心组件,提供了比传统 MediaPlayer 更强大的功能和更高的灵活性。Media3 ExoPlayer 的主要优势包括:

  • 支持 HLS、DASH、SmoothStreaming 等现代流媒体协议

  • 高度可定制的播放器架构

  • 自适应码率切换(ABR)优化

  • 完善的 DRM 支持

  • 改进的音频焦点处理

2. 添加依赖

        首先,在build.gradle(模块级)中添加 Media3 ExoPlayer 依赖:

dependencies {
    //这里版本过高需要升级 SDK 至34 ,JDK 要 17
    def media3_version = "1.2.0"
    
    // 核心库
    implementation "androidx.media3:media3-exoplayer:$media3_version"
    // UI 组件
    implementation "androidx.media3:media3-ui:$media3_version"
    // 可选 DASH 支持
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // 可选 HLS 支持
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // 可选,支持 RTSP
    implementation 'androidx.media3:media3-exoplayer-rtsp:$media3_versio' 
}

这里版本过高需要升级 SDK 至34 ,JDK 要 17,否则会报如下错误:

Dependency 'androidx.media3:media3-ui:1.2.0' requires libraries and applications that
      depend on it to compile against version 34 or later of the Android APIs.

如果不想使用高版本可以使用1.0.0。

3. 初始化ExoPlayer并播放视频

使用ExoPlayer播放视频需要以下几个关键步骤:

  1. 初始化播放器
  2. 加载新闻
  3. 绑定到PlayerView
  4. 控制播放

3.1 XML 布局

        在activity_main.xml 参数PlayerView

    <androidx.media3.ui.PlayerView
        android:id="@+id/playerView"
        app:resize_mode="zoom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

3.2 初始化ExoPlayer

        在MainActivity.kt(或MainActivity.java)中创建ExoPlayer并加载视频:

class ExoPlayerActivity : BaseActivity<ActivityExoplayerBinding>() {

    private var player: ExoPlayer? = null;
    override fun getLayoutID(): Int {
        return R.layout.activity_exoplayer
    }

    override fun init() {
        initExoPlayer()
    }

    private fun initExoPlayer() {
        player = ExoPlayer.Builder(this).build().also { exoPlayer ->
            mBind.playerView.player = exoPlayer
            //加载 raw 资源,网络资源替换Uri即可。
            val mediaItem: MediaItem = MediaItem.fromUri("android.resource://" + packageName + "/" + R.raw.sv_ad_video)
            exoPlayer.setMediaItem(mediaItem)
            exoPlayer.prepare()
            exoPlayer.playWhenReady = true

        }
    }

    override fun onDestroy() {
        super.onDestroy()
        // 确保在Activity销毁时释放播放器资源
        player?.release()
        player = null
    }
}

4. 控制播放

    ExoPlayer 提供了一系列方法来控制播放状态:

player?.play()         // 播放
player?.pause()        // 暂停
player?.seekTo(20000)  // 跳转到 20 秒
player?.stop()         // 停止
player?.release()      // 释放资源

5. 监听播放状态

        您可以监听ExoPlayer播放状态,如播放错误、缓冲状态等:

        player?.addListener(object : Player.Listener {
            override fun onPlaybackStateChanged(state: Int) {
                when (state) {
                    ExoPlayer.STATE_READY -> {
                        println("播放器已准备好")
                    }
                    ExoPlayer.STATE_BUFFERING -> {
                        println("正在缓冲")
                    }
                    ExoPlayer.STATE_ENDED -> {
                        println("播放完成")
                    }
                }
            }

            override fun onPlayerError(error: PlaybackException) {
                println("播放错误: ${error.message}")
            }
        })

6. 播放网络流(HLS / DASH / RTSP)

    ExoPlayer 支持 HTTP Live Streaming (HLS) 和 DASH 等流媒体格式。只需更改MediaItem即可:

// HLS 直播流
val mediaItem = MediaItem.fromUri("https://www.example.com/sample.m3u8") 
player?.setMediaItem(mediaItem)
player?.prepare()
player?.play()

7. ExoPlayer 进阶

7.1 手动切换功能

        如果视频流支持多种权限,可以手动选择播放质量:

val trackSelector = DefaultTrackSelector(this).apply {
    parameters = buildUponParameters().setMaxVideoSizeSd().build()
}
player = ExoPlayer.Builder(this).setTrackSelector(trackSelector).build()

7.2 DRM 保护

ExoPlayer也支持DRM(如Widevine),您可以这样加载受DRM保护的内容:

val drmSessionManager = DefaultDrmSessionManager.Builder()
    .setKeyRequestParameters(mapOf("Content-Type" to "application/json"))
    .build()
val mediaItem = MediaItem.Builder()
    .setUri(videoUri)
    .setDrmUuid(C.WIDEVINE_UUID)
    .setDrmSessionManager(drmSessionManager)
    .build()
player?.setMediaItem(mediaItem)

8. 释放播放器资源

        当ActivityFragment关闭时,需要释放ExoPlayer,避免内存泄漏:

    override fun onDestroy() {
        super.onDestroy()
        // 确保在Activity/Fragment销毁时释放播放器资源
        player?.release()
        player = null
    }

   内存管理

  •  在 onPause() 时暂停播放

  •  在 onStop() 时释放播放器资源

  •  使用 Player.STATE_IDLE 检测非常规状态

9. 从旧版迁移指南

主要变化点:

旧版 (com.google.android.exoplayer) 新版 (androidx.media3)
SimpleExoPlayer ExoPlayer
DefaultTrackSelector 保持不变
PlayerView PlayerView
MediaSource MediaItem

10. 总结

功能 代码示例
初始化播放器 ExoPlayer.Builder(this).build()
播放本地视频 MediaItem.fromUri("file:///path/to/video.mp4")
播放网络文学 MediaItem.fromUri("https://www.example.com/sample.m3u8")
监听播放状态 player.addListener(Player.Listener { ... })
自定义 UI PlayerControlView
手动切换 DefaultTrackSelector()
DRM 支持 setDrmUuid(C.WIDEVINE_UUID)
下载资源 player.release()

    Media3 ExoPlayer 通过模块化设计和持续更新,为 Android 开发者提供了更现代、更强大的媒体播放解决方案。本文示例已实现基本播放功能,开发者可根据需求扩展实现:

  • 字幕渲染

  • 多音轨切换

  • 播放速度控制

  • 自定义 UI 皮肤

  • 离线缓存管理

相关推荐

OkHttp深度解析:请求流程、分发器机制、拦截器工作及TCP连接复用-CSDN博客文章浏览阅读1.6k次,点赞78次,收藏64次。OkHttp是一个高效的HTTP客户端库,其请求流程包括创建OkHttpClient实例、Request对象,通过Call对象执行请求,并可选择同步或异步方式处理响应。OkHttp分发器负责调配请求任务,维护请求队列和线程池,确保请求有序执行。拦截器机制基于责任链模式,允许用户自定义请求和响应的处理逻辑。此外,OkHttp通过连接池机制复用TCP连接,提高性能并减少资源消耗。这些特性使得OkHttp成为处理HTTP请求的强大工具,广泛应用于各种Java和Android项目中。 https://shuaici.blog.csdn.net/article/details/144860202Android内存优化指南:从数据结构到5R法则的全面策略_android 内存管理指南-CSDN博客文章浏览阅读1.5k次,点赞68次,收藏62次。Android内存优化涉及多个方面,从选择合适的数据结构如ArrayMap和SparseArray以减少内存占用,到避免使用内存开销大的枚举类型。谨慎使用多进程和large heap选项,同时充分利用NDK进行内存管理。图片优化是关键,通过采样、缓存和格式转换等方式减少内存占用。此外,遵循5R法则——释放、回收、减少、重用和检查,确保资源得到有效管理。这些策略共同构成了一套全面的Android内存优化方案,有助于提升应用性能和用户体验。_android 内存管理指南 https://shuaici.blog.csdn.net/article/details/145811726

猜你喜欢

转载自blog.csdn.net/g984160547/article/details/146093650
今日推荐