Skip to content
Novus Examples

HLS and DASH manifest fixtures

HLS playlists and DASH MPDs covering multi-bitrate ladders, byte-range addressing, and segment templates. Served inline with permissive CORS under /files/stream/, so a player can load them from any origin without re-hosting.

49 of 49 files
Preview of HLS — Master Playlist With a Three-Rung Ladder
m3u8
667 B

HLS — Master Playlist With a Three-Rung Ladder

An HLS master playlist declaring a three-rung bitrate ladder plus a subtitle rendition group, with the CODECS, RESOLUTION and FRAME-RATE attributes a player needs to choose a rung before fetching anything. Served inline with permissive CORS from /files/stream/, so a player on another origin can load it directly. This is a manifest-parsing fixture — it describes the ladder rather than shipping its segments.

Preview of HLS — CMAF Media Playlist
m3u8
255 B

HLS — CMAF Media Playlist

A VOD media playlist in CMAF form: an EXT-X-MAP initialisation segment followed by four fragmented-MP4 segments and an explicit ENDLIST. The final segment is deliberately short, as a real encode's last segment usually is. Tests target-duration handling, init-segment fetching, and correct total-duration arithmetic. A manifest-parsing fixture — the segments themselves ship with the streaming phase.

Preview of HLS — Byte-Range Addressed Single File
m3u8
305 B

HLS — Byte-Range Addressed Single File

Every segment is a byte range of one backing file rather than a separate download, which is how low-overhead VOD packaging avoids thousands of small objects. The /files/stream/ headers expose Content-Range and Accept-Ranges cross-origin precisely so a player can do this from another origin. Tests Range request construction and offset arithmetic.

Preview of DASH — Static MPD With a Segment Template
mpd
1.5 KB

DASH — Static MPD With a Segment Template

A DASH manifest with separate video and audio adaptation sets, three video representations, and $RepresentationID$/$Number$ segment-template addressing — the standard VOD packaging shape. Served inline as application/dash+xml with permissive CORS, so dash.js can load it cross-origin. A manifest-parsing fixture: it describes segment URLs rather than shipping the segments.

Preview of VAST 4.2 — Inline Linear Ad Response
xml
1.8 KB

VAST 4.2 — Inline Linear Ad Response

A complete VAST 4.2 inline response for a linear pre-roll: two progressive MP4 media files at different bitrates, quartile tracking, an impression beacon and a click-through. Every URL points at the reserved example.invalid domain, so nothing can ever be fetched and no real ad server is contacted. For testing VAST parsing and player integration without a live ad stack.

Preview of VAST 4.2 — Wrapper (Redirect) Response
xml
896 B

VAST 4.2 — Wrapper (Redirect) Response

A VAST wrapper — a response that carries no media of its own, only a VASTAdTagURI pointing at another VAST document plus its own tracking beacons that must be fired in addition to the resolved ad's. Wrapper chains are where real ad integrations break: unbounded redirect depth, timeouts, and tracking dropped part-way down the chain. Pairs with the inline response it nominally redirects to.

Preview of VMAP 1.0 — Pre-, Mid- and Post-Roll Schedule
xml
1 KB

VMAP 1.0 — Pre-, Mid- and Post-Roll Schedule

A VMAP playlist scheduling three linear ad breaks — pre-roll at start, mid-roll at eight seconds, and post-roll at end — each pointing at a VAST tag. VMAP describes WHEN breaks occur while VAST describes WHAT plays in them. The mid-roll offset lines up with the period boundary in the multi-period DASH manifest, so the two can be tested together.

Preview of SCTE-35 — Splice Insert (Break Start)
xml
528 B

SCTE-35 — Splice Insert (Break Start)

An SCTE-35 splice_insert as XML: the cue that tells a downstream packager a linear ad break starts. outOfNetworkIndicator marks entry into the break, ptsTime is 8 seconds on the 90 kHz PTS clock, and the 30-second break auto-returns. This is the signal a manifest manipulator converts into an HLS EXT-X-CUE-OUT or a new DASH period.

Preview of SCTE-35 — Time Signal With Segmentation Descriptor
xml
801 B

SCTE-35 — Time Signal With Segmentation Descriptor

The modern SCTE-35 form: a time_signal command carrying a segmentation descriptor rather than a bare splice_insert. Type 34 marks a provider placement opportunity start, and the delivery restrictions declare that this break may not be filled for web delivery — the field that ad-insertion logic is supposed to honour and frequently ignores. Includes a base64 UPID identifying the content.

Preview of VTT — X-TIMESTAMP-MAP for HLS Sync
vtt
216 B

VTT — X-TIMESTAMP-MAP for HLS Sync

A WebVTT segment carrying X-TIMESTAMP-MAP, the header HLS uses to align caption times with the MPEG-TS presentation clock. Cue times are relative to the map rather than to the file, so a player that ignores the header renders every caption ten seconds early. Invisible in a text editor and a classic cause of 'captions are out of sync' reports.

Preview of HLS — Segmented WebVTT Caption Playlist
m3u8
205 B

HLS — Segmented WebVTT Caption Playlist

The subtitle rendition the master playlist references through EXT-X-MEDIA. Captions in HLS are segmented like media — each segment is a small WebVTT file covering its own time window, carrying X-TIMESTAMP-MAP to align with the MPEG-TS clock. Completes the master playlist's declared rendition group so a player can resolve the whole tree.

Preview of HLS — Ad Break With Discontinuity Markers
m3u8
394 B

HLS — Ad Break With Discontinuity Markers

A media playlist with a mid-roll spliced in: EXT-X-CUE-OUT opens the break, EXT-X-DISCONTINUITY marks each boundary, and a fresh EXT-X-MAP re-initialises the decoder on both sides. This is what a packager produces from the SCTE-35 splice_insert fixture in this wave. Discontinuities are where players most often stall, because the timeline and the decoder both have to be reset.

Preview of HLS — Low-Latency Partial Segments
m3u8
468 B

HLS — Low-Latency Partial Segments

A Low-Latency HLS playlist: half-second EXT-X-PART fragments published ahead of their parent segment, a preload hint for the part still being written, and EXT-X-SERVER-CONTROL advertising blocking playlist reload. There is deliberately no ENDLIST, because this is a live playlist. Tests parsers against the LL-HLS tags, which are frequently unimplemented and must at minimum be ignored safely.

Preview of HLS — I-Frame Only Playlist for Trick Play
m3u8
320 B

HLS — I-Frame Only Playlist for Trick Play

An I-frame-only playlist: each entry is a byte range covering a single keyframe inside the media file, which is how players render scrub previews and fast-forward without decoding every frame. Declared in a master playlist via EXT-X-I-FRAME-STREAM-INF. Tests that a parser distinguishes these from normal media playlists — playing one as ordinary media produces a stuttering slideshow.

Preview of DASH — Explicit SegmentList Addressing
mpd
750 B

DASH — Explicit SegmentList Addressing

The same content addressed with an explicit SegmentList — every segment URL enumerated rather than derived from a template. Verbose, but it is what older packagers emit and it permits non-uniform segment naming. A DASH client must support both this and SegmentTemplate; the paired template manifest in this group is the direct contrast.

Preview of DASH — Dynamic (Live) Manifest With a Time-Shift Buffer
mpd
805 B

DASH — Dynamic (Live) Manifest With a Time-Shift Buffer

A live DASH manifest: type is dynamic, there is no total duration, and the client must compute which segment is currently available from availabilityStartTime, the wall clock, and the segment duration. Declares a one-minute time-shift buffer and an eight-second presentation delay. The timestamps are fixed so the fixture stays deterministic — a real client will compute a segment number far in the future, which is itself a useful edge case to handle gracefully.

Preview of VAST 4.2 — Empty (No Ad) Response
xml
93 B

VAST 4.2 — Empty (No Ad) Response

A valid VAST document containing no Ad element — the correct response when an ad server has nothing to serve. It arrives as HTTP 200 with a well-formed body, so it is not an error condition, and a player must resume content immediately rather than waiting for a timeout. Frequently mishandled: players stall on the break or log a spurious failure. The smallest meaningful VAST document there is.

Preview of VAST 3.0 — Linear Ad With Companion Banners
xml
1.3 KB

VAST 3.0 — Linear Ad With Companion Banners

A VAST 3.0 response pairing a linear spot with two companion banners in the standard IAB sizes, at the older schema version many ad servers still emit. Companions render alongside the video rather than in it, so they exercise a separate slot-matching path — the player has to find a matching container or correctly ignore them when required is none. All URLs point at example.invalid.

Preview of SCTE-35 — Splice Insert (Break End / Return to Network)
xml
472 B

SCTE-35 — Splice Insert (Break End / Return to Network)

The matching return cue for the break-start splice_insert in this group: the same spliceEventId with outOfNetworkIndicator false, signalling the feed is coming back from the ad break. It carries no BreakDuration because the return is explicit rather than automatic. Pairing start and end cues by event id is exactly what an ad-insertion implementation has to get right, and this is the pair to test it on.

Preview of DASH — Intentionally Corrupt: Malformed ISO 8601 Duration
mpd
514 B

DASH — Intentionally Corrupt: Malformed ISO 8601 Duration

An intentionally corrupt DASH manifest whose mediaPresentationDuration is the bare number 14.0 instead of the ISO 8601 form PT14.0S. The XML is well-formed, so it parses cleanly and only fails at schema validation — which most players skip. The usual result is a duration of zero or NaN and a seek bar that never populates, with no error anywhere.

Preview of VTT — Intentionally Corrupt: Malformed Cue Timestamp
vtt
210 B

VTT — Intentionally Corrupt: Malformed Cue Timestamp

An intentionally corrupt WebVTT file with timestamps that are not zero-padded — 00:00:3.000 and 00:1:03.000 where the grammar requires two digits. The third cue is well-formed. A strict parser drops the two bad cues; a lenient one accepts them; a regex-based one may match partially and produce a time that is wrong rather than rejected, which is the worst outcome of the three.

Preview of Thumbnail Track — Sprite Sheet
jpg
41.6 KB

Thumbnail Track — Sprite Sheet

A 6x2 sprite sheet of 160x90 scrub-preview thumbnails in a single JPEG. Players fetch one image rather than 12 separate requests, then crop each tile with a media fragment — which is why the WebVTT index in this group is the load-bearing half of the pair. Useless on its own; that is the point of shipping them together.

Preview of Thumbnail Track — WebVTT Sprite Index
vtt
931 B

Thumbnail Track — WebVTT Sprite Index

The WebVTT half of a scrub-preview pair: each cue covers a slice of the timeline and its payload is a media-fragment URL naming a rectangle of the sprite sheet. This is how seek-bar previews are delivered in practice, and the #xywh fragment syntax is the part players implement inconsistently — some resolve it relative to the VTT, others to the page, and some ignore the fragment entirely and show the whole sheet.

Preview of HLS VOD — CMAF Init Segment (init_0.m4s)
m4s
830 B

HLS VOD — CMAF Init Segment (init_0.m4s)

A CMAF initialisation segment: the moov box carrying codec configuration and track metadata, with no media samples. A player must fetch this before any media segment of the same rendition, and switching renditions mid-stream means fetching the new rendition's init first — the step ABR implementations most often get wrong.

Preview of HLS VOD — CMAF Init Segment (init_1.m4s)
m4s
830 B

HLS VOD — CMAF Init Segment (init_1.m4s)

A CMAF initialisation segment: the moov box carrying codec configuration and track metadata, with no media samples. A player must fetch this before any media segment of the same rendition, and switching renditions mid-stream means fetching the new rendition's init first — the step ABR implementations most often get wrong.

Preview of HLS VOD — CMAF Init Segment (init_2.m4s)
m4s
830 B

HLS VOD — CMAF Init Segment (init_2.m4s)

A CMAF initialisation segment: the moov box carrying codec configuration and track metadata, with no media samples. A player must fetch this before any media segment of the same rendition, and switching renditions mid-stream means fetching the new rendition's init first — the step ABR implementations most often get wrong.

Preview of HLS VOD — Master Playlist (Playable Package)
m3u8
370 B

HLS VOD — Master Playlist (Playable Package)

The entry point to a COMPLETE and genuinely playable HLS package: a 3-rung ladder (320x180 at 300 kbps, 480x270 at 700 kbps, 640x360 at 1400 kbps) with real CMAF segments alongside it in this group. Point hls.js or Safari at this URL and it plays — it is served inline with permissive CORS from /files/stream/, so it works cross-origin without re-hosting. Unlike the hand-authored HLS fixtures elsewhere in the catalog, which are parser tests that reference placeholder segment names on purpose, everything this playlist references actually exists.

Preview of HLS VOD — Media Playlist (0)
m3u8
205 B

HLS VOD — Media Playlist (0)

One rendition of the playable HLS ladder, listing its own CMAF init segment and media segments. Referenced by the master playlist in this group. Generated by ffmpeg's own HLS muxer, so the segment durations, the EXT-X-MAP and the ENDLIST are exactly what a real packager emits rather than what a human thinks one emits.

Preview of HLS VOD — Media Playlist (1)
m3u8
205 B

HLS VOD — Media Playlist (1)

One rendition of the playable HLS ladder, listing its own CMAF init segment and media segments. Referenced by the master playlist in this group. Generated by ffmpeg's own HLS muxer, so the segment durations, the EXT-X-MAP and the ENDLIST are exactly what a real packager emits rather than what a human thinks one emits.

Preview of HLS VOD — Media Playlist (2)
m3u8
205 B

HLS VOD — Media Playlist (2)

One rendition of the playable HLS ladder, listing its own CMAF init segment and media segments. Referenced by the master playlist in this group. Generated by ffmpeg's own HLS muxer, so the segment durations, the EXT-X-MAP and the ENDLIST are exactly what a real packager emits rather than what a human thinks one emits.

Preview of DASH VOD — Manifest (Playable Package)
mpd
2.2 KB

DASH VOD — Manifest (Playable Package)

A complete, playable MPEG-DASH manifest for the same 320x180 at 300 kbps, 480x270 at 700 kbps, 640x360 at 1400 kbps ladder as the HLS package, produced from the same encoder run — so the two can be compared directly as packaging rather than as content. Every segment it references exists in this group. Served inline as application/dash+xml with permissive CORS, so dash.js can load it cross-origin.