DASH 几乎无处不在 (黑客项目)
Brightcove 每年都会有几次内部黑客周,工程师们可以在此期间自由选择项目进行。在最近一次黑客周(2014-07-14)中,汤姆·约翰逊决定尝试将现有的几个 DASH 播放器实现与 Video.js 结合,以尽可能多地支持 DASH。
MPEG-DASH (基于 HTTP 的动态自适应流媒体) 是一种流媒体格式,类似于苹果公司。的 HTTP Live Streaming (HLS)。它允许您提供不同比特率的多个视频版本,然后播放器可以根据用户。的带宽进行版本切换(这比您想象的要复杂)。
使用的两个 DASH 播放实现是 Dash.js 和 Dash.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 实现;作为回退方案,我们使用围绕 OSMF 和 Dash.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 要求
播放器
- 环境必须支持 媒体源扩展
- DASH 行业论坛 DASH.JS 库 (dash.js)
- Video.js Dash.js 技术 (videojs-tech-dashjs)
服务器/主机
- 开放 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 播放的回退方案。