Accessible Media — Captions, Transcripts & Audio Guide
In this tutorial, you'll learn about Accessible Media. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.
Media content — video, audio, and animations — is inherently inaccessible to users who cannot see, hear, or Process time-based information. Captions, transcripts, audio descriptions, and sign language interpretation Bridge the gap between the content creator and every member of the audience.
What You'll Learn
By the end of this guide, you will understand how to create and serve WebVTT captions for video, audio descriptions for blind users, text transcripts for podcasts and audio recordings, accessible media player controls, sign language interpretation for critical content, and how to test media Accessibility against WCAG 1.2 time-based media success criteria.
Why Accessible Media Matters
Over 466 million people worldwide have disabling hearing loss. An additional 285 million have visual impairments. Video without captions excludes the first group, and video without audio descriptions excludes the second. Beyond Compliance, captions benefit all users — 80 percent of people who use captions are not deaf but use them in noisy environments, for language learning, or to Process information better. At DodaTech, DodaZIP and Durga Antivirus Pro include instructional videos with full caption and transcript support.
Accessible Media Learning Path
flowchart LR
A[Accessibility Overview] --> B[WCAG Compliance]
B --> C[Accessible Images]
C --> D[Accessible Media]
D --> E[Mobile Accessibility]
D:::current
classDef current fill:#f90,color:#fff,stroke:#333,stroke-width:2px
{{< callout type="info" icon="sparkles" >}} Prerequisites: Familiarity with HTML5 video and audio elements. Understanding of WebVTT and basic JavaScript for player controls. {{< /callout >}}
WebVTT Captions
WebVTT (Web Video Text Tracks) is the standard format for timed text tracks in HTML5 video. Each caption block includes a time range and text:
WEBVTT
00:00:01.000 --> 00:00:05.000
Welcome to the DodaTech Accessibility tutorial series.
00:00:05.500 --> 00:00:10.000
Today we are learning about accessible media — captions, transcripts, and audio descriptions.
00:00:10.500 --> 00:00:15.000
Captions are essential for over 466 million people with hearing loss worldwide.
00:00:15.500 --> 00:00:20.000
They also help people in noisy environments, language learners, and anyone processing complex information.
<video controls preload="metadata" poster="tutorial-poster.jpg">
<source src="accessible-media.mp4" type="video/mp4">
<source src="accessible-media.webm" type="video/webm">
<!-- Primary captions in English -->
<track kind="captions" src="captions-en.vtt"
srclang="en" label="English captions" default>
<!-- Additional language subtitles -->
<track kind="subtitles" src="subtitles-es.vtt"
srclang="es" label="Spanish subtitles">
<track kind="subtitles" src="subtitles-fr.vtt"
srclang="fr" label="French subtitles">
<!-- Audio descriptions for blind users -->
<track kind="descriptions" src="descriptions.vtt"
srclang="en" label="English audio descriptions">
<p>
Your browser does not support HTML5 video.
<a href="accessible-media.mp4" download>Download the video (45 MB)</a>
</p>
</video>
Audio Description
Audio descriptions are narrated tracks that describe visual information — actions, expressions, scene changes, and on-screen text — during natural pauses in the video audio:
WEBVTT
00:00:02.000 --> 00:00:04.000
[A diagram appears showing the WCAG POUR principles: Perceivable, Operable, Understandable, Robust]
00:00:08.000 --> 00:00:11.000
[The instructor points to the "Perceivable" section and highlights it in blue]
00:00:18.000 --> 00:00:22.000
[A side-by-side comparison shows a video with captions on the left and without on the right]
When the video has no natural pauses long enough for descriptions, use an extended audio description that pauses the video:
<!-- Extended audio description — video pauses for description -->
<track kind="descriptions" src="extended-descriptions.vtt"
srclang="en" label="Extended audio descriptions">
Text Transcripts for Audio
Every audio recording — podcast, voice message, lecture recording — needs a text transcript:
<audio controls>
<source src="podcast-43.mp3" type="audio/mp3">
<p><a href="podcast-43.mp3">Download episode 43 (28 MB)</a></p>
</audio>
<section aria-label="Full transcript">
<h2>Transcript: The Future of Web Accessibility</h2>
<p><strong>Host:</strong> Welcome back to the DodaTech Accessibility Podcast. Today we are joined by Sarah Johnson, CTO of DodaTech.</p>
<p><strong>Sarah:</strong> Thanks for having me. I want to talk about how WCAG 2.2 is changing the way we think about focus indicators...</p>
<p><em>[Full transcript continues for the entire 32-minute episode]</em></p>
</section>
Accessible Media Player Controls
The media player itself must be keyboard-accessible:
<div class="media-player" role="application" aria-label="Video player">
<video id="player" tabindex="-1">
<source src="tutorial.mp4" type="video/mp4">
</video>
<div class="controls" role="toolbar" aria-label="Media controls">
<button onclick="togglePlay()" aria-label="Play or pause video">
<span id="play-icon">▶</span>
</button>
<button onclick="toggleMute()" aria-label="Mute or unmute">
🔊
</button>
<button onclick="toggleCaptions()" aria-label="Toggle captions">
CC
</button>
<label for="seek-bar" class="sr-only">Seek position</label>
<input type="range" id="seek-bar" min="0" max="100" value="0"
aria-label="Video progress"
oninput="seekTo(this.value)">
<span aria-live="polite" id="time-display">0:00 / 10:30</span>
</div>
</div>
<script>
function togglePlay() {
const player = document.getElementById('player');
if (player.paused) {
player.play();
document.getElementById('play-icon').textContent = '⏸';
} else {
player.pause();
document.getElementById('play-icon').textContent = '▶';
}
}
</script>
Sign Language Interpretation
For critical content — emergency information, public service announcements, legal disclaimers — WCAG SC 1.2.6 Sign Language (Prerecorded) at Level AAA recommends providing sign language interpretation:
<video controls>
<source src="public-announcement.mp4" type="video/mp4">
<!-- Sign language interpretation picture-in-picture -->
<source src="public-announcement-sign-lang.mp4" type="video/mp4">
<track kind="captions" src="captions.vtt" srclang="en" label="English captions">
</video>
Media Accessibility Testing Script
// media-a11y-test.js
function auditMediaAccessibility() {
const results = [];
// Check all video elements
document.querySelectorAll('video').forEach((v, i) => {
const tracks = v.querySelectorAll('track');
const hasCaptions = [...tracks].some(t => t.kind === 'captions');
const hasDescriptions = [...tracks].some(t => t.kind === 'descriptions');
const hasControls = v.hasAttribute('controls');
results.push({
type: 'video',
index: i,
src: v.querySelector('source')?.src || '(inline)',
captions: hasCaptions ? 'YES' : 'MISSING',
descriptions: hasDescriptions ? 'YES' : 'MISSING',
controls: hasControls ? 'YES' : 'MISSING',
});
});
// Check all audio elements
document.querySelectorAll('audio').forEach((a, i) => {
const hasControls = a.hasAttribute('controls');
const hasTranscript = a.nextElementSibling?.getAttribute('aria-label') === 'Full transcript';
results.push({
type: 'audio',
index: i,
src: a.querySelector('source')?.src || '(inline)',
controls: hasControls ? 'YES' : 'MISSING',
transcript: hasTranscript ? 'FOUND' : 'CHECK MANUALLY',
});
});
console.table(results);
return results;
}
// Usage
auditMediaAccessibility();
Expected output: A console table listing every video and audio element on the page with the status of its captions, descriptions, controls, and transcripts.
Common Accessible Media Mistakes
1. Video Without Captions
Any video with speech but no captions is completely inaccessible to deaf and hard-of-hearing users. Captions are WCAG Level A (SC 1.2.2).
2. Auto-Generated Captions Without Review
YouTube and other platforms auto-generate captions, but they frequently contain errors — especially for technical terms, product names, and accented speech. Always review and correct.
3. Audio Without Transcript
Podcasts, voice messages, and lecture recordings without transcripts exclude deaf users. Transcripts also benefit users who cannot play audio or prefer to read.
4. No Audio Descriptions
Videos that convey information visually — charts, diagrams, on-screen text, actions — need audio descriptions for blind users. This is WCAG Level A (SC 1.2.3).
5. Inaccessible Media Player Controls
A media player with custom controls that are not keyboard-accessible (missing tabindex, no aria-labels, no keyboard event handlers) prevents screen reader users from controlling playback.
6. Auto-Playing Media
Video or audio that plays automatically on page load is disorienting for screen reader users and can be inaccessible to users with cognitive disabilities. Always require user activation.
7. Missing Fallback Content
When the <video> or <audio> element cannot play (unsupported format, old browser), users need a fallback — typically a download link for the media file.
Practice Questions
1. What is the difference between captions and subtitles? Captions include dialogue plus non-speech information (sound effects, music, speaker identification) and are intended for deaf viewers. Subtitles translate dialogue only and assume the viewer can hear.
2. What is an audio description? A narrated track that describes visual content — actions, expressions, scene changes, on-screen text — during natural pauses in the video audio. It makes video accessible to blind and low-vision users.
3. What WCAG criteria apply to video captions? SC 1.2.2 Captions (Prerecorded) at Level A requires captions for all prerecorded video with audio. SC 1.2.4 Captions (Live) at Level AA extends the requirement to live video.
4. Why should you never Auto-Play video or audio on a website? Auto-playing media disorients screen reader users who rely on audio to navigate, can trigger vestibular disorders, and consumes bandwidth without user consent.
5. Challenge: Create a complete accessible media player component. It must include play-pause, mute-unmute, seek bar, captions toggle, and keyboard support for all controls. Test with NVDA and keyboard only.
Real-World Task
Audit every video and audio element on your website. For each, verify: captions are present and accurate, audio descriptions are provided (for visual content), transcripts are available (for audio), controls are keyboard-accessible, and the player does not Auto-Play.
FAQ
Try It Yourself
Build a WebVTT caption validator:
// vtt-validator.js
function validateVTT(vttContent) {
const lines = vttContent.trim().split('\n');
const errors = [];
if (lines[0] !== 'WEBVTT') {
errors.push('File must start with WEBVTT header');
}
let i = 1;
while (i < lines.length) {
const line = lines[i].trim();
if (line.includes('-->')) {
const parts = line.split('-->');
if (parts.length !== 2) {
errors.push(`Line ${i + 1}: Invalid timestamp format: "${line}"`);
}
const startTime = parts[0].trim();
const endTime = parts[1].trim();
const timeRegex = /^\d{2}:\d{2}:\d{2}\.\d{3}$/;
if (!timeRegex.test(startTime)) {
errors.push(`Line ${i + 1}: Invalid start time: "${startTime}"`);
}
if (!timeRegex.test(endTime)) {
errors.push(`Line ${i + 1}: Invalid end time: "${endTime}"`);
}
}
i++;
}
if (errors.length === 0) {
console.log('✅ VTT file is valid');
} else {
console.table(errors);
}
return errors;
}
// Test with valid content
const sampleVTT = `WEBVTT
00:00:01.000 --> 00:00:05.000
Hello, welcome to the tutorial.
00:00:05.500 --> 00:00:10.000
This is a second caption.`;
validateVTT(sampleVTT);
Expected output: ✅ VTT file is valid for valid content, or a table of errors for invalid content.
What's Next
Congratulations on completing this Accessible Media guide! Here is where to Go from here:
- Practice daily — Add captions or transcripts to every piece of media you produce
- Build a project — Create a caption-quality review system for your team
- Explore related topics — Learn mobile Accessibility next
- Join the community — Discuss with other learners and share your progress
Remember: every expert was once a beginner. Keep coding!
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro