我们在Chrome浏览器中使用加密事件来了解视频内容受DRM保护,当我们的播放器收到活动时,我们开始创建会话并从服务器请求DRM密钥。但Safari和IE浏览器不支持此事件。任何人都可以建议我们需要哪些事件来监听其他浏览器,例如Safari,因为它受DRM保护而知道视频已停止播放了吗?
答案 0 :(得分:1)
首先,值得一提的是,所有最新版本的主浏览器都支持加密媒体扩展(EME),以便现在播放加密的流媒体视频。如果您使用的是常见的第三方Javascript播放器,例如BitMovin或JWPlayer,然后跨浏览器播放加密内容应该“正常工作”。
EME是一种扩展机制,允许浏览器构建HTML5视频功能,以检测加密内容,请求密钥并使用密钥解密并安全地播放加密内容。
EME本身是一个API,用于定义应用程序,浏览器,媒体播放器和CDM(内容解密模型)之间的交互。它由W3.org指定,下面的图表形成了最新的规范,为流程提供了良好的感觉:
您可以看到浏览器在从CDN(而不是CDM ...)接收媒体时检测到媒体已加密。浏览器将创建一个“加密”事件并将其发送回您的应用程序(或注册为收听视频事件的任何内容)。
有两种方法,AFAIAW,可以看到加密事件 - 您可以注册这样的监听器(请参阅此示例 - https://www.html5rocks.com/en/tutorials/eme/basics/):
var video = document.querySelector('video');
video.addEventListener('encrypted', handleEncrypted, false);
或者您可以将其作为属性包含在内(请参阅上面链接的EME规范中的示例):
<video autoplay onencrypted='handleInitData(event)'></video>
但是,正如您所说,目前所有浏览器都不支持该活动 - 最新支持位于:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/onencrypted#Browser_compatibility
在这种支持的情况下,您可以做的一件事就是查看视频元数据本身,以确定视频是否已加密。
对于MPEG DASH碎片化的MP4视频,信息将位于以下一个或两个位置:
大多数受DASH保护的文件都有清单中的信息,应该很容易检查 - 它看起来像这样:
</AdaptationSet>
<AdaptationSet segmentAlignment="true" group="1" maxWidth="852" maxHeight="480" maxFrameRate="24" par="16:9" lang="und">
<ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="80399bf5-8a21-4014-8053-e27e748e98c0" />
<ContentProtection value="ClearKey1.0" schemeIdUri="urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e">
<clearkey:Laurl Lic_type="EME-1.0">https://drm-clearkey-testvectors.axtest.net/AcquireLicense</clearkey:Laurl>
</ContentProtection>
此示例使用clearKey,但从您的角度来看,重要的一点是清单中是否存在“ContentProtection”属性。
同样,如果您的视频正在使用HLS进行流式传输,则m3u8播放列表(与清单等效的HLS)将显示媒体已加密的指示,您可以检查该媒体。这是'EXT-X-KEY'标志:
#EXT-X-KEY:METHOD=AES-128,URI="http://AKeyServer/sceret.key"
视频播放器流式传输视频的方式是使用HTML5 Media Source Extensions机制(https://www.w3.org/TR/media-source/)。这允许您将视频源设置为本地对象而不是视频URL。玩家可以查看清单以获取他们想要播放的视频流的URL,然后通过分块下载该视频块,并将其附加到本地的'src'对象。浏览器视频播放器从该对象获取视频,就像它是常规视频文件源一样。
这里有一个非常广泛的共享示例,有助于演示方法:https://developers.google.com/web/updates/2011/11/Stream-video-using-the-MediaSource-API
所以Javascript播放器实际上只需要告诉Url清单文件本身 - 每个都有不同的方法来获取它,但你可以通过查看Github上的源代码来看看Shakaplayer是如何做到的({{3} })并搜索术语'manifestInput'(在撰写本文时正确) - 从这里您可以跟踪Shakaplayer如何接受此输入,解析清单文件然后播放视频流。