EME接口(w3c Encrypted Media Extensions)
参考文档:https://www.w3.org/TR/encrypted-media/
交流qq80101277
通常网页初始化时,会调用一堆requestMediaKeySystemAccess(),探测web能力:解码器(vp8,vp9,av1,h264,avc,hvc等),hdcp等;
然后为创建一个播放环境,示例:
const mediaKeySystemAccess = await window.Navigator.requestMediaKeySystemAccess("com.widevine.alpha", [{ initDataTypes: ["cenc"], audioCapabilities: [{contentType: "audio/mp4; codecs="mp4a.40.5""}], videoCapabilities: [{contentType: "video/mp4; codecs="avc1.4d400d""}], }]) => MediaKeySystemAccess instance { keySystem: "com.widevine.alpha", autoId: "MediaKeySystemAccess_4", }
指定一个keySystem ,上面是widevine,给一些解码器参数,返回一个工厂,类型:MediaKeySystemAccess
const mediaKeys = await mediaKeySystemAccess.createMediaKeys() // 调用cdm的CreateCdmInstance,InitializeCdmModule_4,Initialize等
const session = mediaKeys.createSession("temporary")
这个session应该是一个cdm实例(和cdm里面的update session不一样)
session.generateRequest (js调用这个接口把pssh发给底层cdm,里面是keyid,不需要返回数据)
向widevine server请求数据(http请求:根据pssh等,返回一个二进制数据,观察700字节左右protobuf格式)
session.update (参数:widevine server返回的数据,就是700字节左右的),返回cdm数据(protobuf格式)
如果有setServerCertificate会调用2次update