限时福利领取


背景与痛点

Android 原生 MediaPlayer 虽然简单易用,但在处理本地视频时存在明显短板:

  • 格式兼容性差:对 MKV、FLV 等容器格式支持有限,H.265 解码需要系统层支持
  • 内存管理粗糙:大文件预加载可能导致 OOM,缺乏精细化的缓冲控制
  • 扩展性不足:难以添加自定义解码器或修改播放策略

视频播放性能对比

技术选型

对比主流播放方案:

  1. MediaPlayer:系统内置但功能有限,适合简单场景
  2. FFmpeg:全能但集成复杂度高,需要 JNI 开发
  3. ExoPlayer:Google 开源方案,优势包括:
  4. 模块化架构(可替换 Demuxer/Decoder/Renderer)
  5. 自适应比特率切换(针对网络流媒体)
  6. 详细的播放状态回调

核心实现

基础配置

// build.gradle
implementation 'com.google.android.exoplayer:exoplayer:2.18.1'

// 初始化
val player = ExoPlayer.Builder(context)
    .setLoadControl(DefaultLoadControl.Builder()
        .setBufferDurationsMs(
            MIN_BUFFER_MS,  // 最小缓冲(ms)
            MAX_BUFFER_MS,  // 最大缓冲
            PLAYBACK_BUFFER_MS,  // 播放时缓冲
            REBUFFER_MS  // 重缓冲
        ).build())
    .build()

本地视频加载

val dataSourceFactory = DefaultDataSource.Factory(context)
val mediaItem = MediaItem.fromUri("file://${videoFile.path}")
player.setMediaItem(mediaItem)
player.prepare()

// 关键事件监听
player.addListener(object : Player.Listener {
    override fun onPlayerError(error: PlaybackException) {
        // 处理解码错误
    }
})

ExoPlayer架构图

性能优化

内存管理

  1. 使用 DefaultLoadControl 调整缓冲窗口:
  2. 1080P 视频建议 MIN_BUFFER_MS=2000,MAX_BUFFER_MS=5000
  3. 4K 视频需扩大至 MIN_BUFFER_MS=4000

  4. 释放资源:

    override fun onDestroy() {
        player.release()  // 必须调用防止内存泄漏
    }

硬件加速

<!-- AndroidManifest.xml -->
<uses-feature android:name="android.hardware.vulkan.level" android:required="false" />
<uses-feature android:name="android.software.vulkan.deqp.level" android:required="false" />

避坑指南

  1. 权限问题
  2. Android 11+ 需添加 MANAGE_EXTERNAL_STORAGE 权限
  3. 实际路径通过 FileProvider 获取

  4. 解码失败

  5. 检测设备支持格式:MediaCodecList.findDecoderForFormat()
  6. 备用软件解码器:FrameworkMediaCodecAdapter

  7. 卡顿优化

  8. 禁用音频时设置 audioTrackType=AudioTrack.OFFLOAD_MODE_DISABLED
  9. 启用 MediaCodec.VIDEO_SCALING_MODE_SCALE_TO_FIT 降低渲染开销

延伸阅读

  • 官方文档:ExoPlayer Developer Guide
  • 高级特性:自定义 LoadControl/Renderer 实现
  • 性能分析工具:Android Profiler + EventLogger
Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐