如何检测Chrome中的JavaScript是否对HTML视频进行了DRM保护?

塔米尤斯·韩

快速背景:我正在编写一个浏览器扩展程序,用于在浏览器中播放视频时对其进行操作。该脚本本身应该具有通用性,并且可以在有视频的任何站点上运行。

我的视频操作依赖于能够处理视频中的像素数据。HTML5出血的方法是将视频像素转换为您可以在javascript中使用的东西,该canvas2dContext.drawImage()功能是将当前视频帧绘制到画布上并context.getImageData()获取所述数据。

当前代码归结为(我正在简化一些工作):


let video = document.findElementsByTagName('video')[0];
let canvas = document.createElement('canvas');
let context = canvas.getContext('2d');

handleVideoFrame() {
  context.drawImage(video, 0, 0, canvas.width, canvas.height);
  let data = context.getImageData(0,0,canvas.width, canvas.height);

  processData(data);
}

processData(data) {
  // a lot of heavy calculations going on here
}

window.requestAnimationFrame(handleVideoFrame);

问题:DRM

除非您尝试在Netflix,迪士尼+或相同口径的其他网站上进行此操作,否则此方法效果很好。这些站点使用DRM,并且如果该视频上有DRM,context.drawImage()将无法正常运行。请注意,我不希望捕获受DRM保护的视频的实际帧,但是我想知道DRM是否存在。

在Firefox中,这没什么大不了的,因为如果尝试调用context.drawImage()受DRM保护的视频,则会出现异常然后,您可以捕获该异常,不要运行processData()繁琐的操作,提醒用户您的脚本由于DRM而无法在该站点上工作,然后关闭整个过程。

另一方面,在Chrome浏览器(以及与此相关的其他Chromium换肤)中,它context.drawImage()不会失败。相反,context.drawImage()将绘制100%不透明的黑色正方形而不会引发异常,这是一个问题,因为:

  • 永远无法确定视频是否受DRM保护
  • 因此,您无法通知用户,谁会责怪您的脚本
  • 虽然您可以检查框架是否为黑色,并且避免呼叫沉重的框架processData(),但您仍在进行drawImage()不需要执行的呼叫

我尝试过的解决方案

  • context.getImageData()返回一个对象,该对象包含每个像素具有RGBA值的数组。最初,我希望可以通过查看alpha值来确定视频是否受到DRM保护。但是,由绘制的框架drawImage()总是¹完全不透明,这意味着这是一个死胡同。

¹除非尚未加载视频,否则它是透明的。

我希望避免的解决方案

  • 涉及到我的任何事情都基于以下事实:框架已经变黑了一段时间。当然,如果我检查过的所有帧都全黑了,我可以将视频播放n秒钟并发出警告。如果n太低,则冒着误报的风险。如果n太大,则视频播放和“ whoops DRM”警告之间的延迟可能太长。
  • 维护我知道利用DRM的已知站点的列表
海道

您可以简单地查看HTMLMediaElement的mediaKeys属性,如果已设置,则视频受DRM保护:

const isDRMProtected = (elem) => elem.mediaKeys instanceof MediaKeys;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否对JavaScript引擎尾部调用(TCO)进行了优化?

如何知道jtextarea中是否进行了任何更改?

如何修改并检查是否在Java 8中进行了修改?

内核是否进行了碎片整理

如何确定Swift是否使用优化进行了编译

在Elasticsearch中是否对数字:整数,长整数,浮点数等进行了分析?

是否对克隆语句进行了优化?

在Django中,登录后如何检测哪个auth后端对用户进行了身份验证?

如何知道服务人员是否在gatsby-plugin-offline中进行了更新

在Cordova应用中以全屏模式以纵向显示的HTML5视频在Android设备上进行了拉伸

jQuery检测更改输入,其中JS进行了更改

检测哪些脚本对DOM进行了更改

开玩笑-如何测试函数是否对参数进行了更改

检查客户是否对Woocommerce中的产品进行了评论

如何检查我的应用程序是否已针对Android进行了电池优化配置?

测试VBAProject是否通过来自personal.xlsb的宏进行了保护

如何确定给定的表是否对内存进行了优化?

无论是否进行了WordPress备份,如何每周发送邮件?

如何知道在处理单个记录时是否进行了“包含”调用?

如何确定卫星是否进行了机动?

Google Play应用内审核API。如何检查用户是否对该应用进行了评分?

如何检查电子邮件是否已在Firebase中使用参数进行了验证?

为什么<form action =“ index.html”>在Google Chrome中的<form action =“ about:blank”>上进行了更改?

如何检查rsync是否对bash进行了任何更改?

如何使用JavaScript检查是否对服务器进行了调用

如何检查用户是否在24小时滑轨之前进行了投票4

进行了错误编辑,如何返回?

如何知道Jenkins是否在CentOS 7上进行了修补

如何知道/ etc / shadow中的密码是否用SHA或MD进行了哈希处理?