1.2.2 Captions (Prerecorded)

WCAG 2.2 · 1.2.2 A Perceivable

What it requires

Captions must be provided for all prerecorded audio content in synchronised media (video with sound). Captions present the spoken dialogue and any meaningful non-speech sound — speaker identification, sound effects, music — as synchronised text, timed to appear with the audio it represents.

The criterion applies unless the media is a clearly labelled media alternative for text (a video that merely re-presents existing on-page text). Captions differ from a plain transcript: captions are time-synchronised and include non-speech audio, so a Deaf viewer follows the video in real time rather than reading a separate document.

  • Deaf and hard-of-hearing users who cannot hear the dialogue or audio cues at all.
  • People in sound-off environments — open offices, public transit, libraries — watching muted video.
  • Users in noisy settings where audio is hard to make out.
  • Non-native speakers who read the language more easily than they hear it.

How to detect it

Concrete checks for Captions (Prerecorded)
Check How Catches
Captions present Play each prerecorded video; turn captions on and confirm they exist (not auto-generated gibberish). Missing or absent captions.
Accuracy & sync Compare captions to spoken words; check timing and speaker/sound-effect labels. Wrong, out-of-sync, or dialogue-only captions.
Track wiring Inspect markup for <track kind="captions"> or the player's caption control. Caption file not connected to the player.
Automated tools axe and similar can flag a missing caption track, but cannot judge accuracy. Only obvious absence — manual review is required.

How to fix it

  1. Write or commission an accurate caption file (e.g. WebVTT) covering all dialogue and meaningful sounds, with speaker labels.
  2. Synchronise each caption cue to the moment its audio plays.
  3. Associate the file with the video via a <track> element or the player's caption API.
  4. Provide a visible control to toggle captions and verify they render across browsers.
<video controls>
  <source src="talk.mp4" type="video/mp4">
  <track kind="captions" src="talk.en.vtt"
         srclang="en" label="English" default>
</video>

Copy-paste tests

Automated coverage

The axe-core rule video-caption flags failures of this criterion. Run it via the axe DevTools browser extension or axe-core in CI. Automated tools only catch some failures.

Run this in the browser console

captions-check.js
// Read-only: list videos with no captions track and outline them.
document.querySelectorAll('video').forEach(function (v) {
  var hasCaptions = v.querySelector('track[kind="captions"], track[kind="subtitles"]');
  if (!hasCaptions) {
    v.style.outline = '3px solid red';
    console.log('Video missing captions track:', v.currentSrc || v.src, v);
  }
});
console.table(
  [].map.call(document.querySelectorAll('video'), function (v) {
    return { src: v.currentSrc || v.src, tracks: v.querySelectorAll('track').length };
  })
);

What to check manually: a script can see whether a <track> exists, but a human must confirm the captions are accurate, synchronised, and include speaker IDs and relevant sounds — not auto-generated gibberish.