How to make <video> accessible
to vision-impaired users
Use your cursor keys to move forward and backward through the slides.
<video poster="video.png" controls>
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
</video>
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description created by human or TTS
Choice of most appropriate video resource:
current idea: Resources given in manifest file, e.g. m3u8
User preference setting determines right resource
NOT IN SPEC YET
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
<video poster="video.png" controls>
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
<track label="English HoH" kind="descriptions" srclang="en"
src="video_audesc_en.wsrt">
<track label="Chapters" kind="chapters" srclang="en"
src="video_chapters_en.wsrt">
<track label="English CC" kind="captions" srclang="en"
src="video_en.wsrt">
<track label="French SUB" kind="subtitles" srclang="fr"
src="video_fr.wsrt">
</video>
... anything time-synchronized with <video> and <audio>.
1
00:00:00,000 --> 00:00:05,000
The orange open movie project presents
2
00:00:05,010 --> 00:0:12,000
Introductory titles are showing on the background of a water pool with fishes
swimming and mechanical objects lying on a stone floor.
3
00:00:12,010 --> 00:00:14,800
Title: Elephants Dream
To be replaced by <v person></v>
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description is given inside video resource
Video resource has multiple tracks:
Tracks are activated based on user preferences
Tracks are exposed in JavaScript
interface HTMLMediaElement : HTMLElement {
[...]
// timed tracks
readonly attribute TimedTrack[] tracks;
}
interface TimedTrack {
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
[...]
readonly attribute TimedTrackCueList cues;
readonly attribute TimedTrackCueList activeCues;
readonly attribute Function oncuechange;
};
interface TimedTrackCueList {
readonly attribute unsigned long length;
getter TimedTrackCue (in unsigned long index);
TimedTrackCue getCueById(in DOMString id);
};
interface TimedTrackCue {
readonly attribute DOMString id;
readonly attribute double startTime;
readonly attribute double endTime;
DOMString getCueAsSource();
DocumentFragment getCueAsHTML();
readonly attribute Function onenter;
readonly attribute Function onexit;
};
video = getElementByTagname('video')[0];
for (i=0; i < video.tracks.length(); i++) {
if (video.tracks[i].kind=="descriptions") {
video.tracks[i].mode=SHOWING;
}
}
Ogg Theora video: encapsulates SRT through Kate
Matroska (WebM container): encapsulates SRT
MPEG-4 Video: encapsulates 3GPP TT - can be encoded from SRT using MP4Box
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description is given as text snippets
Video resource has only main tracks:
Descriptions are added through JavaScript
interface HTMLMediaElement : HTMLElement {
[...]
// mutable timed tracks
MutableTimedTrack addTrack(in DOMString kind, in optional DOMString label, in optional DOMString language);
}
interface MutableTimedTrack : TimedTrack {
void addCue(in TimedTrackCue cue);
void removeCue(in TimedTrackCue cue);
};
interface TimedTrack {
readonly attribute DOMString kind;
readonly attribute DOMString label;
readonly attribute DOMString language;
[...]
readonly attribute TimedTrackCueList cues;
readonly attribute TimedTrackCueList activeCues;
readonly attribute Function oncuechange;
};
video = getElementByTagname('video')[0];
track = video.addTrack("descriptions", "Descriptions - en", "en");
cue = new TimedTrackCue(1, "00:00:00.000", "00:00:20.000", "Hello new description text");
track.addCue(cue);
Slides after here describe how audio descriptions work, not text descriptions.
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description can be created by human or TTS
Video resource has multiple tracks:
Tracks are activated based on user preferences
Tracks are exposed in JavaScript
NOT IN SPEC YET
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description can be created by human or TTS
Tracks are activated based on user preferences
Tracks are exposed in JavaScript
NOT IN SPEC YET
<video poster="video.png" controls>
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
<track ref="#description" label="description" srclang="en">
</video>
<audio id="description">
<source src="description.mp3" type="audio/mp3">
<source src="description.ogg" type="audio/ogg">
</video>
<track> element synchronizes external resource
| Function | Burnt-in solution | In-band solution | External solution | Dynamic solution |
|---|---|---|---|---|
| (Extended) Audio Description | Mixed into main audio track | Extra audio track in main resource | Separate audio resource | Separate audio snippets |
| (Extended) Text Description | [TTS mixed into main audio track] | Extra text track in main resource | Separate text resource | Separate text snippets |
Audio description can be created by human or TTS
They are then scheduled through JavaScript calls
NOT IN SPEC YET