Screen Readers and Video Players: aria-live, State Announcements, and Describing Time-Based Controls
How screen readers experience a video player — what to announce, what to stay silent about, and the ARIA patterns for seek bars, volume sliders, and caption toggles.
A sighted user glances at a video player and instantly knows: is it playing, how far in, how loud, are captions on. A screen-reader user gets none of that unless you announce it deliberately. The craft is deciding what to announce, when, and how loud — too little and the player is unusable, too much and it’s a chatty nightmare.
What Must Be Announced (and What Must Not)
| State Change | Announce? | Mechanism |
|---|---|---|
| Play / pause | Yes | aria-live="polite" region |
| Seek performed | Yes (brief) | Polite live region — “15 seconds ahead” |
| Volume changed | Yes (brief) | aria-valuetext on the slider |
| Captions on/off | Yes | aria-pressed on the toggle + polite announcement |
| Playback position ticking | No — ever | Time is on-demand (aria-valuenow), never live |
| Buffering | Only if >2s | Polite; brief stalls are noise |
The Golden Rule
Announce events, not state. Playing is an event. The playhead’s existence is state — the user can query it by focusing the seek bar, where aria-valuenow reports the current position on demand. Announcing every tick floods the speech queue.
The Seek Bar Done Right
<input type="range"
role="slider"
aria-label="Seek"
aria-valuemin="0"
aria-valuemax="243"
aria-valuenow="87"
aria-valuetext="1 minute 27 seconds of 4 minutes 3 seconds">
aria-valuetext is doing real work here — “87” is meaningless to a screen reader; “1 minute 27 seconds” is not. Update it on every seek.
The aria-live Politeness Contract
politefor every player announcement — it waits for speech pauses and doesn’t interrupt a user mid-reading.assertivenever for playback events. A user navigating the catalog shouldn’t be interrupted by a trailer’s play announcement.- Give the region
aria-atomic="false"so only the changed text is spoken, not the whole blob.
“Test with the screen reader on and your eyes closed. If you can’t tell what the player is doing in under ten seconds of listening, neither can your users.”
The Trap: Autoplay Announcements
A muted autoplaying preview still fires play/pause events. Screen readers announce all of them. Scope live regions to user-initiated state changes only — suppress announcements for programmatic autoplay.
Our NVDA, JAWS, and VoiceOver test matrix plus announcement-text templates are in the screen reader video player testing notes.