Compress a video to 8 MB
Compress a video to 8 MB?
At 8 MB, a one-minute clip has about 1 Mbps for video and audio together. This page has the arithmetic for other lengths and the results of ten runs of the in-browser compressor with an 8 MB target, including the runs that missed it.
Last updated
At 8 MB, a one-minute clip has about 1 Mbps for video and audio together. This page has the arithmetic for other lengths and the results of ten runs of the in-browser compressor with an 8 MB target, including the runs that missed it.
Browser runs measured 18 October 2026. FFmpeg size-cap runs measured 28 October 2026.
What 8 MB allows
The size of a video file is its average rate multiplied by its length. Only the length is fixed by the clip, so the target size decides the rate and the rate decides how much picture detail survives.
A 15 second clip can keep a rate that looks fine at 1080p. A 5 minute clip at 8 MB gets under 200 kbps for the picture, which is below what any resolution above 480p needs to stay watchable. The table gives the rate for each length.
| Clip length | Video rate that fits | Highest tier whose floor it meets |
|---|---|---|
| 15 s | 4,256 kbps | 4K |
| 30 s | 2,064 kbps | 1080p |
| 1 min | 968 kbps | 720p |
| 2 min | 420 kbps | 480p |
| 5 min | 91 kbps | below 480p |
| 10 min | none left | 128 kbps of audio alone fills the target |
| 20 min | none left | 128 kbps of audio alone fills the target |
The rate column is the compressor's own bitrateFromTargetSize function for 8 MB (1 MB = 1,048,576 bytes), assuming 128 kbps of audio is kept and 2% container overhead. The tier column compares that rate with the floor table in the compressor's constants.js: 1.2 Mbps for 1080p, 0.7 for 720p, 0.35 for 480p. The floors are this site's rule of thumb for watchable output, not a standard.
What the compressor produced at 8 MB
The browser table below comes from one run set on 2026-10-18: the live /tools/video-compressor/ page driven by headless Chrome/154.0.8037.92 on 13th Gen Intel(R) Core(TM) i9-13900K (32 threads, 126 GB RAM, Linux 7.0.0-34-generic), software WebCodecs with no GPU. The sources are synthetic files made with ffmpeg (ffmpeg version 6.1.1-3ubuntu5): a test pattern, with temporal noise added where the label says noisy, plus a 48 kHz sine tone. They are not camera footage. Outputs were saved through the page's Save button and measured with ffprobe. The raw records are in the repository at docs/evidence/runs/2026-10-18-video-target-runs.json. A phone or a machine with a hardware encoder can land at different sizes, and that was not measured.
| Source clip | Setting | Output vs target | Format, size | Average rate, whole file | Encode time |
|---|---|---|---|---|---|
| 1080p30, 60 s, noisy synthetic source 54.1 MB | Balanced, original size | 15.3 MB, over by 91% | MP4 H.264/AAC, 1920×1080 | 2.14 Mbps | 5 s |
| 1080p30, 60 s, noisy synthetic source 54.1 MB | Smallest preset | 8.6 MB, over by 8% | WebM VP9/Opus, 1920×1080 | 1.21 Mbps | 9 s |
| 1080p30, 60 s, noisy synthetic source 54.1 MB | Balanced, 720p | 7.6 MB, under | MP4 H.264/AAC, 1280×720 | 1.06 Mbps | 12 s |
| 1080p30, 60 s, noisy synthetic source 54.1 MB | Balanced, 480p | 7.6 MB, under | MP4 H.264/AAC, 852×480 | 1.06 Mbps | 21 s |
| 1080p30, 180 s, clean synthetic source 125.4 MB | Balanced, original size | 43.0 MB, over by 438% | MP4 H.264/AAC, 1920×1080 | 2.01 Mbps | 11 s |
| 1080p30, 180 s, clean synthetic source 125.4 MB | Smallest preset | 19.6 MB, over by 146% | WebM VP9/Opus, 1920×1080 | 0.92 Mbps | 31 s |
| 1080p30, 180 s, clean synthetic source 125.4 MB | Balanced, 720p | 12.2 MB, over by 53% | MP4 H.264/AAC, 1280×720 | 0.57 Mbps | 35 s |
| 1080p30, 180 s, clean synthetic source 125.4 MB | Balanced, 480p | 8.1 MB, over by 1% | MP4 H.264/AAC, 852×480 | 0.38 Mbps | 70 s |
| 720p30, 120 s, noisy synthetic source 50.6 MB | Balanced, original size | 12.8 MB, over by 60% | MP4 H.264/AAC, 1280×720 | 0.90 Mbps | 4 s |
| 720p30, 120 s, noisy synthetic source 50.6 MB | Smallest preset | 9.9 MB, over by 24% | WebM VP9/Opus, 1280×720 | 0.69 Mbps | 8 s |
Reading the table
Balanced at the original resolution did not get below about 2 Mbps on the two 1080p clips. The 60 second noisy clip came out at 15.3 MB and the 180 second clip at 43.0 MB, although the page showed an 8 MB estimate before the run. The page flagged both as over target after the run, so the result card is the number to trust, not the estimate.
Lowering the output resolution is what brought the 60 second clip to 7.6 MB at 720p, under 8 MB. The 180 second clip needed 480p and still ended at 8.1 MB, about 1% over. At 720p it was 12.2 MB. For a clip that long, 8 MB means cutting it or accepting a soft picture at 480p.
The Smallest preset gets closer than Balanced at full size (8.6 MB on the 60 second clip) but it writes WebM. The Smallest preset wrote WebM (VP9 video, Opus audio) in every run, not MP4. Check that the app you send to accepts WebM before you choose it.
FFmpeg two-pass files against 8,000,000 and 8,388,608 bytes
On 28 October 2026, ffmpeg version 6.1.1-3ubuntu5 on 13th Gen Intel(R) Core(TM) i9-13900K (Linux 7.0.0-38-generic x86_64) encoded one synthetic source, then two-pass libx264 files with AAC audio at 128k and preset medium. The source is lavfi testsrc2 at 1920×1080, 30 fps, 60 seconds, plus a 440 Hz sine, libx264 veryfast at 8000k, AAC at 160k, and +faststart. ffprobe reports 60 seconds, 1920×1080 H.264 at 8,004,566 bps, and AAC at 153,807 bps. The file is 61,252,959 bytes, SHA-256 1b690c37e69e07279073be5cb797a1e9f87017c1fea8da64d9e47e7d27a66377. The size-cap outputs use no -pix_fmt and no +faststart. Read any finished file with wc -c. The records are in docs/evidence/runs/2026-10-28-size-cap-encodes.json.
Linuxize's ffmpeg compression guide, published 26 October 2026 and read on 28 October 2026, gives the decimal formula video kb/s = (target MB × 8000 / seconds) − audio kb/s, with 1 MB = 1,000,000 bytes. Their worked example reserves 5 percent and uses preset slow on a different file (wc -c printed 633,456,993 and 94,991,697). They say two-pass encoding targets an average bitrate, and if the file is slightly over the cap, lower the video rate a few percent and run both passes again. Rendobar's target-size post, read the same day, publishes (10 * 8192) / 60 - 128 = 1237 for a 60 second file and prints no output byte count for that command. 8192 kbit is 1 MiB. The 8 MiB form of that command is the 964k row below. Compresto's 8 MB use-case page says "Typical output: 45 MB clip → 7.9 MB MP4 (720p)" and "Platform limit: 8 MB (Discord Free)". Duration, byte count, and hash are absent there. The Discord figure this site records is on Video size limits by platform.
| Video rate | Formula | Bytes | Against 8,000,000 | Against 8,388,608 | Probed video bps | Wall | SHA-256 |
|---|---|---|---|---|---|---|---|
938k | (8 * 8000 / 60) - 128 = 938.666, rounded down to 938k. Decimal megabytes, 1 MB = 1,000,000 bytes. Linuxize target-size formula with no 5% reserve. | 7,947,542 | under by 52,458 | under by 441,066 | 923,244 | 9.427 s | 23d22238bbd76c2afe8bff12e8cee55fa91057ce37c0d83d402ad4a0f067073d |
885k | 5% reserve on an 8,000,000 byte target is 7,600,000 bytes. (7.6 * 8000 / 60) - 128 = 885.333, rounded down to 885k. | 7,475,199 | under by 524,801 | under by 913,409 | 860,265 | 9.679 s | 00b641e486d0b9e401053f3c3d90c345ac97d15a7d3d7eb4dc80ff6015e5b6ad |
964k | (8 * 8192 / 60) - 128 = 964.266, rounded down to 964k. 8192 kbit = 1 MiB. Rendobar's 10 MiB example uses this form. | 8,134,630 | over by 134,630 | under by 253,978 | 948,189 | 9.466 s | ff016975a4855e041da9eac2e7da2ce9cdc60f42db0bbcc903444003dd8fba76 |
Every output in the table is smaller than the 61,252,959 byte source. The 938k file is 7,947,542 bytes, probed video 923,244 bps, duration 60.01 seconds, audio 128,080 bps. The 964k file is 8,134,630 bytes: over a decimal 8 MB cap and under an 8 MiB cap. The 885k file, a 5 percent reserve on 8,000,000 bytes, is 7,475,199 bytes.
A routine that works
Open the compressor with the 8 MB target already filled in (Open the compressor with 8 MB preset), drop the file, and pick 720p in the resolution list before you press start for anything over about a minute. If the result card says the file is over the target, go one step down in resolution, or trim the clip first. Do not raise the target to make the message disappear: forms and apps that enforce 8 MB reject on the real byte count.
Encode times in the table run from 4 seconds to 70 seconds on this machine. Scaling down took longer than staying at the original size in these runs (the 60 second clip took 5 seconds at full size and 21 seconds at 480p), so budget for that on a laptop.
The MP4 files the compressor wrote still carry container tags (major_brand, minor_version, compatible_brands, creation_time). The creation_time value is the time of the encode, not of the original recording. For a file you plan to publish, run the output through Verify metadata removed and read Remove MP4 metadata.
Where 8 MB comes from
This page does not claim that a particular app limits uploads to 8 MB. Published caps for chat and mail apps, each with its source, are on Video size limits by platform. Several of them are larger than 8 MB, and for those you can leave more quality on the table by choosing a closer target.
The compressor hands the encoder a bitrate, which is the bitrate option (bits per second) and the bitrateMode option of the browser's VideoEncoder.configure(). The encoder treats it as a request, which is why the output can come out above it, as the table shows.
FAQ
Why did my 8 MB compression come out larger than 8 MB?
The compressor asks the encoder for a bitrate that fits, and the encoder can return more. In the runs above Balanced at 1080p wrote about 2 Mbps whatever was asked. Lower the resolution and run it again, and read the result card rather than the estimate.
Is 8 MB measured as 8,000,000 bytes?
On this site 1 MB is 1,048,576 bytes, so 8 MB in the browser table is 8,388,608 bytes. Linuxize's target-size formula uses 1,000,000. On the 28 October 2026 file, 964k wrote 8,134,630 bytes, which is over 8,000,000 and under 8,388,608. 938k wrote 7,947,542 bytes, under both.
How do I compress a 60 second video to 8 MB with ffmpeg?
On this 1920×1080 file, two-pass libx264 at 938k video and 128k AAC wrote 7,947,542 bytes in 9.427 seconds. ffprobe duration was 60.01 seconds. The same source at 964k wrote 8,134,630 bytes. Check the result with wc -c.
Does the video leave my computer?
No. The page encodes in the browser tab. The measured runs above were made with the file picker of a local browser and no network upload.
More tools
Video Compressor · Video size limits by platform · Video compression guide · Remove MP4 metadata · Verify metadata removed