WCAG 1.2.5 · Level AA · EN 301 549 9.1.2.5

Audio Description (Prerecorded)

Requires audio description for all prerecorded video in synchronized media, narrating the important visual details that the main soundtrack does not cover.

In brief

Audio description is a second narration that tells blind and low-vision viewers what the picture shows when the main soundtrack does not: who walks into the room, what a chart looks like, which button is clicked, what text appears on the screen.

This criterion requires audio description for all prerecorded video in synchronized media, that is, prerecorded video with a soundtrack. It is the Level AA counterpart of 1.2.3. At Level A you may choose between audio description and a text media alternative. At Level AA, audio description itself is required, so a descriptive transcript alone is no longer enough.

What does it cover?

  • Prerecorded video with sound: Tutorials, product demos, training videos, recorded talks, interviews and promotional films, wherever they are embedded.
  • What gets described: Actions, people, objects, scene changes and any text on screen that the soundtrack does not already say. Describe what matters for understanding, not every detail.
  • Where the description goes: In the natural pauses of the main soundtrack, so it does not talk over dialogue or narration.
  • When no description is needed: If everything important in the picture is already said in the main soundtrack, no audio description is needed. The best way to get there is to narrate the visuals while you record the main audio.
  • Two ways to deliver it: A separate version of the video whose soundtrack includes the description, or an additional audio track that the player can switch on.
  • Exception: If the media is an alternative for text on the same page and is clearly labelled as such, audio description is not required.
  • Out of scope: Captions are covered by 1.2.2, live media by 1.2.4, and a text media alternative by 1.2.3. Pauses that stop the video so a longer description can be inserted ("extended audio description") are a Level AAA technique and are not required here.

Who does it affect?

Blind and low-vision users follow the visual part of the video through audio description. It also helps people who listen without watching (while cooking or driving), people with cognitive or attention differences who benefit from a narrated picture, and people who are new to the topic and cannot tell what the picture is showing.

In the EAA and EN 301 549

The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. Audio description gives non-visual access to what a video shows, and is part of "perceivable".

The technical counterpart is the standard EN 301 549, which incorporates WCAG 1.2.5 by reference and turns it into separate clauses for each kind of ICT. In addition, clause 7 of the standard sets requirements for the video players themselves.

Where WCAG 1.2.5 appears in EN 301 549
ClauseType of ICTWhat it requires
9.1.2.5Web pagesWeb content must satisfy WCAG success criterion 1.2.5.
10.1.2.5Non-web documents (PDF, Office files)The same criterion applies to video embedded in documents.
11.1.2.5Non-web software (native mobile apps)Software that supports screen readers must satisfy the criterion.
7.2Video technologies (players and software that show video with sound)The player must be able to play audio description, keep it synchronized and preserve it when the video is passed on. It must also give users a way to turn it on.

Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality, and clause 7.2 and 7.3 are divided into sub-requirements for playback, synchronization, preservation and user controls. Check the exact numbers in the standard when you cite them.

Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 1.2.5 is the same in WCAG 2.1 and 2.2. It is a Level AA criterion.

A note on EAA scope: Article 2(4) excludes pre-recorded time-based media published before 28 June 2025, and third-party content that the business neither funds, develops nor controls. Videos you publish after that date, and older videos you republish or substantially change, are not covered by the exclusion.

Directive (EU) 2019/882, EUR-Lex, opens in a new tab

Code examples for the web

1. A switch between the standard and the described version

A button with a name and a state lets the user pick the version with audio description, and the video keeps its position when the version changes.

Incorrect
<!-- A described version exists but nothing links to it -->
<video controls src="tour.mp4"></video>
Correct
<video id="tour" controls src="tour.mp4"></video>
<button type="button" id="ad" aria-pressed="false">
  Audio description
</button>

<script>
const video = document.getElementById("tour");
const btn = document.getElementById("ad");

btn.addEventListener("click", () => {
  const on = btn.getAttribute("aria-pressed") !== "true";
  const time = video.currentTime;
  const wasPlaying = !video.paused;

  video.src = on ? "tour-described.mp4" : "tour.mp4";
  video.addEventListener("loadedmetadata", () => {
    video.currentTime = time;
    if (wasPlaying) video.play();
  }, { once: true });

  btn.setAttribute("aria-pressed", String(on));
});
</script>

2. A video on a third-party platform

Many platforms cannot play two audio tracks. Upload the described version as its own video and link to it next to the standard version.

Incorrect
<iframe src="https://www.youtube.com/embed/VIDEO_ID"
        title="Product tour"></iframe>
Correct
<iframe src="https://www.youtube.com/embed/VIDEO_ID"
        title="Product tour"></iframe>
<p><a href="https://www.youtube.com/watch?v=DESCRIBED_ID"
      target="_blank" rel="noopener noreferrer">Product tour
   with audio description<span class="sr-only">, opens in a
   new tab</span></a></p>

3. A description script with timing

Write the description as a timed script, so the narrator and the editor know where each line goes. Describe what is important, in the present tense, and do not interpret.

Incorrect
00:12  Anna looks sad because the project failed.
00:20  Many things happen on the screen.
Correct
00:12  Anna closes her laptop and looks out of the window.
00:20  A red banner appears on the dashboard:
       "Deployment failed".
00:31  Tom opens the logs. Three lines are highlighted
       in yellow.

4. Fit the description into the pauses

A description that talks over dialogue is hard to follow. Check the pauses in the main soundtrack before you write.

Incorrect
Main audio (00:40 to 00:48): "Next, we look at the report."
Description (00:41 to 00:49): "Anna opens a spreadsheet with
four tabs, a pie chart on the right and a filter at the top."
Correct
Main audio (00:40 to 00:48): "Next, we look at the report."
Pause: 00:48 to 00:53
Description (00:48 to 00:53): "A spreadsheet with a pie
chart on the right."

5. Label the described version clearly

Users must be able to find the described version without guessing. Put the words "audio description" in the link text, the button label or the video title.

Incorrect
<a href="/videos/tour-v2">Version 2</a>
Correct
<a href="/videos/tour-described">Product tour
   (with audio description)</a>

Code examples for mobile

The same rule applies in native mobile apps. Offer a control that switches to the version with audio description, and keep the playback position when the version changes.

iOS (SwiftUI)

import SwiftUI
import AVKit

struct DescribedVideoView: View {
    private let normalURL = URL(string: "https://example.com/tour.m3u8")!
    private let describedURL = URL(string: "https://example.com/tour-described.m3u8")!

    @State private var player: AVPlayer
    @State private var described = false

    init() {
        _player = State(initialValue: AVPlayer(
            url: URL(string: "https://example.com/tour.m3u8")!
        ))
    }

    var body: some View {
        VStack(alignment: .leading, spacing: 12) {
            VideoPlayer(player: player)
                .frame(height: 220)

            Toggle("Audio description", isOn: $described)
                .onChange(of: described) { _, isOn in
                    switchVersion(described: isOn)
                }
        }
    }

    private func switchVersion(described: Bool) {
        let time = player.currentTime()
        let wasPlaying = player.rate > 0

        player.replaceCurrentItem(
            with: AVPlayerItem(url: described ? describedURL : normalURL)
        )
        player.seek(to: time)
        if wasPlaying { player.play() }
    }
}

Android (Jetpack Compose, Media3)

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView

@Composable
fun DescribedVideo(player: ExoPlayer) {
    var described by remember { mutableStateOf(false) }

    Column {
        AndroidView(factory = { context ->
            PlayerView(context).apply { this.player = player }
        })

        Row {
            Text("Audio description")
            Switch(
                checked = described,
                onCheckedChange = { isOn ->
                    described = isOn
                    val position = player.currentPosition
                    val wasPlaying = player.isPlaying
                    val url = if (isOn)
                        "https://example.com/tour-described.mp4"
                    else
                        "https://example.com/tour.mp4"

                    player.setMediaItem(MediaItem.fromUri(url), position)
                    player.prepare()
                    if (wasPlaying) player.play()
                }
            )
        }
    }
}

How to test

  • Find the videos that need it: List the prerecorded videos with sound. For each, decide whether the soundtrack already says everything important that the picture shows. If it does, nothing more is needed.
  • Listen without looking: Close your eyes or turn off the screen and play the video. Can you follow what is happening and what appears on screen?
  • Find the audio description: Is there a described version or a track you can switch on? Can you reach it with the keyboard and a screen reader, without sight?
  • Compare the description with the picture: Does it cover actions, people, scene changes and on-screen text that the soundtrack misses? Does it avoid guessing and interpretation?
  • Check timing: Is the description placed in pauses, without talking over dialogue, and in sync with the picture?
  • Check that the version switch keeps the place: When you change to the described version, does it continue from the same point?
  • Test on each platform: Check the web player and the native mobile players. Does the system setting for audio description carry over where the platform supports it?
  • Limits of automated tools: Automated tools cannot judge whether a description is complete, well-timed and helpful. Only a person can decide that, and the best reviewers are blind or low-vision users.

Common mistakes

  • Treating captions as enough: Captions give the sound, not the picture.
  • Providing only a descriptive transcript: This meets Level A (1.2.3), but Level AA requires audio description.
  • "As you can see here" narration: Phrases that depend on seeing the screen leave the listener without information. Rewrite the main narration to say what the screen shows.
  • Describing too much or too little: Describe what matters for understanding. Skip trivial detail, but do not leave out important actions or on-screen text.
  • Talking over dialogue: Audio description belongs in natural pauses.
  • Interpreting instead of describing: "Anna looks sad" is a guess. "Anna closes her laptop and looks out of the window" is what is shown.
  • Hiding the described version: No link, no switch, or a name that does not say what it is.
  • Not updating the description when the video changes: A new cut of the video needs new timing.

Sources

Standard version: EN 301 549 V4.1.1 (2026-09), WCAG 2.2. This page is for informational purposes only and is not legal advice. For binding requirements, refer to the official texts of the European Accessibility Act (Directive (EU) 2019/882) and EN 301 549.

Corpowid is recognized by Gartner

Corpowid has been recognized by Gartner, a leading global research and advisory firm, for our innovation and performance in digital accessibility. These badges reflect our commitment to creating inclusive, AI-powered web experiences.

Have questions about Corpowid?

Let’s connect.

We will get back to you as soon as possible.