Stream catalogue
Four streams, three renditions each, plus one long asset. Encoder settings are listed so a result here can be compared against your own pipeline.
Ladder
| Rendition | Resolution | Video | Audio | H.264 profile |
|---|---|---|---|---|
| 360p | 640 × 360 | 800 kbps | 96 kbps | High @ L3.0 |
| 720p | 1280 × 720 | 2500 kbps | 128 kbps | High @ L3.1 |
| 1080p | 1920 × 1080 | 5000 kbps | 128 kbps | High @ L4.0 |
Rate control is capped VBR: -b:v equal to
-maxrate with a two-second buffer, so a rendition never exceeds
its advertised bandwidth. Playlists carry the codec string read back from the
encoded file rather than an assumed one, which matters for players that refuse
a rendition whose declared level looks too high.
GOP structure
Closed GOP, 60 frames, scene-cut detection disabled. Segment boundaries therefore land on keyframes at every rendition, which is what makes the renditions switchable mid-playback.
-g 60 -keyint_min 60 -sc_threshold 0
HLS segments are four seconds, packaged as fragmented MP4 rather than transport stream. If you specifically need MPEG-TS segments, open an issue — it is a packaging change, not a re-encode.
The patterns
timecode
ffmpeg's testsrc2 at 30 fps: colour bars, a moving element and
an on-screen frame counter. The counter is the point — if a player drops or
duplicates frames, or if audio drifts from video, it is visible without
instrumentation.
gradient
Slowly rotating smooth gradients at 30 fps. Smooth ramps are where banding appears first, so this catches a transcode that has quietly reduced effective bit depth or applied aggressive quantisation.
motion
testsrc2 at 60 fps. High temporal complexity at double the
frame rate: useful for finding the point where an encoder, a decoder or a link
stops keeping up.
sustained
A single long 1080p file. Short clips finish before congestion control has finished ramping, so they cannot tell you much about sustained throughput, resume behaviour or how a cache handles a large object. This one can.
Audio
A 440 Hz sine at 48 kHz, stereo, AAC-LC. Deliberately boring: it exists so that A/V sync can be measured and so that players which mishandle a missing audio track are not accidentally excluded.
Reproducing the library
The generator is in the repository. It takes no inputs beyond ffmpeg itself, so the output is reproducible on any machine:
./tools/make-assets.sh ./media
Durations are configurable with ASSET_DURATION and
ASSET_LONG_DURATION. Nothing is downloaded and no third-party
footage is involved, which is why the content can be CC0.