Multi-Track Subtitles — Embedded WebVTT (WebM)
WebVTT muxed inside a WebM container, which the Matroska specification allows and almost nothing consumes. No browser surfaces an embedded WebVTT track through the HTML TextTrack API — the web platform expects a separate <track> element pointing at a sidecar file — so this is the fixture for the gap between what a container is permitted to hold and what a player will actually give you. One caveat about this file specifically. Every other fixture in this phase carries byte-identical H.264 video, but the WebM muxer accepts only VP8, VP9 or AV1 video and WebVTT subtitles — that restriction is the container's definition, not a limitation of the tooling — so the picture here is re-encoded to VP9 from the same source frames. Same content, different bytes.
Specifications
- Subtitle Tracks
- 1
- Subtitle Codec
- WebVTT (D_WEBVTT/SUBTITLES)
- Video Codec
- VP9 — re-encoded, not remuxed like the rest of this group
- Browser Support
- no browser exposes embedded WebVTT tracks natively
- Cues
- 8
- Duration
- 8s
What is a .webm file?
WebM is an open, royalty-free multimedia container based on Matroska, designed for the web and typically carrying VP8 or VP9 video with Vorbis or Opus audio. It is natively supported by modern browsers via HTML5 video. It targets efficient, license-free web streaming.
How to use this file
Use an example WebM to test HTML5 <video> playback, Matroska-based demuxing, VP8/VP9 decoding, and converters between WebM and MP4.
How to use this file for testing
“Multi-Track Subtitles — Embedded WebVTT (WebM)” is a deterministic Novus Examples fixture for Media accessibility, Subtitle testing, Subtitle parsing, Video QA. Containers carrying several subtitle and audio tracks at once, with real language tags and the default, forced, hearing-impaired and visual-impaired flags actually set — for testing track pickers, accessibility menus, and the flag handling that only shows up when more than one track exists.
Documented properties for this file: 8 cues · 8s. Compare results against paired or grouped companions on this page when present (clean↔damaged, searchable↔scanned, or format twins) so scores stay reproducible across runs.
Download the file once, keep the path stable in CI or local scripts, and treat the spec table as the contract: dimensions, seeds, field lists, and roles are intentional. Corrupt or invalid samples are labelled as such — expect parsers to fail loudly rather than silently accept them.
Media fixtures are short and synthetic by design. Prefer waveform or transcript ground truth in the same group when measuring ASR, trim, upscale, or sync tools; do not assume broadcast-quality masters.
Code examples
<video controls preload="metadata" width="640" src="webm-webvtt.webm"></video>Related files
- mkvMulti-Track — Complete Package (MKV)Everything this phase covers in one file: two audio languages, three subtitle tracks including SDH, four chapters, an attached cover image and container tags — with every language tag and disposition set correctly. This is the integration test. The individual fixtures in the other groups isolate one variable each, which is what you want when something breaks; this is what you point a player, a track picker or a transcoder at first, because a pipeline that handles it handles all of them. Round-trip it through your tool and diff the track list: dropped dispositions, collapsed languages and vanished attachments all show up immediately.

- mp4Multi-Track — Complete Package, MP4 Limits (MP4)The same package rebuilt inside MP4, which is the interesting part — MP4 cannot carry all of it. The SDH subtitle track is gone because MP4 has no hearing-impaired flag, the attachment becomes cover art as a second video stream, per-track titles have no home, and the subtitles are mov_text with the styling stripped. Diff this against the MKV in the same group and you have a concrete, byte-level answer to 'what do I lose converting to MP4?' — which is normally something people find out after shipping.

- mkvMulti-Track — Declared but Empty Subtitle Track (MKV)A second subtitle track that is properly declared, correctly language-tagged, and contains no cues at all. This is what an incomplete localisation looks like in a real library: the track exists so the menu offers Spanish, and choosing it produces silence. Track enumeration finds it. Language listing finds it. Only counting the cues finds the problem — which is why 'does this file have Spanish subtitles?' is the wrong question and 'does the Spanish track have any content?' is the right one.

- mkvMulti-Track — Eight Subtitle Tracks (MKV)Eight subtitle tracks across four writing systems, including right-to-left Arabic, each with its own language tag and a track title in its own script. Two things break here that never break with two tracks. Track-picker UI: eight entries is where a fixed-height menu, a truncating label or a hardcoded array bound starts to show. And text rendering: the track titles themselves are non-Latin, so a picker that draws labels with a Latin-only font produces a menu of empty boxes even though every track is perfectly valid.

- mkvMulti-Track — Language Tags Swapped (MKV)Two subtitle tracks whose language tags are swapped: the track tagged `fra` contains English cues and the one tagged `eng` contains French. Nothing about the file is malformed — every byte validates, every tag is a legal ISO 639-2 code. This is the failure no schema check can catch and no player can warn about. Selecting French gives you English, and the only way to detect it is to read the cue text and run language identification on it. If you are building QC for a subtitle library, this is the case worth having a fixture for, because it is common and it is invisible.

- mkvMulti-Track — No Default Flag Anywhere (MKV)Three subtitle tracks and not one of them flagged default. Matroska permits this and players disagree completely about what to do: some pick the first track, some pick by system language, some show nothing at all and leave the viewer to find the menu. There is no right answer to assert here — the value is that the disagreement is reproducible. If your player picks a track, this file tells you which rule it is using.

Generated by generation/video_accessibility.py. Free for any use, no attribution required — license.