如何在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
相关产品推荐
相关产品推荐

