Exoplayer离线播放Widevine DRM内容报MediaDrmStateException问题咨询
ExoPlayer Widevine DRM离线播放问题解答
1. MediaDrmStateException错误产生原因
你遇到的错误堆栈指向底层MediaDrm.provideKeyResponse方法调用失败,属于Android DRM框架验证新返回的许可证密钥响应不通过触发的通用错误,具体原因和配置的DRM参数逻辑冲突有关:
- 配置的
license_duration_seconds(300秒,许可证本身有效期)远小于playback_duration_seconds(600秒,累计可播放时长)和rental_duration_seconds(900秒,租约总时长),首次获取的许可证到期后发起新的许可证请求时,没有正确携带原有离线许可证的会话标识,服务端返回的密钥响应和本地已存在的离线内容会话不兼容 - 部分场景下如果租约剩余时长不足,服务端返回的许可证参数和本地缓存的内容密钥ID匹配校验失败,也会触发该错误
2. playback_duration归零后的续期方案
可以通过续期许可证恢复播放,无需重新下载内容,具体实现方案如下:
- 初始化
DefaultDrmSessionManager时开启密钥续期开关:调用setKeyRenewalEnabled(true),同时绑定对应内容的OfflineLicenseHelper实例处理离线许可证操作 - 提前监听播放剩余时长,在
playback_duration_seconds_remaining剩余30秒左右主动触发续期请求,不要等时长归零后再处理,避免播放中断 - 续期请求必须携带当前内容对应的离线许可证密钥集ID,向DRM服务端申请同内容ID、同会话的playback_duration续期,请求类型指定为
KEY_TYPE_OFFLINE,不要使用在线播放的许可证请求类型 - 拿到有效许可证响应后,调用
OfflineLicenseHelper.updateLicense()覆盖本地存储的旧许可证,再重新初始化DrmSession即可恢复播放
3. rental_duration到期后的播放方案
无需重新下载内容文件,仅获取新的许可证即可恢复播放。
Widevine DRM体系中加密媒体文件和许可证是完全分离存储的,媒体文件仅和内容对应的密钥ID绑定,和许可证的有效期参数无关。rental_duration仅为许可证的属性,到期后只需向DRM服务端申请同内容ID的新离线许可证,写入本地DRM存储后即可直接播放原有缓存内容。
内容的提问来源于stack exchange,提问作者user_1989
相关产品推荐
相关产品推荐

