咨询Safari与IE浏览器中DRM内容的Encrypted事件替代监听事件
针对Safari/IE浏览器识别DRM保护导致播放停止的事件监听方案
嘿,这个跨浏览器DRM事件的问题我之前踩过不少坑!Chrome这类基于Chromium的浏览器用encrypted事件没问题,但Safari和IE确实有自己的一套事件体系,下面分情况给你讲清楚:
Safari(含macOS/iOS)
Safari采用FairPlay DRM,它没有实现标准的encrypted事件,取而代之的是**webkitneedkey事件**——当播放器检测到受DRM保护的内容、需要创建密钥会话时,就会触发这个事件,这和Chrome里encrypted的触发时机基本一致。
如果DRM密钥请求失败或者验证不通过,还可以监听**webkitkeyerror事件**,这个事件会明确告诉你DRM相关的错误,能直接关联到播放停止的原因。
给你个简单的代码示例:
const video = document.getElementById('your-video-element'); // 监听DRM密钥需求事件 video.addEventListener('webkitneedkey', (event) => { console.log('Safari检测到DRM保护内容,需要请求密钥'); // 这里启动FairPlay会话创建、密钥请求逻辑 }); // 监听DRM错误事件 video.addEventListener('webkitkeyerror', (event) => { console.error('Safari DRM密钥处理失败,播放停止'); // 处理DRM错误导致的播放停止 });
IE浏览器
IE(主要是IE11及支持PlayReady的版本)使用PlayReady DRM,对应的事件是**msneedkey**——触发时机和Chrome的encrypted、Safari的webkitneedkey一致,都是在识别到DRM内容需要密钥时触发。
同样,DRM错误可以监听**mskeyerror事件**来捕获,以此判断播放停止是否由DRM问题导致。
代码示例:
const video = document.getElementById('your-video-element'); video.addEventListener('msneedkey', (event) => { console.log('IE检测到DRM保护内容,需要请求密钥'); // 启动PlayReady会话创建、密钥请求逻辑 }); video.addEventListener('mskeyerror', (event) => { console.error('IE DRM密钥处理失败,播放停止'); // 处理DRM错误 });
额外提示
除了上述DRM专属事件,你还可以结合视频元素的error事件做兜底判断:当播放停止时,检查video.error的详细信息,比如Safari中MediaError的code和message,或者IE中对应的错误码,来进一步确认是不是DRM相关的问题(比如密钥无效、不支持的DRM方案等)。
内容的提问来源于stack exchange,提问作者kadina




