Sample files for testing media playback and seeking

Playback bugs hide in how a file is laid out and served as much as in its codec. These files separate the two: the same kind of video in a different order, a different codec, a missing track, a second rendition. All of them are served with byte-range support and open CORS, so a player on any origin can seek them.

Where the index sits

https://loremfile.dev/mp4/720p-5s.mp4 · 2 MB (1,974,574 bytes) · video/mp4 · 1280x720 · 5 s · h264 · High · level 3.1 · aac · 48 kHz · 1 channel

The index (moov) comes before the media (mdat), so a player can start and seek after fetching the first bytes.

https://loremfile.dev/mp4/non-faststart-720p-5s.mp4 · 2 MB (1,974,574 bytes) · video/mp4 · 1280x720 · 5 s · h264 · High · level 3.1 · aac · 48 kHz · 1 channel · moov at the end

The same resolution, duration and codecs with moov at the end. A progressive player has to reach the end of the file before it can play, which a range request does quickly and a server without range support turns into a full download.

Seeking and range requests

https://loremfile.dev/mp4/50mb.mp4 · 50.1 MB (50,081,140 bytes) · video/mp4 · 1280x720 · 120 s · h264 · High · level 3.1 · aac · 48 kHz · 1 channel

Two minutes of 720p, large enough that a seek which downloads from the start shows plainly in the network panel.

https://loremfile.dev/mp3/sine-440hz-30s.mp3 · 480.8 KB (480,788 bytes) · audio/mpeg · 30.024 s · mp3 · 48 kHz · 2 channels

Thirty seconds of MP3 with a Xing header, so a seek by time lands where it should rather than where an estimate from the file size puts it.

https://loremfile.dev/bin/incrementing-1mb.bin · 1 MB (1,000,000 bytes) · application/octet-stream

Bytes 00 to FF repeating, with no decoder in the way. The first byte of a range response is the requested offset modulo 256, so an off-by-one range shows at once.

Codecs and tracks

https://loremfile.dev/mp4/h264-baseline-720p-5s.mp4 · 2.1 MB (2,085,508 bytes) · video/mp4 · 1280x720 · 5 s · h264 · Constrained Baseline · level 3.0 · aac · 48 kHz · 1 channel

H.264 in the constrained profile that older devices and some hardware decoders need. The profile and level above are read from the stream, not from the encoder settings.

https://loremfile.dev/webm/720p-5s-vp9.webm · 621.2 KB (621,241 bytes) · video/webm · 1280x720 · 5.008 s · vp9 · Profile 0 · opus · 48 kHz · 1 channel

VP9 video with Opus audio in WebM, the royalty-free pair: the file for testing what a player does when it is handed something other than H.264.

https://loremfile.dev/mp4/no-audio-720p-5s.mp4 · 1.9 MB (1,890,893 bytes) · video/mp4 · 1280x720 · 5 s · h264 · High · level 3.1

No audio track at all. Code that builds an audio graph or shows a volume control without checking fails here, or shows a control that does nothing.

https://loremfile.dev/mp4/vertical-1080x1920-5s.mp4 · 4.3 MB (4,286,625 bytes) · video/mp4 · 1080x1920 · 5 s · h264 · High · level 4.0 · aac · 48 kHz · 1 channel

Portrait video. Players and thumbnailers that assume landscape crop it or shrink it into a strip.

https://loremfile.dev/wav/sine-440hz-3s-48k-24bit-stereo.wav · 864.1 KB (864,068 bytes) · audio/wav · 3 s · pcm_s24le · 48 kHz · 2 channels

24-bit audio behind a 68-byte header. A player that skips a fixed 44 bytes plays the end of the header as audio.

https://loremfile.dev/opus/30s.opus · 431.6 KB (431,592 bytes) · audio/opus · 30.006 s · opus · 48 kHz · 2 channels

Opus decodes at 48 kHz whatever rate the source had. A player or analyser that expects the original rate back gets the duration or the pitch wrong.

Adaptive streaming

https://loremfile.dev/hls/multi-bitrate/master.m3u8 · 244 bytes · application/vnd.apple.mpegurl · 2 renditions · 640x360 and 1280x720

Two renditions, 360p and 720p, each with a BANDWIDTH measured from its segments. Throttle the connection and an adaptive player should step down to 360p, then back up when it recovers.

The same files sit with the rest of their formats on MP4, WebM, HLS and WAV.