Video.js 博客

史蒂夫·赫弗南2014-07-22

DASH 几乎无处不在 (黑客项目)

Brightcove 每年都会有几次内部黑客周,工程师们可以在此期间自由选择项目进行在最近一次黑客周(2014-07-14)中,汤姆·约翰逊决定尝试将现有的几个 DASH 播放器实现与 Video.js 结合,以尽可能多地支持 DASH。

MPEG-DASH (基于 HTTP 的动态自适应流媒体) 是一种流媒体格式,类似于苹果公司HTTP Live Streaming (HLS)。它允许您提供不同比特率的多个视频版本,然后播放器可以根据用户的带宽进行版本切换(这比您想象的要复杂)。

使用的两个 DASH 播放实现是 Dash.jsDash.as。它们通过 Video.js的播放技术架构结合起来,这意味着您可以包含 插件 和自定义皮肤,并且它们将与两种播放方法兼容。

查看结果。

浏览器/设备覆盖范围

结合使用 DASH.AS 和 DASH.JS 将为我们提供以下浏览器/设备覆盖范围

DASH.JS (媒体源扩展支持)

  • Internet Explorer:11+
  • Chrome:23+
  • FireFox:25+ (即将推出的版本)
  • Safari (桌面版):8+ (OSX Yosemite - 2014 年秋季)
  • iOS:不支持
  • Android:4.2+ (Chrome)

DASH.AS

回退到任何支持 Flash Player 10.3 的环境

iOS

如您所见,唯一剩下的阻碍是 iOS,目前还没有关于何时或是否会发生的消息。在 Safari 8 中看到媒体源扩展支持带来了一些希望,但我的理解是,将支持内置到 iOS 中的要求要重要得多。我猜它最终会实现,但还需要一段时间(希望届时能同时支持内联播放 + 全屏 API)。

如今,为了在任何地方提供自适应流媒体,您仍然需要 DASH + HLS,或者只使用 HLS(您可以使用 video.js HLS 插件 在更多浏览器中支持 HLS)。

汤姆的笔记

演示显示,对于支持 媒体源扩展 (MSE) 的环境,我们通过 Dash.js 使用完整的 JavaScript 实现;作为回退方案,我们使用围绕 OSMFDash.as(由 Castlabs 提供的开源插件)构建的 Flash。

汤姆一直在业余时间开发 videojs-osmf,这使得这一切成为可能。

DASH.AS 要求

播放器

  • 环境必须支持 Flash Player 10.3+
  • Video.js OSMF 技术 (videojs-osmf)
  • CastLabs 适用于 OSMF 的 Dash.AS 插件 (dash.as)

服务器/主机

  • 由于请求是从 Flash 内部发出的,因此需要 crossdomain.xml 文件。*通过查询字符串提供字节范围请求(myFile.mp4?range=0-1000 || myFile.m4s?bytes=0-1000)是必要的,因为 Flash Player 限制使用“Range”请求头。Castlabs 有一个使用 mod_rewrite 实现此功能的 .htaccess 文件。Akamai 边缘服务器也接受 bytes 查询字符串变量。

备注

  • 我们可能需要修改的一点是,将工作负载中的请求/响应部分放到 Flash Player 之外处理,类似于 Video.js HLS 解决方案。这将消除对 crossdomain.xml 文件的需求,因为在以 DASH 为中心的环境中通常不期望其存在。
  • Akamai edgesuite 似乎是上述规则的一个例外,因为这些域实际上因其作为 Akamai HD 下的服务平台而拥有跨域文件。Akamai 参数语法是 ‘myFile.m4s?bytes=XXXX-YYYY’。
  • 目前,Dash.AS 的 manifest 解析器非常严格。我们可能需要考虑在 AS 侧实现一个版本的 DASH.JS manifest 解析,因为它在结构识别方面要灵活得多。
  • 更深入的类检查显示,Dash.AS 插件是基于使用 Netstream 的数据生成模式,类似于我们的 HLS 解决方案。可能存在更好的方法来在两者之间共享代码库以减少代码重复。

DASH.JS 要求

播放器

服务器/主机

  • 开放 CORS 头:Access-Control-Allow-Origin*
  • 接受使用 Range 请求头:Access-Control-Allow-Headers:Range, Options

备注

  • 与 Dash.AS 解决方案相比,Dash.js MPD 解析功能显著更强大。
  • 大多数测试的流都是基于 Akamai 的,我们将来应该尝试更多本地和非 Akamai 托管的选项。*在我的测试中,我确实看到了一个 Youtube DASH/MSE 示例,并且这些流也被证实可以在 Dash.JS 中工作。
  • Dash.JS 流媒体生命周期和分段加载生命周期往往是直接耦合的,并且不一定在预期时间触发元素媒体事件。例如,持续时间。虽然在清单加载周期的解析完成阶段就已知,但在收到第一个分段之前不会报告给播放器。

技术兼容性

这些独立的技术协同工作良好。需要对 Dash.AS 库进行一些修改,以确保它只检查符合以下条件的资源:1.具有 URL 且 2.URL 包含“mpd”或“m4s”文件扩展名,用于 DASH 清单/分段。

注意: Dash.JS 技术应在 OSMF 技术之前加载到 DOM 中,以确保 OSMF 技术是 DASH 播放的回退方案。