所有这些缩写是什么意思? 开发开源播放器以观看来自Amazon,Sky和其他平台的视频并观看来自任何提供商的视频需要什么? 塞巴斯蒂安·戈拉施(Sebastian Golasch)在HolyJS 2018 Piter会议上讨论了视频流处理的过程。 根据剪辑-他的报告的视频和翻译。
Sebastian Golasch目前是Deutsche Telekom的开发人员。 他长期从事Java和PHP的工作,然后切换到JS,Python和Rust。 在过去的七年中,他一直在研究Qivicon智能家居的专有平台。关于流视频的历史
首先,让我们看一下网络的历史,因为我们在25年中从QuickTime转到Netflix。 这一切始于90年代,当时苹果公司发明了QuickTime。 它在Internet上的使用始于1993年至1994年。 那时,播放器可以播放分辨率为156×116像素,频率为10 FPS的视频,而无需硬件加速(仅使用处理器资源)。 这种格式的重点是9600波特拨号连接-9600 bps,包括开销信息。
那是Netscape浏览器的时代。 浏览器中的视频看起来不太好,因为它不是Web原生的。 为了进行播放,我们使用了具有自己界面的外部软件(与QuickTime相同),并在浏览器中使用embed标签将其可视化。

当Macromedia发布Shockwave Player时,情况有所好转(在Adobe接管Macromedia之后,它被称为Adobe Flash Player)。 Shockwave Player的第一版于1997年发布,但视频播放仅在2002年出现。
他们使用了Sorenson Spark又名H.263编解码器。 它已针对小分辨率和小文件进行了优化。 这是什么意思? 例如,用于测试Shockwave Player的43秒视频仅重560 KB。 当然,以这种质量观看电影不是很令人愉快,但是那个时候技术本身很有趣。 但是,就像QuickTime一样,要使Shockwave Player在浏览器中运行,还需要其他软件。 该播放器存在很多安全问题,但最重要的是该视频仍是浏览器的附件。
2007年,微软发布了Silverlight,有点让人联想到Flash。 我们不会深入研究,但是所有这些解决方案都有一个共同点-黑匣子。 所有播放器都充当浏览器加载项,而您不知道内部发生了什么。

< Video/
>元素
Opera在2007年提出使用<
Video/
>标记,即在浏览器中制作本机视频。 我们今天使用它。 它既简单又方便,任何视频都不仅可以观看,还可以下载。 而且,即使我们不想允许视频下载,也不能禁止将其下载到浏览器。 最大的是使视频下载更加困难。

<Video/>
与黑盒正好相反,查看源代码非常简单。

数字版权管理
但是,您不能右键单击Netflix上的视频并选择“另存为”。 其原因是DRM(数字限制管理)。 这不是执行任何任务的单一技术或单一应用程序。 这是诸如以下概念的通用术语:
- 身份验证和用户加密
- 基于内容的加密
- 权利的定义和限制的适用
- 反馈和更新
- 输出控制和链接保护
- 入侵者的检查和跟踪
- 密钥和许可证管理
要了解什么是DRM,我们需要研究其生态系统,即找出涉及哪些公司。 这是:
- 内容所有者位于生态系统的顶端。 例如,迪士尼,米高梅或FIFA。 这些公司生产内容,并且对其拥有权利。
- DRM Core是提供DRM技术的公司(例如Google,Apple,Microsoft等),目前,大约有7-8种来自不同公司的DRM技术。
- 服务提供商 -开发加密视频的服务器软件。
- 实际上是播放器的浏览器 。
- 内容提供商是Netflix,Amazon,Sky等公司。通常,他们不拥有内容的权利,而是许可和分发内容。
- 芯片/设备供应商也参与了该生态系统,因为DRM不仅是软件技术。 一些公司(主要是中国公司)正在开发对视频进行编码和解码的芯片。
您是否曾经想过,为什么在浏览器中的Netflix上观看视频时,它没有很高的分辨率(SD),但是如果您在Apple TV或Android TV Box上观看同一视频,则以全高清或全高清方式播放相同的内容4K? DRM也对此负责。 事实是,制造商总是害怕盗窃内容。 因此,执行视频解码的环境的安全性越差,向用户显示的质量越差。 例如,如果以编程方式(例如,在Chrome或Firefox中)执行解码,则视频显示的画质最差。 在使用用于解码的硬件功能的环境中(例如,如果Android使用GPU),非法复制内容的可能性会更少,并且此处的播放质量会更高。 最后,最安全的环境是完全硬件(Apple TV或Android TV Box),在其中进行解码和播放时无需使用软件。

但是,如果我们谈论浏览器,则几乎总是通过软件来执行浏览器中的解码。 不同的浏览器对DRM使用不同的系统。 Chrome和Firefox使用Widevine。 该公司归Google所有,并许可其DRM应用程序。 因此,为了进行解码,Firefox从Google下载了DRM库。 在浏览器中,您可以看到下载的来源。

苹果使用自己的FairPlay系统,该系统是在公司推出首款iPhone和iPad时创建的。 微软还使用自己的称为PlayReady的开发,该开发直接内置在Windows中。 在其他情况下,最常使用Widevine。 该系统既可以作为应用程序也可以作为硬件解决方案-解码视频的芯片而存在。
Cdm
缩写CDM代表内容解密模块。 这是一些可以通过多种方式工作的软件或硬件:
- 解密视频,然后使用<Video />标签将其呈现在浏览器中。
- 解密和解码视频,然后将视频的原始帧传输到浏览器。
- 解密和解码视频,然后传输视频的原始帧以使用GPU进行回放。
尽管有GPU的支持,第二个选项还是最常用的(至少在Chrome和Firefox上)。
浏览器中的解码层
那么,它们如何一起工作? 要了解这一点,请查看浏览器中的解码和解密层。 它们分为:
- JavaScript应用程序-它告诉计算机我要观看的视频。
- 浏览器是播放视频内容的播放器。
- 内容解密模块。
- 数字版权管理全都与视频解码有关(我无法提出更好的表示法,因此我将其称为)。
- 受信任的运行时。
- 在这种情况下,前两个组件是DRM播放器,内容解密模块是DRM客户端,后两个组件是DRM核心。

下图显示了在浏览器中播放视频时发生的情况。 当然,她有点困惑:箭头和颜色很多。 我将通过实际案例逐步阐明它,以使其更清晰

我们将以Netflix为例。 我写了一个调试应用程序。
我从每个人的起点开始:当我开始播放视频时,我看着Netflix提出的要求,并且看到了大量的唱片。

但是,如果只留下播放视频所需的内容,那么事实证明它们只有三个:清单,许可证和视频的第一个片段。

Netflix播放器是用JavaScript编写的,包含超过76,000行代码,当然,我无法完全解析它。 但是,我想展示播放受保护的视频所需的主要部分。
我们将从模板开始:

电磁脉冲
但是在深入研究功能之前,我们需要熟悉另一种技术-EME(加密媒体扩展名,加密媒体扩展名)。 该技术不执行解密和解码,它只是一个浏览器API。 EME充当CDM,KeySystem,具有许可证的服务器以及存储内容的服务器的接口。
因此,让我们开始使用getKeySystemConfig。

应该记住的是,它取决于提供程序,因此我在此处介绍的配置适用于Netflix,但不适用于Amazon。
在此配置中,我们必须告诉后端系统我们可以提供什么级别的受信任运行时。 这可以是安全的硬件解码或安全的软件解码。 也就是说,我们告诉系统将使用哪些硬件和软件进行播放。 这将决定内容的质量。

配置完配置后,请看创建一个初始的MediaKeySystem。

这是与内容解密模块进行交互的地方。 您必须告诉API我们使用哪个DRM系统和KeySystem。 在我们的案例中,这是Widevine。

下一步对于所有系统都是可选的,但对于Netflix是必需的。 同样,其必要性取决于提供者。 我们需要将服务器证书应用于我们的mediaKeys。 服务器证书是Netflix Cadmium.js文件中的纯文本,可以轻松复制。 而且,当我们将其应用于mediaKeys时,由于使用了此证书,因此具有许可证的服务器与我们的浏览器之间的所有通信都变得安全。

完成此操作后,我们必须转到视频的原始元素,然后说:“好吧,这是我们要使用的关键系统,这是hello video标签。 让我们团结你。”

这是配置视频系统所需的最后一个功能。

这是DRM会话或MediaKeySession。 这只是从提供者到解密模块的数据,该数据与它们签署请求。 这些数据也是纯文本,隐藏在Netflix播放器文件中多个功能的后面,是我复制数据的地方。

当我们在mediaKeys对象上调用create.Session时,我们需要告诉我们我们支持哪个视频。 在这种情况下,它是mp4。 这使我们回到了CDM系统的消息传递上下文。 我们还需要Netflix以每种形式应用base64服务器证书,但是将根据DRM系统再次提供创建会话中的所有此配置。

下面的最后一个函数-keySession.generateRequest在后台构建许可证请求。 或者CDM在后台建立许可证请求。 换句话说,这是原始二进制数据,为了获得有效许可证,我们必须将其发送到许可服务器。

这里cenc很有趣。 这是一个ISO加密标准,定义了mp4视频的安全方案。 在WebM中,这称为不同名称,但功能执行相同。
handleMessage是我们配置的EventListener接口。 当keySession中的message事件引发此事件时,我们知道我们已准备好从服务器获取许可证。

在此回调中,我们仅向具有提供一些二进制数据的许可证的服务器发送请求(根据提供程序的不同,它们可能也会有所不同)。 我们使用此数据通过添加许可证来更新当前会话。 也就是说,一旦我们从服务器收到有效的许可证,我们的CDM就会知道我们可以解码和解密视频。

如果将其应用于下图,我们将得到:我们要播放视频,JavaScript应用程序会说:“您好,浏览器! 我要播放视频!” -然后使用“加密的媒体扩展名”,并向Widevine CDM中的“许可证功能”请求许可证。 然后,此请求将返回给浏览器,我们可以将其交换为许可证服务器上的有效许可证,然后我们需要将此许可证传输回CDM。 上面的代码中显示了此过程。

但是请注意,我们还没有丢失一秒钟的视频,我们都需要这样做,以便将来能够播放一些视频。
微软
我们需要研究的另一项技术是MSE(媒体源扩展)。 她可以称为EME(加密媒体扩展名)的同父异母姐妹。 这也是浏览器API,与DRM无关。 我将其视为<
Video/
> Src的编程接口。 使用它,您可以使用JavaScript创建二进制流,并将视频片段应用于<
Video/
>元素。 因此,由于它,<
Video/
>标签的源变得动态了。
因此,我们可以将扩展名用于多媒体源,实例化并访问视频,然后分批下载视频片段并将其应用于<
Video/
>标签。

关键是,当您观看两个小时的视频时,您不想等到完全加载完毕。 取而代之的是,将其切成小块,大小从30秒到2分钟不等,然后一次将它们应用于<
Video/
>元素。
一旦我们的MediaSource缓冲区准备好并链接到<
Video/
>元素,我们就可以添加SourceBuffer。 我们必须再次告诉他我们使用哪种视频格式和编解码器,然后将其创建。

最后,我们现在可以从单个片段中获取数据,并使用append方法将其发送到<Video />元素到SourceBuffer上,以接收动态创建的视频。 它也可以用于其他用例,使人们可以独立组合视频的不同元素,创建自己的视频,但我不想对其进行深入研究。

因此,这几乎是我们必须采取的最后一步。 您有一个分发网络,有片段,然后浏览器将加密和压缩的片段发送到CDM,在CDM中执行解密和解码。 然后,将解密和未压缩的片段发送回浏览器,在其中进行可视化和显示。

清单
但是还有一点。 我们如何知道需要下载哪些片段,从哪里下载它们以及何时下载? 这是最后一部分,清单中缺少的请求。 当我们查询Netflix的清单时,它需要大量数据。 如果我们只想播放视频,则对我们而言,我们要使用哪个DRM系统,要观看的视频(Netflix ID,可以从URL复制)和配置文件至关重要。 设定档决定了我们以哪种分辨率接收视频,以及以何种语言接收音轨,格式(立体声,杜比数字等),是否使用字幕等。

MPEG-DASH
最常用的清单格式是MPEG-DASH。 的确,Apple使用另一种格式-HSL,其外观类似于旧Winamp播放器中的文件列表。 但是Widevine和Microsoft完全使用MPEG-DASH。 它基于XML,并且定义了所有内容:持续时间,缓冲区大小,内容类型,何时加载哪些片段,用于不同分辨率的片段以及自适应比特率切换。 后者意味着,例如,如果用户观看视频,同时下载速度下降,则播放不会停止,而视频质量只会下降。 这是由于清单为不同的分辨率定义了相同的部分,它们具有相同的持续时间和相同的索引。 因此,如果下载速度降低,则浏览器可以简单地切换到具有较低分辨率的流,而无需暂停下载并且无需缓冲数据。
这就是《银河护卫队》的宣言。 从中我们可以看到,以不同的下载速度,人们将收到质量不同的视频,以及为听障人士提供音轨的事实。 它还会拼出字幕。

我们有一个持续时间和开始播放的时间指示。 例如,当您中断观看然后从上次中断的地方再次返回视频时,将使用此功能。

再有就是鲁棒性,它说:只有当您的系统满足要求时,此片段才会丢失。 在这种情况下,它是硬件解码-硬件安全编解码器。

对于视频的同一部分,您可以确定任意数量的具有不同分辨率的片段。

然后,您将获得URL以加载片段,并且range参数以毫秒为单位显示值的范围。

这是最后一部分。 有时您还会从CDN获得清单。 一些提供程序具有用于片段传送的单独服务器,但是大多数情况下,它们与清单功能来自同一台计算机。 下载清单后,我们知道需要下载哪些片段,我们可以发送片段请求,然后从CDM解密和解码。

一般来说,仅此而已。 上面所说的一切足以开发一个开源播放器,以观看来自Amazon,Sky和其他平台的视频以及观看来自几乎所有提供商的视频。
Msl
Netflix认为值得在浏览器和服务器之间添加额外的消息加密。 他们称其为“消息安全层”,“消息安全层”或MSL。 它对视频没有任何直接作用,只是加密的额外一层。 实施MSL的原因之一是HTTPS不够安全。 另一方面,
MSL是开源的,因此您始终可以看到它是如何工作的。 在这里,我将不涉及这个主题,如果您有兴趣,可以随时在他们的博客中找到有关Netflix为什么要进行MSL的信息。 GitHub上有关于其实现和可用Java实现的详细文档。
我们还有一个与朋友一起编写的
Python实现 。 据我所知,这是Netflix唯一可用的开源客户端。 他在Kodi Media Center工作。 为了可视化,您可以使用VLC Player或任何其他合适的软件。
再说一次“黑匣子”
因此,您了解了实现所有这些所需的条件,以及我提到CDM的频率,CDM是从Google下载的“黑匣子”。 因此,我们再次将视频返回到“黑匣子”。 美丽的<Video />元素再次对我们隐藏了。 我们添加了对我们有帮助的第三方软件,但是同时关闭了该第三方软件并且我们无法对其进行管理。 它可以做很多不起眼的事情:跟踪,分析,发送数据...

以下是Tim Berners Lee所说的话:
“总的来说,将EME保持为相对安全的在线环境非常重要,您可以在其中观看电影,也可以在最方便的环境中观看电影,并使其成为人类相互联系的一部分。”但是对此还有其他意见。 特别是来自电子前沿基金会,该基金会在DRM出现之前是W3C的成员。 他们说的是:
“在2013年,EFF失望地得知W3C接管了EME的标准化项目-加密媒体扩展。 实际上,我们正在谈论的API的唯一功能是为DRM提供在浏览器生态系统中的主导作用。 我们将继续努力确保互联网自由开放。 “我们将继续起诉美国政府废除使DRM如此具有毒性的法律,我们将继续在全球法律层面上进行斗争。”我很难说出如何与之联系。 , , , . , Netflix, . , , .
, 24-25 , HolyJS 2018 Moscow , «The Universal Serial Web» : WebUSB, USB- . -, .
PS 1- . , — 50% .