查看 clearkey 耗时需要利用 javascript 运行时提供的性能 api,通过 performance.mark() 标记关键节点,并使用 performance.measure() 计算时间差。具体做法是在调用 mediakeys 初始化或密钥加载前后设置标记,随后生成测量对象并读取其持续时间。若未正确清除标记或测量,数据会累积导致结果偏大,因此需在分析结束后清理相关资源。

如何标记 ClearKey 初始化的起止点
在 navigator.requestMediaKeySystemAccess 返回的媒体密钥系统访问对象上创建 MediaKeys 实例并绑定到播放器时,是性能消耗的主要阶段。开发者应在 setMediaKeys 调用前标记开始,在 Promise 解析后标记结束。这样能准确捕获浏览器内部建立安全上下文和加载默认密钥库的耗时。

const startTime = 'CK_Init_Start';
const endTime = 'CK_Init_End';
performance.mark(startTime);
try {
const mediaKeys = await navigator.requestMediaKeySystemAccess('com.widevine.alpha', config);
const keys = await mediaKeys.createMediaKeys();
await player.setMediaKeys(keys);
performance.mark(endTime);
performance.measure('ClearKeyInitDuration', startTime, endTime);
const measure = performance.getEntriesByName('ClearKeyInitDuration')[0];
console.log(`初始化耗时: ${measure.duration}ms`);
// 清理标记和测量
performance.clearMarks(startTime);
performance.clearMarks(endTime);
performance.clearMeasures('ClearKeyInitDuration');
} catch (e) {
console.error('初始化失败', e);
}
如何监控密钥加载阶段的延迟
获取密钥后,向 MediaKeys 实例添加密钥会话或加载许可证通常涉及网络请求和解密准备。通过在 addKey 或 update 方法调用前后设置标记,可以隔离网络传输与浏览器处理密钥数据的耗时。这种方法能区分是网络慢还是浏览器解析密钥材料慢。

const keyLoadStart = 'CK_Key_Load_Start';
const keyLoadEnd = 'CK_Key_Load_End';
performance.mark(keyLoadStart);
// 模拟获取密钥数据
const keyData = await fetchLicenseFromServer();
// 假设 session 已创建
await session.addKey('aes-128-ctr', keyData, identity);
performance.mark(keyLoadEnd);
performance.measure('KeyLoadDuration', keyLoadStart, keyLoadEnd);
const keyMeasure = performance.getEntriesByName('KeyLoadDuration')[0];
console.log(`密钥加载耗时: ${keyMeasure.duration}ms`);
performance.clearMarks(keyLoadStart);
performance.clearMarks(keyLoadEnd);
performance.clearMeasures('KeyLoadDuration');
当 measure 返回值为零时说明什么
如果 performance.measure() 返回的 duration 为 0 或极小值,通常意味着起始标记和结束标记在同一个事件循环 tick 中执行,或者标记名称重复导致覆盖。在 ClearKey 场景中,这往往发生在同步代码块中误用了异步操作的结果,或者未等待 Promise 完成就标记了结束点。确保所有标记都对应真实的异步边界,且标记名称全局唯一,是获得有效耗时的前提。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











