可访问的多媒体

另一种可能导致无障碍性问题的​​内容是多媒体。视频、音频和图像内容需要提供适当的文本替代方案,以便辅助技术及其用户能够理解它们。本文将展示具体做法。

预备知识 熟悉 HTMLCSS 以及模块中先前课程教授的无障碍最佳实践。
学习成果
  • 原生媒体播放器的问题,以及如何创建自定义播放器。
  • 音频转录和文本轨道(字幕、副标题等)在使音频和视频内容可访问方面的作用。

多媒体和无障碍性

到目前为止,在本模块中,我们研究了各种内容以及为确保其无障碍性需要采取的措施,包括从简单的文本内容到数据表、图像、表单元素和按钮等原生控件,甚至更复杂的标记结构(带有 WAI-ARIA 属性)。

本文则着眼于另一类内容,这类内容要确保无障碍性可以说并不那么容易——多媒体。图像、音轨、视频、<canvas> 元素等,屏幕阅读器不容易理解,也无法通过键盘导航,我们需要给它们提供一些帮助。

但不要绝望——在这里,我们将帮助你了解使多媒体更易于访问的可用技术。

简单图像

我们已经在 HTML:无障碍性的良好基础 一文中介绍了 HTML 图像的简单文本替代方案——你可以回顾该文获取完整详细信息。简而言之,你应该确保在可能的情况下,视觉内容具有可供屏幕阅读器拾取并读给用户听的替代文本。

例如

html
<img
  src="dinosaur.png"
  alt="A red Tyrannosaurus Rex: A two legged dinosaur standing upright like a human, with small arms, and a large head with lots of sharp teeth." />

无障碍音频和视频控制

为基于 Web 的音频/视频实现控件应该不是问题,对吗?让我们调查一下。

原生 HTML 控件的问题

HTML 视频和音频实例甚至带有一组内置控件,允许你直接控制媒体。例如(请参阅 native-controls.html 源代码在线演示

html
<audio controls>
  <source src="viper.mp3" type="audio/mp3" />
  <source src="viper.ogg" type="audio/ogg" />
  <p>
    Your browser doesn't support HTML audio. Here is a
    <a href="viper.mp3">link to the audio</a> instead.
  </p>
</audio>

<br />

<video controls>
  <source src="rabbit320.mp4" type="video/mp4" />
  <source src="rabbit320.webm" type="video/webm" />
  <p>
    Your browser doesn't support HTML video. Here is a
    <a href="rabbit320.mp4">link to the video</a> instead.
  </p>
</video>

controls 属性提供了播放/暂停按钮、进度条等——媒体播放器应有的基本控件。它在 Firefox 和 Chrome 中看起来像这样:

Screenshot of Video Controls in Firefox

Screenshot of Video Controls in Chrome

然而,这些控件存在问题:

  • 它们在大多数浏览器中都无法通过键盘访问,即你无法在原生播放器中的控件之间进行 Tab 键切换。Opera 和 Chrome 在某种程度上提供了此功能,但仍不理想。
  • 不同浏览器对原生控件的样式和功能各不相同,而且它们无法设置样式,这意味着它们无法轻易地遵循网站样式指南。

为了弥补这一点,我们可以创建自己的自定义控件。让我们看看如何实现。

创建自定义音频和视频控件

HTML 视频和音频共享一个 API——HTML 媒体元素——它允许你将自定义功能映射到按钮和其他控件——这些都由你自行定义。

让我们以上面的视频为例,并为其添加自定义控件。

基本设置

首先,获取一份我们的 custom-controls-start.htmlcustom-controls.cssrabbit320.mp4rabbit320.webm 文件,并将它们保存到硬盘上的一个新目录中。

创建一个名为 main.js 的新文件,并将其保存在同一目录中。

首先,让我们看看 HTML 中视频播放器的 HTML 代码:

html
<section class="player">
  <video controls>
    <source src="rabbit320.mp4" type="video/mp4" />
    <source src="rabbit320.webm" type="video/webm" />
    <p>
      Your browser doesn't support HTML video. Here is a
      <a href="rabbit320.mp4">link to the video</a> instead.
    </p>
  </video>

  <div class="controls">
    <button class="play-pause">Play</button>
    <button class="stop">Stop</button>
    <button class="rwd">Rwd</button>
    <button class="fwd">Fwd</button>
    <div class="time">00:00</div>
  </div>
</section>

JavaScript 基本设置

我们在视频下方插入了一些简单的控制按钮。这些控件默认当然不会做任何事情;要添加功能,我们将使用 JavaScript。

我们首先需要存储对每个控件的引用——将以下内容添加到 JavaScript 文件的顶部:

js
const playPauseBtn = document.querySelector(".play-pause");
const stopBtn = document.querySelector(".stop");
const rwdBtn = document.querySelector(".rwd");
const fwdBtn = document.querySelector(".fwd");
const timeLabel = document.querySelector(".time");

接下来,我们需要获取对视频/音频播放器本身的引用——在前面的代码行下方添加此行:

js
const player = document.querySelector("video");

这保留了对 HTMLMediaElement 对象的引用,该对象具有几个有用的属性和方法,可用于将功能连接到我们的按钮。

在继续创建按钮功能之前,让我们移除原生控件,以免它们妨碍我们的自定义控件。再次在 JavaScript 文件底部添加以下代码:

js
player.removeAttribute("controls");

以这种方式而不是一开始就不包含 controls 属性的好处是,如果我们的 JavaScript 因任何原因失败,用户仍然有一些可用的控件。

连接我们的按钮

首先,让我们设置播放/暂停按钮。我们可以通过一个简单的条件函数使其在播放和暂停之间切换,如下所示。将其添加到你的代码底部:

js
playPauseBtn.onclick = () => {
  if (player.paused) {
    player.play();
    playPauseBtn.textContent = "Pause";
  } else {
    player.pause();
    playPauseBtn.textContent = "Play";
  }
};

接下来,在底部添加以下代码,用于控制停止按钮:

js
stopBtn.onclick = () => {
  player.pause();
  player.currentTime = 0;
  playPauseBtn.textContent = "Play";
};

HTMLMediaElement 上没有可用的 stop() 函数,因此我们改为 pause() 它,同时将 currentTime 设置为 0。

接下来是我们的快退和快进按钮——将以下代码块添加到你的代码底部:

js
rwdBtn.onclick = () => {
  player.currentTime -= 3;
};

fwdBtn.onclick = () => {
  player.currentTime += 3;
  if (player.currentTime >= player.duration || player.paused) {
    player.pause();
    player.currentTime = 0;
    playPauseBtn.textContent = "Play";
  }
};

这些非常简单,每次点击时只需在 currentTime 上增加或减去 3 秒。在真实的视频播放器中,你可能需要一个更精巧的搜索栏或类似的东西。

请注意,我们还会检查 currentTime 是否超过媒体总 duration,或者当按下 fwdBtn 时媒体是否未播放。如果任一条件为真,我们都会停止视频,以避免在视频未播放时尝试快进或快进超过视频末尾时用户界面出现问题。

最后,将以下代码添加到代码末尾,以控制已播放时间的显示:

js
player.ontimeupdate = () => {
  const minutes = Math.floor(player.currentTime / 60);
  const seconds = Math.floor(player.currentTime - minutes * 60);
  const minuteValue = minutes < 10 ? `0${minutes}` : minutes;
  const secondValue = seconds < 10 ? `0${seconds}` : seconds;

  const mediaTime = `${minuteValue}:${secondValue}`;
  timeLabel.textContent = mediaTime;
};

每次时间更新时(每秒一次),我们都会触发此函数。它根据给定的 currentTime 值(以秒为单位)计算分钟数和秒数,如果分钟或秒的值小于 10,则添加前导 0,然后创建显示读数并将其添加到时间标签。

延伸阅读

这为您提供了如何向视频/音频播放器实例添加自定义播放器功能的基本概念。有关如何向视频/音频播放器添加更复杂功能的更多信息,请参阅:

我们还创建了一个高级示例,展示了如何创建一个面向对象的系统,该系统查找页面上的所有视频和音频播放器(无论有多少个),并向其添加我们的自定义控件。请参阅 custom-controls-oojs(也请参阅源代码)。

音频转录

为了让听力障碍人士能够访问音频内容,你需要创建文本转录。这些转录可以以某种方式包含在与音频相同的页面上,也可以包含在单独的页面上并链接到该页面。

关于实际创建转录,您的选择包括:

  • 商业服务——你可以付费请专业人士进行转录,例如 ScribieCasting WordsRev 等公司。多方打听并寻求建议,以确保您找到一家信誉良好且能有效合作的公司。
  • 社区/基层/自我转录——如果你是工作场所活跃社区或团队的一员,那么你可以请求他们帮助进行翻译。你甚至可以尝试自己动手做。
  • 自动化服务——有一些可用的 AI 服务,例如 TrintTranscribear。将视频/音频文件上传到网站,它会自动为您转录。在 YouTube 上,您可以选择生成自动字幕/转录。根据口语音频的清晰度,生成的转录质量会大相径庭。

就像生活中的大多数事情一样,你往往会得到你所付出的;不同的服务在准确性和生成转录所需时间方面会有所不同。如果你付费给一家信誉良好的公司或 AI 服务进行转录,你可能会很快得到高质量的转录。如果你不想付费,你可能会得到较低质量的转录,和/或速度较慢。

发布音频资源但承诺稍后发布转录是不可以的——此类承诺往往无法兑现,这将损害你与用户之间的信任。如果你呈现的音频是面对面会议或现场口语表演之类的,那么在表演期间做笔记,将其与音频一起完整发布,然后寻求帮助以整理笔记是可以接受的。

转录示例

如果您使用自动化服务,那么您可能需要使用该工具提供的用户界面。例如,查看我们的 等等,ARIA 角色有类别? 视频,然后选择三点菜单 (. . .) > 显示转录。您会看到转录出现在一个单独的面板中。

如果您正在创建自己的用户界面来呈现音频和相关转录,您可以随心所欲,但将其包含在可显示/可隐藏的面板中可能更合理;请参阅我们的 audio-transcript-ui 示例(也请参阅源代码)。

音频描述

在您的音频附带视觉效果的情况下,您需要提供某种音频描述来描述这些额外内容。

在许多情况下,这将采用视频的形式,在这种情况下,您可以使用本文下一节中描述的技术来实现字幕。

但是,也有一些特殊情况。例如,您可能有一个会议录音,其中提到了附带资源,如电子表格或图表。在这种情况下,您应该确保这些资源与音频 + 转录一起提供,并在转录中提到它们的地方明确链接到它们。这当然会帮助所有用户,而不仅仅是听障人士。

注意:音频转录通常会帮助多个用户群体。除了为听障用户提供音频中包含的信息外,还要考虑带宽较低的用户,他们会觉得下载音频不方便。还要考虑在酒吧或酒馆等嘈杂环境中的用户,他们试图获取信息但听不到噪音。

视频文本轨道

为了使视频对聋人、视障人士或其他用户群体(例如带宽较低或不理解视频录制语言的用户)无障碍,您需要在视频内容中包含文本轨道。

注意:文本轨道对任何用户都可能有用,不仅仅是残障人士。例如,有些用户可能因为身处嘈杂环境(例如播放体育比赛的拥挤酒吧)而听不到音频,或者如果身处安静场所(例如图书馆)而不想打扰他人。

这不是一个新概念——电视服务很早就提供了隐藏式字幕

Frame from an old-timey cartoon with closed captioning "Good work, Goldie. Keep it up!"

许多国家提供带有其本国语言字幕的英语电影,DVD 上也经常提供不同语言的字幕,如下图所示

An English film with German subtitles "Emo, warum erkennst du nicht die Schonheit dieses Ortes?"

不同类型的文本轨道有不同的用途。您将遇到的主要类型是:

  • 字幕——为听障用户提供便利,他们听不到音轨,包括口语单词和上下文信息,例如说话者是谁,人们是生气还是悲伤,以及音乐当前营造的心情。
  • 副标题——包含音频对话的翻译,供不理解口语的用户使用。
  • 描述——包括为视障人士提供的描述,他们看不到视频,例如场景的样子。
  • 章节标题——旨在帮助用户导航媒体资源的章节标记。

实现 HTML 视频文本轨道

用于显示 HTML 视频的文本轨道需要用 WebVTT 编写,这是一种文本格式,包含多个文本字符串以及元数据,例如您希望每个文本字符串在视频中显示的时间,甚至有限的样式/定位信息。这些文本字符串称为提示。

一个典型的 WebVTT 文件看起来像这样:

WEBVTT

1
00:00:22.230 --> 00:00:24.606
This is the first subtitle.

2
00:00:30.739 --> 00:00:34.074
This is the second.

…

要使其与 HTML 媒体播放一起显示,您需要:

  • 将其保存为 .vtt 文件,并放在合理的位置。
  • 使用 <track> 元素链接到 .vtt 文件。<track> 应该放置在 <audio><video> 内部,但要在所有 <source> 元素之后。使用 kind 属性指定提示是副标题、字幕还是描述。此外,使用 srclang 告诉浏览器你编写字幕的语言。

这是一个例子

html
<video controls>
  <source src="example.mp4" type="video/mp4" />
  <source src="example.webm" type="video/webm" />
  <track kind="subtitles" src="subtitles_en.vtt" srclang="en" />
</video>

这将导致视频显示字幕。有关完整应用程序及其源代码,请参阅 向 HTML 视频添加字幕和副标题。此示例使用 JavaScript 允许用户在不同字幕之间进行选择。请注意,要打开字幕,您需要按“CC”按钮并选择一个选项——English、Deutsch 或 Español。

注意:文本轨道和转录也有助于您的 SEO,因为搜索引擎尤其依赖文本。文本轨道甚至允许搜索引擎直接链接到视频中间的某个位置。

总结

本章总结了多媒体内容的无障碍性问题,并提供了一些实用的解决方案。

使多媒体无障碍并不总是容易的。例如,如果你正在处理沉浸式 3D 游戏或虚拟现实应用程序,为这种体验提供文本替代方案是相当困难的,你可能会认为视障用户并不是此类应用程序的目标受众。

但是,您可以确保此类应用程序具有足够好的颜色对比度和清晰的呈现,以便低视力/色盲用户能够感知,并且还可以使其通过键盘访问。请记住,无障碍性是尽可能地做到最好,而不是一直追求 100% 的无障碍性,这通常是不可能的。