You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android端使用Exoplayer播放AES-128加密的HLS m3u8视频

ExoPlayer播放AES-128加密HLS流实现方案

ExoPlayer原生支持HLS标准的AES-128加密流播放,无需自行实现AES解密逻辑,按以下步骤配置即可:

1. 引入依赖

目前推荐使用AndroidX Media3版本的ExoPlayer,在模块级build.gradle中添加如下依赖:

dependencies {
    // 核心ExoPlayer依赖
    implementation "androidx.media3:media3-exoplayer:1.2.0"
    // HLS格式支持依赖
    implementation "androidx.media3:media3-exoplayer-hls:1.2.0"
    // 可选:UI播放控件依赖
    implementation "androidx.media3:media3-ui:1.2.0"
}

2. 基础播放配置(无需自定义密钥逻辑)

如果你的m3u8文件中声明的KEY URI可以直接正常访问,不需要额外鉴权或自定义处理,直接按普通HLS流配置播放即可:

// 初始化播放器实例
val exoPlayer = ExoPlayer.Builder(context).build()
// 绑定到布局中的PlayerView控件
playerView.player = exoPlayer
// 构建媒体项,传入你的m3u8链接
val mediaItem = MediaItem.fromUri("你的加密m3u8链接地址")
exoPlayer.setMediaItem(mediaItem)
// 准备并启动播放
exoPlayer.prepare()
exoPlayer.play()

3. 自定义密钥请求配置

如果密钥请求需要添加自定义请求头(比如鉴权token、自定义UA等),可以通过自定义DataSource工厂实现:

// 构建带自定义请求头的数据源工厂
val dataSourceFactory = DefaultHttpDataSource.Factory()
    .setDefaultRequestHeaders(
        Headers.Builder()
            .add("Authorization", "你的接口鉴权参数")
            .add("User-Agent", "自定义请求UA")
            .build()
    )
// 构建HLS媒体源
val hlsMediaSource = HlsMediaSource.Factory(dataSourceFactory)
    .createMediaSource(MediaItem.fromUri("你的加密m3u8链接地址"))
// 给播放器设置媒体源
exoPlayer.setMediaSource(hlsMediaSource)
exoPlayer.prepare()
exoPlayer.play()

如果已经提前获取到了密钥字节和IV参数,不想让ExoPlayer主动请求密钥,可以自定义DataSource拦截.key后缀的请求,直接返回本地存储的密钥字节即可。

注意事项

  • 必须在AndroidManifest.xml中申请网络权限:<uses-permission android:name="android.permission.INTERNET" />
  • 你提供的m3u8示例已经包含了IV参数,ExoPlayer会自动读取解析,无需额外配置
  • 确保请求到的密钥为16字节长度,符合AES-128加密的规范要求
  • 如果播放报错,优先排查密钥URI是否可以正常访问、返回的密钥是否正确

内容的提问来源于stack exchange,提问作者Dương Nguyễn Văn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:12:00