Requires prerecorded video with sound to offer either audio description or a full text alternative, so blind and low-vision users get the important visual information.
A video often shows things that nobody says out loud: a chart on a slide, a person's gesture, an error message on a screen, a scene change. A user who cannot see the picture misses all of it, even when the soundtrack plays perfectly.
This criterion requires prerecorded video with sound to offer one of two things. Either audio description, which is narration that describes the important visual details, or a media alternative, which is a full text version of the video that includes both what is said and what is shown. You can meet the criterion with either one. Note that criterion 1.2.5 (Level AA) then requires audio description specifically, so a media alternative alone is enough only for Level A.
Blind and low-vision users get the visual part of a video through audio description or a descriptive transcript. Deafblind users read the media alternative on a braille display. A descriptive transcript also helps people who cannot watch the video (while driving, or on a slow connection), people with cognitive or attention differences who find it easier to read than to follow a fast picture, and search engines.
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. Giving non-visual access to what a video shows is part of "perceivable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 1.2.3 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.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.1.2.3 | Web pages | Web content must satisfy WCAG success criterion 1.2.3. |
| 10.1.2.3 | Non-web documents (PDF, Office files) | The same criterion applies to video embedded in documents. |
| 11.1.2.3 | Non-web software (native mobile apps) | Software that supports screen readers must satisfy the criterion. |
| 7.2 | Video 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. |
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 is divided into sub-requirements for playback, synchronization and preservation. 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.3 is the same in WCAG 2.1 and 2.2.
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
Offer a second version of the video whose soundtrack includes the description, and make the link easy to find next to the player.
<!-- The video shows a form being filled in, but the
narration only says "as you can see here" -->
<video controls src="tour.mp4"></video><video controls src="tour.mp4">
<track kind="captions" src="tour.en.vtt"
srclang="en" label="English" default>
</video>
<p><a href="/videos/tour-described">Watch the product
tour with audio description</a></p>A media alternative is not just the words. It also describes what is seen, in the order it happens, including text shown on screen.
<details>
<summary>Transcript</summary>
<p><strong>Anna:</strong> And then you click here.</p>
<p><strong>Anna:</strong> Now it looks like this.</p>
</details><details>
<summary>Descriptive transcript</summary>
<p><em>[Visual: The Settings page. Anna moves the
pointer to a blue button labelled "Save".]</em></p>
<p><strong>Anna:</strong> And then you click here.</p>
<p><em>[Visual: A green message appears: "Changes
saved".]</em></p>
<p><strong>Anna:</strong> Now it looks like this.</p>
</details>The cheapest way to meet the criterion is to write the script so that the soundtrack already says what the picture shows. Then no separate description is needed.
Narration script:
"Click this button, then pick one of these options.
As you can see, the result appears over here."Narration script:
"Select the blue Export button in the top right corner,
then choose CSV from the list. The exported file
appears in the Downloads panel on the left."A track with kind="descriptions" holds the description as timed text. Browsers do not read it aloud on their own, so a small script sends each cue to a live region that screen readers announce. A recorded audio description is a better experience than this, so treat it as a supplement.
<video controls src="tour.mp4">
<track kind="descriptions" src="tour.desc.vtt"
srclang="en">
</video>
<!-- Nothing reads the cues to the user --><video id="tour" controls src="tour.mp4">
<track kind="descriptions" src="tour.desc.vtt"
srclang="en" label="Description">
</video>
<div id="desc-live" class="sr-only" aria-live="polite"></div>
<script>
const video = document.getElementById("tour");
const live = document.getElementById("desc-live");
const track = video.textTracks[0];
track.mode = "hidden"; // Load the cues, do not draw them
track.addEventListener("cuechange", () => {
const cue = track.activeCues[0];
if (cue) live.textContent = cue.text;
});
</script>The same rule applies in native mobile apps. Use the platform's video player, include a second audio track that carries the description, and mark it so the system can find it.
import SwiftUI
import AVKit
struct TourVideoView: View {
@State private var player = AVPlayer(
url: URL(string: "https://example.com/tour.m3u8")!
)
var body: some View {
VideoPlayer(player: player)
.frame(height: 220)
.task { await selectAudioDescription() }
}
// Choose the audio track that describes the video.
// The HLS stream must mark that track with the
// public.accessibility.describes-video characteristic.
// AVKit also follows the "Audio Descriptions" setting in
// Settings > Accessibility.
private func selectAudioDescription() async {
guard let item = player.currentItem,
let group = try? await item.asset
.loadMediaSelectionGroup(for: .audible)
else { return }
let described = AVMediaSelectionGroup.mediaSelectionOptions(
from: group.options,
withMediaCharacteristics: [.describesVideoForAccessibility]
)
if let option = described.first {
item.select(option, in: group)
}
}
}import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.viewinterop.AndroidView
import androidx.media3.common.C
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
@Composable
fun TourVideo(player: ExoPlayer, preferDescription: Boolean) {
// The stream must contain an audio track whose role flags
// include ROLE_FLAG_DESCRIBES_VIDEO.
LaunchedEffect(preferDescription) {
player.trackSelectionParameters = player
.trackSelectionParameters
.buildUpon()
.setPreferredAudioRoleFlags(
if (preferDescription) C.ROLE_FLAG_DESCRIBES_VIDEO else 0
)
.build()
}
AndroidView(factory = { context ->
PlayerView(context).apply { this.player = player }
})
}video element exists, but cannot judge whether a description is complete or useful. Only a person can decide that.