Codecs and encoding
Everything is H.264 High profile with AAC-LC. Not because that is modern, but because it is the one combination that plays everywhere without a caveat, which is what a reference asset needs to be.
The ladder
| Rendition | Resolution | Video | Audio | Announced |
|---|---|---|---|---|
| 360p | 640×360 | 800 kbit/s | 96 kbit/s | 896 kbit/s |
| 720p | 1280×720 | 2500 kbit/s | 128 kbit/s | 2628 kbit/s |
| 1080p | 1920×1080 | 5000 kbit/s | 128 kbit/s | 5128 kbit/s |
Rate control
Each rendition is encoded with the target, the maximum and the buffer tied together:
-b:v 2500k -maxrate 2500k -bufsize 5000k
That is a capped stream rather than an average one. An average-bitrate file
can exceed its nominal rate for seconds at a time, which is precisely when an
ABR player misjudges its buffer and switches down. Here the announced
BANDWIDTH is a real ceiling, so if your player stalls the cause is
on your side of the wire.
GOP structure
| Keyframe interval | 60 frames, fixed |
|---|---|
| Minimum interval | 60 frames — no early keyframes |
| Scene detection | disabled |
| Pixel format | yuv420p |
Scene-cut detection is off so that keyframes land at predictable positions. With it on, the encoder inserts extra keyframes wherever the picture changes sharply, segment boundaries stop aligning across renditions, and an ABR switch produces a visible jump that looks like a player bug but is not one.
At 30 fps a 60-frame GOP is two seconds, so the four-second HLS segments contain exactly two GOPs and every segment starts on a keyframe. At 60 fps the same GOP is one second and a segment holds four.
Audio
A 440 Hz sine tone at 48 kHz, stereo, AAC-LC. It is deliberately dull: the point is that any dropout, resampling artefact or channel swap is obvious against a constant tone, where it would hide inside music.
Container
MP4 written with faststart, which moves the moov atom ahead of
the media data. Without it a progressive download has to finish before playback
can begin, and half the point of a test file is gone.
Regenerating the assets from
tools/make-assets.sh reproduces them byte for byte given the same
ffmpeg build. Different ffmpeg versions will differ; that is why checksums are
published per release rather than promised across releases.