Skip to main content
CodeRocket
Accessibilitymediummedia

Provide audio descriptions for video

rule · audio-descriptions

Audio descriptions narrate visual information for users who cannot see the video content.

Code Example

HTML
<video controls>
  <source src="product-demo.mp4" type="video/mp4">
 
  <!-- Captions for deaf users -->
  <track kind="captions" src="captions-en.vtt" srclang="en" label="English">
 
  <!-- Audio descriptions for blind users -->
  <track kind="descriptions" src="descriptions-en.vtt" srclang="en" label="English Audio Description">
</video>

Why It Matters

Blind users miss critical plot points, product demos, and on-screen information that's only shown visually—audio descriptions provide equal access to the complete experience.

When Audio Descriptions Are Needed

Visual ContentNeeds Description?
Character actions/reactionsYes
Scene changes/locationsYes
On-screen text/graphicsYes
Facial expressions conveying emotionYes
Talking head with no visual actionNo
Audio-only content (podcast)No

VTT Description File Format

VTT
WEBVTT
 
00:00:03.000 --> 00:00:06.000
A woman in business attire enters a modern office lobby.
 
00:00:15.000 --> 00:00:18.000
She approaches the reception desk where a man looks up from his computer.
 
00:00:32.000 --> 00:00:35.000
On-screen text reads: "Three months later"
 
00:01:05.000 --> 00:01:08.000
Close-up of her face showing concern as she reads the document.

React Video Player with Descriptions

TSX
interface VideoPlayerProps {
  src: string
  captions?: string
  descriptions?: string
  poster?: string
}
 
function AccessibleVideoPlayer({
  src,
  captions,
  descriptions,
  poster
}: VideoPlayerProps) {
  const [descriptionsEnabled, setDescriptionsEnabled] = useState(false)
  const videoRef = useRef<HTMLVideoElement>(null)
 
  return (
    <div className="video-container">
      <video
        ref={videoRef}
        controls
        poster={poster}
        aria-describedby="video-description"
      >
        <source src={src} type="video/mp4" />
 
        {captions && (
          <track
            kind="captions"
            src={captions}
            srcLang="en"
            label="English Captions"
            default
          />
        )}
 
        {descriptions && (
          <track
            kind="descriptions"
            src={descriptions}
            srcLang="en"
            label="Audio Description"
          />
        )}
      </video>
 
      {descriptions && (
        <button
          onClick={() => setDescriptionsEnabled(!descriptionsEnabled)}
          aria-pressed={descriptionsEnabled}
        >
          {descriptionsEnabled ? 'Disable' : 'Enable'} Audio Descriptions
        </button>
      )}
 
      <p id="video-description" className="sr-only">
        Video with audio descriptions available. Use the Audio Descriptions button to enable.
      </p>
    </div>
  )
}

Alternative: Extended Description Video

TSX
// Provide two versions of the video
function VideoWithDescriptionChoice({ standardSrc, extendedSrc }: {
  standardSrc: string
  extendedSrc: string
}) {
  const [useExtended, setUseExtended] = useState(false)
 
  return (
    <div>
      <div role="group" aria-label="Video version selection">
        <label>
          <input
            type="radio"
            name="video-version"
            checked={!useExtended}
            onChange={() => setUseExtended(false)}
          />
          Standard version
        </label>
        <label>
          <input
            type="radio"
            name="video-version"
            checked={useExtended}
            onChange={() => setUseExtended(true)}
          />
          Version with audio descriptions
        </label>
      </div>
 
      <video controls key={useExtended ? 'extended' : 'standard'}>
        <source src={useExtended ? extendedSrc : standardSrc} type="video/mp4" />
      </video>
    </div>
  )
}

Writing Good Descriptions

TEXT
❌ Bad: "A person is there."
✅ Good: "Sarah enters the room looking worried."
 
❌ Bad: "Something happens on screen."
✅ Good: "The graph shows sales dropping 40% over three months."
 
❌ Bad: "He reacts."
✅ Good: "Marcus slams his fist on the table in frustration."

Exceptions

  • Logos, purely decorative text treatments, and screenshots used as documentation can be valid exceptions when their accessible alternative is still provided appropriately.
  • An image or media rule should not force redundant alt text, captions, or transcripts when another nearby mechanism already provides the equivalent information clearly.
  • If the media asset fails more than one rule, prioritize the issue that most directly blocks understanding for assistive technology users.

Verification

Automated Checks

  • Use browser accessibility tooling, axe, Lighthouse, or equivalent automated checks against a representative rendered state.

Manual Checks

  • Watch video with eyes closed—can you follow the story?
  • Verify description track appears in player controls
  • Check descriptions fit in gaps between dialogue
  • Ensure descriptions don't overlap important audio