1.2.4 Captions (Live)
WCAG 2.2 · 1.2.4 AA Perceivable
What it requires
Captions must be provided for all live audio content delivered in synchronized media — for example a webcast, a streamed event, or a live video call embedded in a page. The captions carry the spoken dialogue and important non-speech sounds (speaker changes, applause, alarms) in real time, synchronized with the audio.
This criterion applies only to live media. Prerecorded audio is covered by 1.2.2 Captions (Prerecorded). It does not apply to a media alternative for text, or to audio that has no information beyond what is already on the page.
People who are Deaf or hard of hearing rely on captions to follow live audio. Without them, the spoken content of a live stream is entirely lost — and unlike prerecorded media, the user cannot pause or seek a transcript later. Captions also help people in noisy or sound-off environments and those processing speech in a second language.
How to detect it
| Check | How | Automated? |
|---|---|---|
| Captions exist | During the live stream, turn on the caption control and confirm captions appear. | No — needs a human watching the live event. |
| Synchronized & accurate | Verify captions track the speech in real time and identify speakers and key sounds. | No — manual judgment. |
| Control is operable | Reach and toggle the caption control with the keyboard; confirm it is exposed to screen readers. | Partial — axe flags unnamed controls, not whether captions are present. |
| Readable at zoom | At 200% zoom, captions remain visible and unclipped. | No. |
Automated tools cannot confirm that live captions are present or accurate, so 1.2.4 is inherently a manual check performed against the live broadcast.
How to fix it
- Plan captioning before the event: arrange a real-time captioner (CART) or a vetted automatic speech-recognition service appropriate to the content's stakes.
- Deliver captions in the streaming pipeline (for example as a CEA-608/708 or WebVTT track) so they stay synchronized with the audio.
- Expose a clearly labeled, keyboard-operable control to turn captions on and off.
- Include speaker identification and significant non-speech sounds, not just dialogue.
- Test on the real player and connection before going live.
When you embed a live player, point its caption track at the live caption source:
<video controls>
<source src="https://live.example.com/stream.m3u8" type="application/x-mpegURL">
<track kind="captions" src="https://live.example.com/captions.vtt"
srclang="en" label="English" default>
</video>
Copy-paste tests
Automated coverage
There is no fully automated axe-core rule for 1.2.4 — a tool cannot tell whether live captions exist or are accurate. This criterion needs manual review using the console check and steps below.
Run this in the browser console
// READ-ONLY: surfaces media that may carry live audio without captions.
const media = [...document.querySelectorAll('video, audio')];
const suspects = media.map(el => ({
el,
tag: el.tagName,
src: el.currentSrc || el.src || '(source child)',
captionTracks: [...el.querySelectorAll('track')]
.filter(t => ['captions', 'subtitles'].includes(t.kind)).length
})).filter(m => m.captionTracks === 0);
console.table(suspects.map(({ el, ...row }) => row));
suspects.forEach(s => { s.el.style.outline = '3px solid red'; });
console.log('Media without a captions/subtitles track:', suspects.length, suspects);
What to check manually: with the live stream actually playing, confirm captions appear in real time and accurately convey speech, speaker changes, and key sounds — and that an embedded iframe player (which the script cannot inspect) carries live captions too.