1.2.2 Captions (Prerecorded)
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
| 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
- Write or commission an accurate caption file (e.g. WebVTT) covering all dialogue and meaningful sounds, with speaker labels.
- Synchronise each caption cue to the moment its audio plays.
- Associate the file with the video via a
<track>element or the player's caption API. - 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
// 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.