Requires prerecorded audio-only content (such as a podcast) to have a text transcript, and prerecorded video-only content (such as a silent demo) to have a text description or an audio track that conveys the same information.
A person who cannot hear cannot follow a podcast, and a person who cannot see cannot follow a screen recording that has no sound. If the only version of the content is the audio or the video itself, these users are shut out.
This criterion applies to media that is prerecorded and contains only audio or only video. Prerecorded audio-only content needs an alternative that presents the same information, usually a transcript. Prerecorded video-only content needs either a text description or an audio track that presents the same information. Media that combines audio and video (a recorded talk with slides, for example) is covered by 1.2.2 to 1.2.5, not by this criterion.
Deaf and hard of hearing users read the transcript instead of listening. Blind and low-vision users get the content of a silent video from its description or its audio track. Deafblind users need text they can read on a braille display. A transcript also helps people who cannot play sound (in a quiet office, on a train, with a slow connection), people who read faster than they listen, people who are not native speakers of the language, and search engines, which cannot index the content of audio.
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. An alternative for audio and video content is part of "perceivable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 1.2.1 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.1.2.1 | Web pages | Web content must satisfy WCAG success criterion 1.2.1. |
| 10.1.2.1 | Non-web documents (PDF, Office files) | The same criterion applies to audio and video embedded in documents. |
| 11.1.2.1 | Non-web software (native mobile apps) | Software that supports screen readers must satisfy the criterion. |
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, so 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.1 is the same in WCAG 2.1 and 2.2.
A note on EAA scope: This criterion is where the Directive's exclusions matter most. 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. Audio and video published after that date, and older media you republish or substantially change, are not covered by the exclusion. Even where an exclusion may apply, an alternative is good practice and often the cheapest way to reach more users.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
Give the audio player an accessible name and put a visible link to the transcript next to it.
<audio controls src="episode-12.mp3"></audio><h3>Episode 12: Keyboard navigation</h3>
<audio controls src="episode-12.mp3"
aria-label="Episode 12: Keyboard navigation"></audio>
<p><a href="/transcripts/episode-12">Read the transcript
of Episode 12</a></p>A transcript is more than the words. Name the speakers and include sounds that carry meaning.
<details>
<summary>Transcript</summary>
<p>welcome everyone today we talk about the keyboard
and yes of course thanks</p>
</details><details>
<summary>Transcript: Episode 12</summary>
<p><strong>Host:</strong> Welcome, everyone. Today we
talk about keyboard navigation.</p>
<p><strong>Guest:</strong> Thanks for having me.
[laughs] Let's start with the Tab key.</p>
</details>A silent screen recording needs a description of what happens, in the order it happens, including any text shown on screen.
<video src="menu-demo.mp4" muted autoplay loop></video><video src="menu-demo.mp4" controls muted
aria-describedby="menu-demo-text"></video>
<div id="menu-demo-text">
<p><strong>Description of the video:</strong> The Tab
key moves a blue focus outline across the menu items,
Home, Products and Contact. Pressing Enter on Products
opens a submenu with three links. Pressing Escape closes
the submenu and returns focus to Products.</p>
</div>If the audio is only another way to get text that is already on the page, label it clearly. Then it is itself the alternative and needs no transcript of its own.
<audio controls src="article.mp3"></audio><p>Audio version of this article. It is a recording of
the text on this page.</p>
<audio controls src="article.mp3"
aria-label="Audio version of this article"></audio>Speech-recognition output is a good starting point, but it must be checked. Wrong words, missing speaker names and missing punctuation can change the meaning.
<!-- Raw machine output published as is -->
<p>the tab key move focus too the next element inn
the menu hit enter...</p><!-- Reviewed and corrected by a person -->
<p><strong>Host:</strong> The Tab key moves focus to the
next element in the menu. Press Enter to activate it.</p>The same rule applies in native mobile apps. Place the alternative next to the player, in the same screen, and make it reachable by screen reader and keyboard users.
import SwiftUI
struct EpisodeView: View {
let transcript: String
var body: some View {
VStack(alignment: .leading, spacing: 12) {
Text("Episode 12: Keyboard navigation")
.font(.headline)
AudioPlayerView() // Your audio player
// Text alternative next to the player
DisclosureGroup("Transcript") {
Text(transcript)
}
}
}
}import androidx.compose.foundation.layout.Column
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
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
@Composable
fun EpisodeScreen(transcript: String) {
var expanded by remember { mutableStateOf(false) }
Column {
Text(
text = "Episode 12: Keyboard navigation",
style = MaterialTheme.typography.titleMedium
)
AudioPlayer() // Your audio player
// Text alternative next to the player
TextButton(onClick = { expanded = !expanded }) {
Text(if (expanded) "Hide transcript" else "Show transcript")
}
if (expanded) {
Text(transcript)
}
}
}video or audio element exists, but cannot judge whether a transcript or description is complete. Only a person can decide that.