Requires captions for all live audio in synchronized media, such as webinars and streamed events, so deaf and hard of hearing users can follow in real time.
Live events leave no time to prepare a caption file in advance. A deaf or hard of hearing person who joins a webinar, a streamed conference or a live Q&A hears nothing unless the speech is turned into text while it is being spoken.
This criterion requires captions for all live audio in synchronized media, that is, live video with a soundtrack. Live captions are usually produced by a trained human captioner (often called CART, communication access real-time translation), by speech recognition, or by a combination of both. What matters is that the captions are available during the event, accurate enough to follow and close enough in time to the speech.
Deaf and hard of hearing users follow live events through captions. Live captions also help people in noisy places, people who are not native speakers of the language, people who find it easier to read than to listen, and anyone who joins late and wants to catch up on what was said.
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. Live captions are part of "perceivable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 1.2.4 by reference and turns it into separate clauses for each kind of ICT. Clause 7.1 also sets requirements for players that display captions, and clause 6 covers real-time communication such as video calls.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.1.2.4 | Web pages | Web content must satisfy WCAG success criterion 1.2.4. |
| 11.1.2.4 | Non-web software (native mobile apps) | Software that supports screen readers must satisfy the criterion. |
| 7.1 | Video technologies (players and software that show video with sound) | The player must be able to display captions and let users adjust how they look. |
Documents are not live, so the criterion does not apply to them. 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.4 is the same in WCAG 2.1 and 2.2. It is a Level AA criterion.
A note on EAA scope: The exclusion in Article 2(4) covers pre-recorded time-based media published before 28 June 2025. It does not cover live content, so live events you stream as part of an in-scope service are not excluded by it.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
Say on the event page that captions are provided and where to find them. If a captioner works on a separate service, link to the caption feed.
<h1>Product launch, live</h1>
<iframe src="https://stream.example.com/launch"
title="Live stream"></iframe><h1>Product launch, live</h1>
<iframe src="https://stream.example.com/launch"
title="Live stream of the product launch"></iframe>
<p>Live captions in English are provided by a captioner.
<a href="https://captions.example.com/launch"
target="_blank" rel="noopener noreferrer">Open the live
captions in a new window<span class="sr-only">, opens
in a new tab</span></a></p>
<p>A recording with reviewed captions will be published
within 48 hours.</p>If you stream with HLS, publish the captions as a subtitle rendition in the master playlist and mark it as a transcription of speech. Players can then show a captions menu.
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720
video/720p.m3u8#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",
LANGUAGE="en",DEFAULT=YES,AUTOSELECT=YES,
CHARACTERISTICS="public.accessibility.transcribes-spoken-dialog",
URI="captions-en/live.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2500000,RESOLUTION=1280x720,
SUBTITLES="subs"
video/720p.m3u8If you receive caption text from a captioning service, show it as visible text next to or over the video. Do not make it a live region that screen readers announce: screen reader users already hear the audio, and a second announcement would talk over it.
<div id="captions" aria-live="assertive"></div><section aria-label="Live captions" lang="en">
<div id="captions" class="live-captions"></div>
</section>
<script>
const box = document.getElementById("captions");
const socket = new WebSocket("wss://captions.example.com/launch");
socket.addEventListener("message", (event) => {
const line = document.createElement("p");
line.textContent = event.data;
box.appendChild(line);
// Keep only the latest lines
while (box.children.length > 3) box.firstChild.remove();
});
</script>Live captions need preparation. Brief the captioner, share names and terms ahead of time, and check the feed before going live.
Event checklist:
- Test camera
- Test microphone
- Go liveEvent checklist:
- Book a captioner and send them the agenda, speaker
names, product names and terms
- Test camera and microphone
- Test the caption feed with a rehearsal
- Announce the captions on the event page
- Plan the reviewed captions for the recordingThe same rule applies in native mobile apps. Use the platform's video player, which can show the captions that your live stream carries and follows the user's system settings.
import SwiftUI
import AVKit
struct LiveEventView: View {
// The live HLS stream must carry a captions rendition
// (WebVTT or CEA-608/708), as in the playlist above.
@State private var player = AVPlayer(
url: URL(string: "https://example.com/live/launch.m3u8")!
)
var body: some View {
VStack(alignment: .leading, spacing: 8) {
// AVKit shows the captions menu and follows the
// "Closed Captions + SDH" system setting.
VideoPlayer(player: player)
.frame(height: 220)
.accessibilityLabel("Live stream of the product launch")
Text("Live captions are available in the player's captions menu.")
.font(.footnote)
}
}
}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 LiveEvent(player: ExoPlayer) {
// Prefer a captions track, in English if available
LaunchedEffect(Unit) {
player.trackSelectionParameters = player
.trackSelectionParameters
.buildUpon()
.setPreferredTextLanguage("en")
.setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
.build()
}
AndroidView(factory = { context ->
PlayerView(context).apply {
this.player = player
// Shows the captions button in the controls
setShowSubtitleButton(true)
}
})
}