1.2.2 Level A Guideline 1.2 Time-based Media Added in WCAG 2.0 Partly detectable automatically

Captions (Prerecorded)

Captions are provided for all prerecorded audio content in synchronised media. Captions carry dialogue plus speaker identification and meaningful non-speech sound.

Who this affects

Deaf and hard-of-hearing users. Also anyone in a loud environment, in a quiet environment without headphones, or watching in a second language.

The failure and the fix

Each example below is a self-contained page, loaded in a frame so its markup cannot affect this page. Open either one on its own to test it with a keyboard or screen reader.

Fails 1.2.2

Open the failing example in a new tab

fail.html — the problem

<h1>A short tour of the shop</h1>

<!-- FAILURE: synchronised media - it has both picture and sound - with no
     captions track at all.

     Watch it with the sound off. The doorbell, the counter bell and the
     unanswered telephone are all gone, and nothing on screen replaces them.
     That soundtrack is information, and a deaf viewer never receives it. -->
<video controls width="640" src="../../assets/media/shop-tour.mp4"></video>

<!-- A second common failure: relying on the platform's automatic captions and
     never correcting them. Auto-captions routinely mangle names, technical
     terms and punctuation, and they almost never mark non-speech sound at all -
     so a clip like this one comes out completely blank. Uncorrected
     auto-captions do not meet 1.2.2. -->

Meets 1.2.2

Open the passing example in a new tab

pass.html — the fix

<h1>A short tour of the shop</h1>

<!-- FIX: a captions track in WebVTT.
       kind="captions"  - captions, not subtitles. Subtitles translate dialogue
                          for people who can hear; captions serve people who
                          cannot, so they must include non-speech sound too.
       srclang="en"     - the language of the cues
       label="English"  - what the user sees in the track menu
     Because the file is loaded over HTTP, note that opening this page from
     the filesystem may block the track: browsers treat a VTT file as a
     cross-origin request under file://. Serve the site (npm run dev) to
     see captions working. -->
<video controls width="640">
  <source src="../../assets/media/shop-tour.mp4" type="video/mp4">
  <track kind="captions" src="../../assets/media/shop-tour-captions.vtt"
         srclang="en" label="English" default>
  Your browser does not support HTML video.
</video>

<!-- The cues themselves, so you can read what good captions contain:

       00:00.500 --> 00:01.700
       [shop doorbell chimes]

       00:12.900 --> 00:15.500
       [telephone rings four times]

     Rules worth memorising:
       - put non-speech sound in square brackets
       - identify the speaker when it is not obvious: "ANNA: over here"
       - never let a cue outrun what a person can read, roughly 20 characters
         per second
       - caption what MATTERS: a clock ticking in a thriller is information,
         the same clock in an interview is not -->

How to test it

Play every video with sound off. Confirm captions are synchronised, accurate, identify speakers, and include relevant sounds such as [door slams]. Auto-generated captions with no human correction routinely fail on names, technical terms, and punctuation.

  • Automated

    A scanner can detect that a track element with kind="captions" is absent. It cannot verify caption accuracy, synchronisation, or completeness.

    Relevant axe rules:

    • video-caption
  • Keyboard

    Unplug the mouse. Move through the page with Tab, Shift+Tab, Enter, Space and the arrow keys. See the keyboard testing script.

  • Screen reader

    Listen to both examples with NVDA, JAWS, VoiceOver or TalkBack and compare what is announced. See the screen reader cheat sheets.

  • Visual

    Zoom to 200% and 400%, narrow the viewport to 320 px, and apply the text-spacing overrides. See the visual testing procedures.

In the specification