媒体流式传输基础知识

Derek Herman
Derek Herman
Jaroslav Polakovič
Jaroslav Polakovič

在本文中,您将了解高级的媒体概念。 并且最终应该对 流式传输使用场景、协议和扩展程序。我们先从 解释了什么是流式传输。

媒体流式传输是一种通过 部分。而不是加载单个文件,如果不针对以下特征进行优化,加载速度可能会很慢 播放器会读取清单文件 拆分为多个单独的数据块。媒体块稍后会动态拼接 并且在运行时可能以不同的比特率重新组合在一起。在本课程中,您将学习 。

请注意,要在您的网站上提供流式传输 必须支持 Range HTTP 请求标头。详细了解Accept-Ranges <video>中的和 <source>标签一文。

流式传输用例

不生成媒体块和描述流的必要清单 虽然简单明了,但流式传输也带来了一些有趣的应用场景, 不可能仅通过指向 <video> 元素来实现 一组静态源文件。在本单元的稍后部分中 向网页添加媒体。首先,您需要了解 如果您想更进一步 将多个文件加载到 <video> 元素中。

  • 自适应流式传输是指媒体块以多个 比特率以及适合客户端设备的最高画质媒体块 将当前可用的带宽返回给媒体播放器。
  • 直播是指对媒体块进行编码并以 实时更新。
  • 注入媒体是指将广告等其他媒体注入到 而无需播放器更改媒体来源。

流式传输协议

网络上最常用的两种流式传输协议是动态协议 基于 HTTP 的自适应流式传输 (DASH) 和 HTTP Live Streaming (HLS)。 支持这些协议的播放器将提取生成的清单文件 确定要请求哪些媒体块,然后将它们合并到最终的 媒体体验。

使用 <video> 播放直播

许多浏览器都不会以原生方式播放您的视频流。虽然有一些 原生支持 HLS 播放,浏览器通常不支持原生 DASH 在线播放。这通常意味着,仅指向 <source> 是不够的 将 <video> 元素添加到清单文件中。

<video controls>
  <source src="manifest.mpd" type="application/dash+xml">
</video>

看似的不足之处实际上是伪装的实力。视频流 功能强大,使用音频流的应用则有着不同的需求。

清单文件通常描述单个媒体的多个变体。考虑不同 比特率、多个音轨,甚至是以不同格式编码的同一种媒体, 格式。

某些应用可能需要在缓冲区中保留大量视频, 还有一些人可能希望预取即将播放的 而一些人希望为自适应流式传输实现自己的逻辑。 你希望在该平台上拥有某种内置的浏览器功能 生成媒体流进行播放,恰巧有一个

媒体来源扩展程序

幸运的是,W3C 定义了名为媒体来源扩展 (MSE) 的工具 可让 JavaScript 生成媒体流简单地说,MSE 可以 开发者将 MediaSource 对象附加到 <video> 元素,并 它会回放所有接收的媒体数据 MediaSource 实例。

基本示例

const videoEl = document.querySelector('video');
const mediaSource = new MediaSource();

video.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener(
  'sourceopen',
  () => {
    const mimeString = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';
    const buffer = mediaSource.addSourceBuffer(mimeString);

    buffer.appendBuffer( /* Video data as `ArrayBuffer` object. */ )
  }
);

上面的简化示例说明了以下几点:

  • <video> 而言,它从网址接收媒体数据。
  • 生成的网址只是一个指向 MediaSource 实例的指针。
  • MediaSource 实例会创建一个或多个 SourceBuffer 实例。
  • 然后,我们只需将二进制媒体数据附加到缓冲区中,例如使用 fetch

尽管这些基本概念很简单,但还是可以编写一个 从零开始兼容 DASH 和 HLS 的视频播放器,大多数人通常会选择其中一种 一些成熟的开源解决方案,例如 Shaka PlayerJW PlayerVideo.js 等。

不过,我们创建了一个名为 Kino 的演示版 Media PWA, 或者尝试开发你自己的基本流媒体网站, 离线媒体播放。<video>有计划 纳入我们的路线图,以支持相关框架和数字版权管理, 功能。因此,请不时回来查看更新,或提出功能请求。 如需了解详情,请参阅支持离线流式传输的 PWA 文章。

媒体块格式

长期以来,DASH 和 HLS 都需要以不同的方式对媒体块进行编码 格式。但在 2016 年,此功能将支持标准的碎片化 MP4 (fMP4) 文件 向 HLS 添加了 HLS,DASH 也支持这种格式。

支持使用 fMP4 容器和 H.264 编解码器的视频块 同时支持这两种协议,并且可供绝大多数玩家玩。这样, 内容制作者只需对视频进行编码一次,从而节省了时间 和磁盘空间

为了获得更好的质量并减小文件大小,您可能需要选择 使用更高效的格式(如 VP9)对多组媒体块进行编码, 不过在继续讲解之前 准备适用于网络的媒体文件,接下来请做这方面的事。