Video.js 博客

Gary Katsevman2019-01-11

Video.js 7.4

现在是时候对 Video.js 7.4 进行概述了,它于 12 月初首次发布。此版本的一大新功能是允许您在直播流中进行拖动的用户界面。我们更新了 focus-visible 以与我们的菜单配合使用,增加了更多翻译,在播放/暂停按钮中添加了重播选项,以及许多许多修复,其中多项与辅助功能相关。

我们还在构建过程中放弃了对 Grunt 的使用。我们非常感谢 Grunt,它为我们提供了很好的服务,但现在是时候继续前进了。

Video.js 7.4.1 是目前的最新版本,7.4.2 作为预发布版本将在下周发布。

致谢

在继续之前,我要感谢所有参与者,我们非常感谢您的贡献!总共有 14 位首次贡献者,我认为这对我们来说是一个历史新高,我希望这能继续下去!

直播用户界面

Video.js 已经支持直播流一段时间了,无论是原生支持,还是通过 videojs-http-streaming (VHS)。然而,这个用户界面非常简单,它禁用了进度条,并且基本上只允许暂停,尽管有一个指示器表明这是一个直播流。

Video.js, with the new Live UI, playing a live stream
Video.js,使用新的直播用户界面,播放直播流

新的用户界面与之前的直播用户界面和常规控制栏非常相似。“直播”指示器会移动到进度条的右侧,并指示我们是在实时播放还是落后于直播。点击此按钮将跳转到“直播点”。时间显示和工具提示将显示相对于直播点的时间;因此,直播点的当前时间将为 0,如果您回退 30 秒,它将显示 -00:30

此功能仍处于实验阶段,因此,它默认是关闭的。我们希望您能尝试一下并给我们反馈,以便我们可以在未来的版本中默认启用它。

要启用此功能,请在播放器中传入 liveui: true:在 JavaScript 中

var player = videojs('my-id', {
  liveui: true
  }
);

或 HTML

<video-js id="my-id" data-setup='{"liveui": true}'}>
  <source src="https://example.com/live.m3u8" type="application/x-mpegurl">
</video-js>

语言

在 7.4 版本系列中,我们添加并更新了许多语言。此外,我们现在将 JSON 文件复制到 dist/lang 文件夹中,以便您更轻松地将其包含在项目中。

已添加和更新的语言

  • 奥克语 (oc)
  • 俄语 (ru)
  • 威尔士语/康瓦尔语 (cy)
  • 乌克兰语 (uk)
  • 塞尔维亚语 (sr)
  • 瑞典语 (sv)

辅助功能

一如既往,我们的目标是让 Video.js 尽可能地易于访问和使用。为此,我们在这些版本中进行了一系列与辅助功能相关的修复。

  • VoiceOver 的时间显示辅助功能
  • 移除进度条中隐藏的控制文本
  • 使跳转到直播按钮正确地向屏幕阅读器宣布其功能
  • 使剩余时间显示中的“-”仅为视觉效果,不被屏幕阅读器读取

其他功能更新

响应式字幕设置对话框

这使用了新的 responsive 设置和断点,使对话框能够根据播放器的大小进行响应,从而改善用户体验。

播放/暂停按钮的重播选项

当视频结束时,播放/暂停按钮会将图标更改为重播图标,大多数用户不介意这一点,并且它之前是一个高需求功能。这增加了一个选项来将其关闭。

focus-visible 菜单背景

与按钮的其他轮廓一样,我们使用不同的背景颜色来表示菜单中的焦点。我们应该像处理按钮轮廓一样,在那里也遵守 focus-visible。

playerreset 事件

当播放器使用 reset() 方法重置时,它现在将触发一个 playerreset 事件,以便组件和用户知晓。

其他修复

  • 修复全屏事件触发两次的问题 (7.4.2)
  • 播放/暂停按钮的光标指针
  • 在 loadedmetadata 而非 loadstart 时选择默认字幕
  • 如果未设置语言,则不要将用户偏好应用于字幕
  • 确保 vjs-waiting 仅在重新开始播放后才被移除
  • 允许将 duration 设置为 NaN,使 Video.js 更符合规范
  • 修复按下菜单按钮时菜单锁定的问题
  • 将子组件移动到新父级时,从旧父级中移除该子组件
  • 视频结束后拖动时移除 vjs-ended
  • 鼠标悬停时不要自动隐藏控制栏

7.4.0、7.4.1 和 7.4.2 的完整更新日志

## [7.4.2](https://github.com/videojs/video.js/compare/v7.4.1...v7.4.2) (2019-01-08)

Bug 修复

  • 当光标移到控制栏上方时自动隐藏 #5258 (#5692) (6ebc772)
  • CSS 动画简写属性顺序 (#5687) (0e69ce9)
  • fs: 确保只有一个 fullscreenchange 事件 (#5686) (2bc90a1),解决了 #5685
  • lang: 添加 liveui 组件使用的瑞典语翻译 (#5704) (f38726e)
  • package:@videojs/http-streaming 更新到 1.6.0 版本 🚀 (#5705) (3d093ed)
  • player: 在拖动后移除 vjs-ended 类 (#5728) (f1637cd),解决了 #5654
  • remaining-time-display: 使“-”仅为视觉效果,不被屏幕阅读器读取 (#5671) (05513f8),解决了 #5168
  • seekbar: 如果直播追踪器的可拖动范围是无限大,则不要禁用 (#5721) (7f507df)
  • 通过 addChild 移动到新父级时,从旧父级中移除子级 (#5702) (8a3e2a7)

杂项

文档

  • liveui: 添加直播用户界面和直播 API 的指南 (#5677) (c147581)
## [7.4.1](https://github.com/videojs/video.js/compare/v7.4.0...v7.4.1) (2018-12-11)

Bug 修复

杂项

  • package: 将 autoprefixer 更新到 9.4.2 版本 (#5647) (19f3465)
  • package: 将 rollup-plugin-node-resolve 更新到 4.0.0 版本 🚀 (#5666) (d07b6c2)

文档

  • 移除 grunt 并更新构建脚本的使用方法 (#5656) (62f9e78)

测试

  • 验证播放器和控制栏子项设置为 false 时的空检查 (#5670) (13b42ad)
# [7.4.0](https://github.com/videojs/video.js/compare/v7.3.0...v7.4.0) (2018-12-03)

功能

Bug 修复

杂项

  • 修复使用 lint-staged 在 pre-commit 上进行 linting 的问题,使用 npm-merge-driver (#5591) (be9e9a9)
  • 修复 Travis 构建 (#5627) (6c1056b),解决了 #5626 #5616
  • 将 a11y、lang、browserify 和 webpack 移出 grunt (#5589) (db6e376)
  • 将复制、压缩和清理任务移动到 npm 脚本 (#5544) (2d682a4)
  • 移除 grunt 迁移到 npm 脚本 (#5592) (d72786f)
  • 从 cross-var 切换到 cross-env (#5600) (ab740bc)
  • 切换到 videojs-generate-karma-config (#5528) (2e70450)
  • 将所有开发依赖更新到最新版本 (#5645) (db1369a),解决了 #5644 #5643
  • 更新依赖,移除 coveralls,修复审计问题 (#5555) (11f1fb8)
  • 在 index.html 中使用相对 URL (#5586) (dec31e4)
  • netlify: 使文档正确构建 (#5636) (a8828cd)
  • package: 将 conventional-changelog-cli 更新到 2.0.11 版本 (#5552) (f236176)
  • package: 将 grunt-cli 更新到 1.3.2 版本 (#5550) (2d27b6a)
  • package: 将 husky 更新到 1.1.3 版本 (#5551) (937e2bf)
  • package: 将 npm-run-all 更新到 4.1.5 以移除 event-stream (#5614) (3e52c4f)
  • package: 将 remark-stringify 更新到 6.0.1 版本 (#5539) (d46828a)
  • package: 将 rollup 更新到 0.67.1 版本 (#5580) (209d9f9)
  • package: 将 videojs-generate-karma-config 更新到 5.0.0 版本 🚀 (#5595) (2162239)
  • player: 修复评论的 linting 问题 (#5588) (b5e6bdc)
  • travis: 移除未使用的秘密变量 (#5577) (15beea7)

文档

Gary Katsevman2017-04-03

Video.js 6.0 发布!

经过数月的努力,我很自豪地宣布 Video.js 6.0 发布了 🎉!

这个版本相当令人兴奋。它极大地改善了控件和组件的辅助功能,我们致力于将 Video.js 打造成我们能做到的最易于访问的播放器。Video.js 还为开发者在中间件高级插件方面提供了一些亮眼而强大的新功能。Video.js 6.0 也是 Flash 从核心中解绑的第一个版本——不过,如果需要,它仍然可以作为插件使用。

今天的发布是一个预发布版本,它将保持这种状态约一到两周,然后才会晋升为 latest。只是为了确保所有最后的 Bug(如果有的话)都能被解决。

您应该了解的事项

5.x 和 6.x 之间的大多数内容都没有改变。事实上,在我们维护的大多数插件工作中,主要的工作是使用新方法并回退到旧方法,因为它们正在记录弃用警告。否则,这些插件将继续工作。

但是,确实有一些突破性更改,需要您采取行动。例如,如果您需要 Flash,现在就需要手动包含它。

另一个重大变化是源选择现在是异步的。这对于中间件支持是必需的,并且如果用户在与播放器交互之前等待播放器准备就绪,则最有可能不会影响他们。

这些内容已在我们的 wiki 上列出。如果有什么遗漏,我们将确保及时更新。

征求反馈

如果您正在使用 Video.js 并有任何意见或问题,请在 Slack 上联系我们。如果您发现错误,请在 GitHub 上提交 issue,最好附带一个精简的测试用例

5.x 版本支持

我们仍将支持 Video.js 5.x 系列版本。这主要将是 Bug 修复,但新功能将根据具体情况考虑。

如果仍需要 IE8 支持,最好继续使用 5.x 版本。

npm 标签

一旦 Video.js 6 晋升为最新版本,它将取代 npm 上的 nextlatest 标签。5.x 版本系列将拥有自己的一组标签:latest-5next-5

行为准则

我们努力做到开放和包容,因此我们采纳了基于 Contributor Covenant《行为准则》,该准则适用于所有 Video.js 项目。

总结

我们对这个版本感到非常兴奋!请从 npm 上的 next 标签或从 CDN 上试用它。也欢迎在 Slack 上与我们交流。

Brandon Casey2017-02-03

功能焦点:辅助功能

辅助功能!你从未了解过但最重要的功能。

在 Video.js 组织中,我们努力提供良好的辅助功能。像大多数其他软件一样,任何更改都可能以意想不到的方式影响系统。例如,在 Video.js 5 中,MuteToggleVolumeControl 被合并到 VolumeMenuButton 中。虽然这一更改确实允许这些控件在视觉上协同工作,但也产生了一些意想不到的影响。它破坏了辅助功能。在这篇文章中,我们将介绍哪里出了问题、修复方案是什么、什么是辅助功能以及如何测试并确保其正常工作。

如果您已经了解什么是辅助功能,请随意跳到最后一节

辅助功能?那是什么?

可访问的软件支持有视力、听力、运动/灵巧或其他障碍的用户。它还帮助希望使用键盘导航的用户。开箱即用的 Web 应用程序由于 HTML 的性质而具有一定的辅助功能,但这仅在您以预期的方式使用原生元素时才适用。如果您不能使用原生 DOM 元素(例如 <button>),而必须使用 <div> 作为按钮,那么您需要担心页面中的辅助功能。

直接为 Video.js 用户提供听力障碍支持是我们无法做到的。相反,我们必须通过在视频中添加字幕支持来间接支持这些用户。在 Video.js 中,我们已经支持字幕和副标题一段时间了,在内部它们被称为 TextTracks。事实上,自版本 4 以来,Video.js 就已经支持 WebVTT 格式的 TextTrack,这种格式更易于访问。

支持视力障碍用户更困难,但在一定程度上在我们的控制范围之内。为了支持这部分用户,我们的播放器必须能够被屏幕阅读器访问。屏幕阅读器是一种将屏幕上的元素读给用户听的应用程序(顾名思义)。除了从屏幕上读取内容,它还允许用户仅使用键盘或触摸屏上的特定手势与页面交互(无需使用鼠标或直接触摸可见项目)。HTML 有某些必须遵循的规则,以便页面能够被访问。我们将在下一节中介绍这些规则的基础知识。屏幕阅读器还通过提供可在视频播放期间朗读的描述性轨道来进一步支持。描述性轨道是 TextTrack 的子类型,如前所述,我们无法自动将其添加到视频中,我们只能在 Video.js 中支持它们。

有关屏幕阅读器列表,请参阅本文末尾的资源部分

如何使 Web 应用程序具有屏幕阅读器辅助功能?

如果您按照原生元素的预期用途使用它们,您就已经完成了大部分工作。这就是为什么使用原生元素是使任何内容具有屏幕阅读器辅助功能的推荐方法。例如,如果您使用 <button> 元素,您将获得以下辅助功能属性(而无需实际将它们放在按钮上):

  • tabIndex 允许用户通过 Tab 键导航到按钮
  • role="button" 告诉屏幕阅读器这是一个按钮
  • 空格键和回车键都将按下按钮

在某些情况下,例如在 Video.js 中,不可能使用原生 <button> 元素。您将不得不模仿上述列表中的辅助功能并使用 div。以下是您需要添加的内容列表:

  • 您必须添加 role="button" 属性以将其归类为按钮。
  • 您必须添加 tabIndex,这将允许通过 tab 键导航到该 div
  • 您必须添加对空格键和回车键按下按钮的处理

role 属性值的列表可以在 Mozilla Developer Network 上找到。

在模拟或添加网页控件和内容的本地辅助功能后,接下来要查看的是 aria 属性。例如,我们为 ProgressBar 滑块使用 aria-live="polite"。默认情况下,aria-live 设置为 off,这意味着除非用户取消焦点并重新聚焦元素,否则不应将控件的更新读给用户。我们使用的 polite 值允许我们将滑块的位置传达给屏幕阅读器,而无需他们改变对控件的焦点。这很有用,因为 ProgressBar 在视频播放时会不断更新。polite 值还将等待传达所述更新,直到屏幕阅读器完成向用户读取其他信息。

有关 ARIA 属性的更完整列表,请参阅规范

最后,您需要为元素添加一个可访问的“名称”,以便可以引用它。一个很好的例子可以在 MuteToggle 控件中看到。由于它不是一个简单的“按钮”,我们以一种对大多数用户隐藏但会向屏幕阅读器宣布的方式包含“静音”或“取消静音”的 innerHTML/innerText。在 Video.js 中,我们将可访问名称和控件执行的操作称为“控制文本”。控制文本在大多数情况下还会更新元素的 title 属性,这对于视觉辅助功能很重要。当控件执行的操作改变时,控制文本也会随之改变。这将允许屏幕阅读器将 MuteToggle 称为“静音切换”而不是“按钮”。它还将传达 MuteToggle 的当前操作。在这种情况下,根据按下按钮时的操作(即按钮的状态),它将是“静音”或“取消静音”。

以下是 Video.js 中辅助功能的一些示例:

  • MuteToggle <button>
    • aria-live 设置为 polite,而不是默认的 off 值。aria-live 的任何非 off 值都表示 innerText/innerHTML 更新可以发送到屏幕阅读器,而无需用户将焦点移开控件。polite 值意味着屏幕阅读器应该等到完成朗读后再传达这些更新给用户。
    • 具有“静音”或“取消静音”的控制文本,指示按钮对用户的当前状态
  • VolumeBar 滑块 <div>
    • 具有 role 属性,值为 slider。例如:role="slider"
    • 具有 tabIndex 属性,因为它不是原生控制元素
    • 具有监听以下事件的 EventHandlers
      • 向上和向右箭头键用于增加音量和滑块百分比
      • 向下和向左箭头键用于减小音量和滑块百分比
    • 具有 aria-label 属性,值为“volume level”,这是一个可访问的标签,屏幕阅读器将使用它来引用
    • 具有 aria-valuenowaria-valuetext 属性,这些属性会更新以指示当前音量级别(以便屏幕阅读器可以读取)
    • aria-live 设置为 polite,而不是默认的 off 值。aria-live 的任何非 off 值都表示 innerText/innerHTML 更新可以发送到屏幕阅读器,而无需用户将焦点移开控件。polite 值意味着屏幕阅读器应该等到完成朗读后再传达这些更新给用户。

问题与解决方案

现在我们来谈谈 Video.js 5 中屏幕阅读器辅助功能是如何被破坏的。首先,VolumeMenuButtonControlBar 上取代了 MuteToggleVolumeControlVolumeMenuButton 被设置为在点击时模仿 MuteToggle。它也会在鼠标悬停或焦点时显示 VolumeControl。这是一个问题,因为 VolumeControl 现在是一个按钮的子级,而按钮不应包含其他控件。对于屏幕阅读器和 DOM 来说,存在两个 MuteToggle button 控件。而视觉上则有一个 VolumeControl 和一个 MuteToggle。您可以在下面的 GIF 中看到这种行为:

macOS `VoiceOver` Before The FixmacOS `VoiceOver` 修复前

解决此问题的方法是使用一个普通的 div 来容纳 MuteToggleVolumeControl。这个普通的 div 将不具有任何角色或控制文本,因此对屏幕阅读器不可见。从那时起,我们只需要模仿旧的用户界面。对于那些好奇的人,这个新组件被称为 VolumePanel。请在下面的 GIF 中查看新行为:

macOS `VoiceOver` After The FixmacOS `VoiceOver` 修复后

轮廓

控件的另一个重要的辅助功能修复来自于移除了一小段 CSS 规则

outline: none;

我们为什么要这么做?根据社区和外部资源的反馈,我们了解到轮廓应该始终开启。没有轮廓,控制元素上就没有键盘焦点的视觉指示,没有这一点,没有视力障碍的键盘用户将很难使用这些控件。

总结

希望这篇文章能为您提供一些关于如何使 Web 应用程序具有辅助功能的见解。如果您发现任何问题或对我们的辅助功能有任何建议,或者有任何其他建议,请随时为 Video.js 做出贡献。

如果您想了解辅助功能工作的最新进展,请查看 PRsissues 上的 a11y 标签。

资源

以下是一些实际使用的流行屏幕阅读器:

了解更多 Web 辅助功能的资源