Back to contents·The Bitstream·Vol.1GitHub

Every media file carries its own dossier — duration, codecs, dimensions, rotation, bitrate, cover art, even the GPS point your phone quietly wrote into it. Mediabunny reads it all by touching only the bytes that matter, so a 5 GB file answers as fast as a 5 MB one. Drop one in and watch the byte counter; nothing is ever uploaded.

Fig. 03 — The Lab ReportReady
Source— drop a file —
EngineMediabunny
Bytes read
Drop a file — or click
MP4 · MOV · MKV · WEBM · MPEG-TS · MP3 · WAV · OGG · FLAC — stays on your device
Bring your biggest file. 5 GB inspects as fast as 5 MB.
Duration, codecs, bitrate, rotation, cover art, VFR, GPS leaks, truncation — read from the header bytes alone, even on a 5 GB file.
Fig. 04 — Why Mediabunnyvs the usual alternatives
Live — measured on your file, just now

Inspect a file above and these fill with real numbers from your own device — bytes read, percentage of the file touched, and time to the full report. No synthetic benchmark.

Mediabunny vs the usual ways to read metadata
Mediabunnymediainfo.jsServer ffprobe<video> element
Where it runsYour browser · zero WASMYour browser · WASMYour serverYour browser
Download to start~156 KB gz ¹~2.6 MB wasm ²0 · built-in
Uploads your file?NoNoYes — the whole fileNo
A 5 GB filems — reads only header bytesOK — chunked readsUpload first (~13 min ³)Loads, but tells you little
What you getDuration, codecs, fps + VFR, bitrate, rotation, HDR, tags, cover art, GPS check, truncation probeVery deep field listEverything ffprobe knowsDuration + dimensions only
Can-decode checkYes — and it decodes a real frame to prove itNoNocanPlayType() guesses
CostFreeFree$ server timeFree

¹ Full library, gzipped, before tree-shaking — same measurement as the Convert demo; a metadata-only import is far smaller. ² MediaInfoModule.wasm 0.3.7 as served by unpkg, 2,565,723 bytes, measured 2026-06-11. ³ Uploading 5 GB at 50 Mb/s — arithmetic, your connection may differ. Remaining cells are qualitative.

The receipt is live: the counter and the strip above are wired to the exact byte ranges Mediabunny requested from your file.
The source — the entire inspector, nothing hidden
Fig. 03a — Files
inspect-demoread-only
Fig. 03b — CodeTS
inspect-demo/src/inspect.ts
1import { Input, ALL_FORMATS, BlobSource } from 'mediabunny';
2import { describeTrack } from './tracks';
3import { tailProbe, privacyScan } from './analysis';
4import { makePoster } from './poster';
5 
6// Inspect any media file — reading only the bytes it needs.
7export async function inspect(file) {
8 let bytesRead = 0; // the receipt — watch how little gets read
9 const source = new BlobSource(file);
10 source.onread = (start, end) => { bytesRead += end - start; };
11 
12 const input = new Input({ source, formats: ALL_FORMATS });
13 try {
14 const tracks = await input.getTracks();
15 const report = {
16 format: (await input.getFormat()).name, // container
17 mimeType: await input.getMimeType(), // full codec string
18 duration: await input.computeDuration(), // seconds
19 tags: await input.getMetadataTags(), // title, cover art…
20 tracks: await Promise.all(tracks.map(describeTrack)),
21 };
22 report.integrity = await tailProbe(input, tracks, report.duration);
23 report.poster = await makePoster(tracks); // decode before dispose
24 report.privacy = privacyScan(report.tags); // GPS, device, dates
25 report.bytesRead = bytesRead; // vs. file.size
26 return report;
27 } finally {
28 input.dispose(); // frees demuxer state + pending reads
29 }
30}
The real source — click any file on the left. This exact code produced the report above. No WASM, no server, no upload.