我是Stackoverflow的新手,这将是我的第一个问题。我的HTML5播放器在Internet Explorer上运行正常但不适用于Google Chrome。我正在使用一个用CENC加密的PlayReady流。我怎样才能让这个工作在chrome上?我无法访问服务器,它们由第三方运营。
由于
答案 0 :(得分:3)
从技术上讲,你可以支持Widevine,而你的流媒体是PlayReady。这是可能的,因为您使用CENC。由于您无法访问您提到的服务器,因此可以使用名为PSSH Forging的技术。它基本上取代了碎片,让Chrome认为它是Widevine,因为它的CDC将解密视频,流将播放。
为了方便起见,我假设您使用DASH。
我们这里有一个PSSH盒子:
const widevinePSSH = '0000005c7073736800000000edef8ba979d64acea3c827dcd51d21ed0000003c080112101c773709e5ab359cbed9512bc27755fa1a087573702d63656e63221848486333436557724e5a792b32564572776e64562b673d3d2a003200';
您需要将1c773709e5ab359cbed9512bc27755fa
替换为您的KID。
然后在您在SourceBuffer(appendSegment之前)中插入&r;段的部分,您可以执行以下操作:
let segment = args[0];
segment = new Uint8Array(segment);
const newPssh = widevinePSSH.replace('1c773709e5ab359cbed9512bc27755fa', psshKid);
const subArray = new Uint8Array(DRMUtils.stringToArrayBuffer('70737368'));
let index = 0;
const found = subArray.every((item) => {
const masterIndex = segment.indexOf(item, index);
if (~masterIndex) {
index = masterIndex;
return true;
}
});
if (found) {
return originalSourceBufferAppendBuffer.apply(this, [].slice.call(args));
}
segment = DRMUtils.uInt8ArrayToHex(segment);
// Inject the forged signal
// 70737368 = pssh
segment = segment.substr(0, segment.lastIndexOf('70737368') - 8) + newPssh + segment.substr(segment.lastIndexOf('70737368') - 8);
// Fix the MOOV atom length
// 6d6f6f76 = moov
const header = segment.substr(0, segment.indexOf('6d6f6f76') - 8);
const payload = segment.substr(segment.indexOf('6d6f6f76') - 8);
const newLength = Math.floor(payload.length / 2);
segment = header + DRMUtils.intToHex(newLength, 8) + payload.substr(8);
segment = decode(segment).b;
可悲的是,我只能分享点点滴滴,但这大致是你应该做的才能让它发挥作用。