HTML5播放器不支持chrome

时间:2017-08-15 07:29:34

标签: html5-video playready

我是Stackoverflow的新手,这将是我的第一个问题。我的HTML5播放器在Internet Explorer上运行正常但不适用于Google Chrome。我正在使用一个用CENC加密的PlayReady流。我怎样才能让这个工作在chrome上?我无法访问服务器,它们由第三方运营。

由于

1 个答案:

答案 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;

可悲的是,我只能分享点点滴滴,但这大致是你应该做的才能让它发挥作用。