关于EME一致性测试WidevineH264MultiMediaKeySession的密钥计数问题问询
我之前帮团队排查过类似的EME合规测试卡点,结合你使用的Cobalt RC 11.119147和Widevine CDM 3.2.1版本,逐个解答你的疑问:
1. 该版本是否支持多密钥会话?
Widevine CDM 3.2.1完全支持多密钥会话,同时Cobalt RC 11.x系列也适配了这个能力。不过需要注意两个关键点:
- 创建
MediaKeySession时,要指定正确的sessionType(测试通常要求temporary,部分场景可能用persistent-license); - 确认Cobalt的编译配置中开启了多密钥会话支持,即
ENABLE_EME_MULTI_KEY_SESSIONS参数设置为true,如果这个开关没开,会限制单会话的密钥数量。
2. 有没有处理该测试的Widevine CDM示例?
Widevine官方提供的CDM测试套件里有专门的多密钥会话示例,核心逻辑是:在单个MediaKeySession内发起多次generateKeyRequest调用(对应多个密钥),然后对每个请求返回的许可执行addKey操作。针对你这个测试,需要每个会话执行16次密钥请求+添加操作,8个会话就能凑够128次onKeyStatusesChange触发(对应测试要求的keyCount=128)。
另外,你可以参考Widevine CDM的MultiKeySessionTest用例,里面完整实现了多会话多密钥的流程,包括会话创建、密钥请求、许可处理和状态监听。
3. 为何需要8次Init加8次GenerateRequest而非1次Init加8次GenerateRequest?
这里的“Init”应该是指创建MediaKeySession的初始化操作——这个测试的核心是验证多个独立MediaKeySession的并发处理能力,要求每个会话承载16个密钥,8个会话刚好是128个密钥总数。如果只用1个会话,即使执行8次generateKeyRequest,也只能覆盖8个密钥,远远达不到测试要求的数量。
另外,合规测试的场景是模拟实际业务中多内容流并发解密的情况,所以必须创建多个独立的会话来完成测试。
4. Init是否需要清理内容?
是的,每次创建新的MediaKeySession(即你说的Init)之前,必须彻底清理前一个会话:
- 调用
MediaKeySession.close()关闭会话; - 监听会话的
closed事件,确认会话资源已释放后,再创建新的会话。
如果不清理,会导致CDM资源泄漏,甚至新会话无法正确注册密钥,进而影响keyCount的统计(比如部分onKeyStatusesChange事件无法触发)。Cobalt的EME实现对未清理的会话会有资源限制,可能导致后续会话创建失败。
5. 是否需要8个CDM实例各对应一个会话?
不需要。Widevine CDM 3.2.1支持在单个CDM实例下创建多个MediaKeySession:
- 先通过
navigator.requestMediaKeySystemAccess获取MediaKeySystemAccess; - 调用
createMediaKeys()创建一个MediaKeys实例(即单个CDM实例); - 基于这个
MediaKeys实例创建8个独立的MediaKeySession即可。
这种方式既节省系统资源,也完全符合测试对多会话的要求。
额外排查建议
- 检查每个
generateKeyRequest返回的许可是否正确,调用addKey时有没有处理错误; - 查看Cobalt的日志,确认是否有密钥添加失败的错误(比如许可格式不兼容、CDM返回错误状态码);
- 确认
onKeyStatusesChange事件监听逻辑没有遗漏,确保每次addKey成功后都能触发该事件并正确累加keyCount。
内容的提问来源于stack exchange,提问作者Jackie Sun

