如何在dash.js等网页播放器中配置ExoPlayer适配的Widevine DRM许可证
问题背景
此前接到客户需求开发支持视频流播放的Android应用,客户提供的配置对象包含视频链接、DRM许可证地址等信息,格式如下:
"n": { "drm_license_url": "https://sp-supplier.supplier.com/?deviceId=SoMeALphaNUmericakStuFF=", "drm_scheme": "widevine", "icon": "https://blogger.googleusercontent.com/img/some-logo.png", "name": "ANY NAME", "uri": "https://supplier-supplier-sl.supplier.com/live/c6eds/VIDEO/SA_Live_dash_enc_2A/SOMEVIDEO.mpd" },
参考ExoPlayer官方文档完成Android端播放实现后,客户要求新增网页端同款视频播放能力。调研后计划选用dash.js实现DRM加密流播放,参考官方示例配置时发现需要构造protData对象传入DRM参数,示例结构如下:
var protData = { "com.widevine.alpha": { "serverURL": "https://drm-widevine-licensing.axtest.net/AcquireLicense", "httpRequestHeaders": { "X-AxDRM-Message": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ2ZXJzaW9uIjoxLCJjb21fa2V5X2lkIjoiYjMzNjRlYjUtNTFmNi00YWUzLThjOTgtMzNjZWQ1ZTMxYzc4IiwibWVzc2FnZSI6eyJ0eXBlIjoiZW50aXRsZW1lbnRfbWVzc2FnZSIsImZpcnN0X3BsYXlfZXhwaXJhdGlvbiI6NjAsInBsYXlyZWFkeSI6eyJyZWFsX3RpbWVfZXhwaXJhdGlvbiI6dHJ1ZX0sImtleXMiOlt7ImlkIjoiOWViNDA1MGQtZTQ0Yi00ODAyLTkzMmUtMjdkNzUwODNlMjY2IiwiZW5jcnlwdGVkX2tleSI6ImxLM09qSExZVzI0Y3Iya3RSNzRmbnc9PSJ9XX19.FAbIiPxX8BHi9RwfzD7Yn-wugU19ghrkBFKsaCPrZmU" }, priority: 0 } }
目前已知可将已有DRM许可证地址填入serverURL字段,但不清楚示例中X-AxDRM-Message请求头的取值规则,使用dash.js预构建测试播放器填入现有参数测试时,抛出如下错误:
DRM: licenser error! --com.widevine.alpha update, XHR error. status is "" (0), readyState is 4
待确认问题如下:
- 网页端播放同款加密视频,是否需要向DRM供应商索取额外配置信息?
- 仅凭现有配置信息,能否构造出符合要求的
protData对象? - 选用dash.js作为网页端播放库的方案是否可行,是否存在选型错误?
答复
关于是否需要向DRM供应商索要额外信息
必须要。示例里的X-AxDRM-Message是AxomDRM系统专属的鉴权请求头,不是Widevine DRM的通用强制字段。Android端ExoPlayer能正常播放,是因为其默认发起许可证请求时携带的参数、Widevine生成的挑战信息刚好匹配当前DRM服务的校验规则。
你遇到的XHR状态码0错误,优先查两个原因:一是DRM服务端没有给你的网页域名加CORS跨域白名单,二是网页端请求许可证缺少服务端要求的鉴权参数(自定义请求头、Cookie、URL签名参数都有可能)。这两类问题都需要联系DRM供应商或者内容提供方解决,没有办法自行绕过。关于现有信息能否构造合法protData
不能直接构造出可用的完整配置,但可以先试最小配置验证问题。不要硬套示例里的X-AxDRM-Message字段,那个是对应示例DRM服务的专属参数,你当前用的DRM服务不一定需要。先按如下最小配置测试:var protData = { "com.widevine.alpha": { "serverURL": "你拿到的drm_license_url", "httpRequestHeaders": {} } }如果最小配置能跑通,说明不需要额外鉴权头;如果还是报许可证错误,就必须等DRM供应商提供网页端专属的鉴权参数,这些参数是服务端生成的,没有办法自行计算或猜测。
关于dash.js选型是否正确
选型没有问题。dash.js是目前网页端对DASH+Widevine DRM支持最成熟的开源播放器之一,完全可以满足加密DASH流的播放需求,不需要更换库。如果后续需要兼容HLS加密流,可以补充使用hls.js,两者DRM配置逻辑基本一致。
额外提醒:Widevine在网页端仅支持Chrome、Edge、Firefox等Chromium/Gecko内核浏览器,Safari仅支持苹果自研的FairPlay DRM,如果客户要求兼容Safari,还需要单独向DRM供应商索要FairPlay对应的证书、许可证地址及相关配置参数。
内容的提问来源于stack exchange,提问作者Unknown.Code

