Video Sıkıştırma
Bir boyut hedefleyin — Discord için 10 MB, e-posta için 25 MB — ya da yalnızca kaliteyi düşürün. Kendi makinenizde çalışır, bu yüzden ne boyut sınırı ne de kuyruk vardır.
Dosyayı sizin tarayıcınız okur ve yeniden kodlar. Hiçbir istek onu bir yere göndermez — bu sayfanın yükleme yapacağı bir sunucu yok.
Sorular
Gerçekten tam boyutu tutturuyor mu?
«Bir boyuta sığdır» kipi tam olarak bunun içindir. Bir dosyanın ağırlığı, bit hızının süreyle çarpımıdır; süre bilindiğinde gereken bit hızı aritmetikten ibarettir. Kodlayıcılar istenen bit hızına birebir uymaz — hız denetimi malzemeye göre kayar — bu yüzden ilk geçiş birkaç yüzdeden fazla saparsa, sapma ölçülür ve dosya düzeltilmiş değerle bir kez yeniden kodlanır. Pratikte hedefin birkaç yüzdesi içinde kalır.
Neden 10 MB, 16 MB, 25 MB?
Bunlar insanların gerçekten çarptığı duvarlar: 10 MB Discord'un ücretsiz yükleme sınırı, 16 MB WhatsApp, 25 MB Gmail ve çoğu e-posta sunucusu, 50 MB ise Discord Nitro Basic. Araç sınırın tam üstüne değil, hemen altına nişan alır; çünkü tam 10,0 MB'lık bir dosya, 10 MB sınırı tarafından yine reddedilir.
Hedef imkânsızsa ne olur?
Başlamadan önce söyler ve o video için en küçük dürüst boyutu bildirir. Bir saatlik görüntüyü 10 MB'a sıkıştırmak, hiçbir çözünürlüğün kaldıramayacağı bir bit hızı demektir: izlenemez bir dosya üretip buna başarı diyen bir araç, reddeden bir araçtan daha kötüdür.
Dosyam ne kadar küçülür?
Tahmin, siz hiçbir şeye basmadan önce ayarlardan ve süreden hesaplanır. Telefondan ya da kameradan yeni çıkmış görüntü genellikle gerekenin çok üstünde kaydedilir ve %60–90 küçülme olağandır. Bir kez sıkıştırılmış olanın verecek pek bir şeyi kalmamıştır; araç dosyanızı, çözünürlüğünün makul olarak gerektirdiğiyle karşılaştırır ve yeniden kodlamanın onu yalnızca büyüteceği durumlarda uyarır.
Videoyu asıl küçülten nedir?
Daha az piksel ve piksel başına daha az bit. Çözünürlük kaba ama güvenilir koldur: 4K'dan 1080p'ye inmek, kaliteden söz etmeye başlamadan önce piksellerin dörtte üçünü siler. Bit hızı ise kalanın ne kadar ayrıntısının hayatta kalacağını belirler. Sesi atmak az yardım eder; bir video dosyasının nadiren yüzde birkaçından fazlasıdır.
Bir yere yükleniyor mu?
Hayır. Her şey tarayıcınızda WebCodecs ile çalışır; bunu pratik kılan da budur: bir gigabaytı yükleyip sunucunun 200 MB geri vermesini beklemek, yerelde yapmaktan yavaştır ve yol boyunca görüntünüzü başkasının diskinde bırakır. Boyut sınırı, kuyruk ve filigran yok — çünkü bunları dayatacak bir sunucu yok.
Diğer araçlar
Kendi projenize ekleyin
Compressing video to a target file size — the same way this page does it, on the user's machine, with no server. Take the code, or hand the prompt to a coding agent.
// npm i mediabunny
import { Input, Output, Conversion, BlobSource, BufferTarget, Mp4OutputFormat, ALL_FORMATS } from 'mediabunny';
// Size is bitrate x duration, so a target size fixes the bitrate.
const OVERHEAD = 0.04; // container headers and packaging
const AUDIO_BITRATE = 128_000;
export async function compressToSize(file, targetBytes, { width } = {}) {
const input = new Input({ source: new BlobSource(file), formats: ALL_FORMATS });
const duration = await input.computeDuration();
// Aim under the wall: a file of exactly 10.00 MB is still refused by a 10 MB limit.
const aim = targetBytes * 0.96;
const videoBitrate = Math.max(
90_000,
Math.round((aim * 8 * (1 - OVERHEAD) - AUDIO_BITRATE * duration) / duration),
);
const output = new Output({ format: new Mp4OutputFormat(), target: new BufferTarget() });
const conversion = await Conversion.init({
input,
output,
video: {
...(width ? { width } : {}),
bitrate: videoBitrate,
hardwareAcceleration: 'prefer-hardware', // 180 fps vs 34 on an M5 at 1080p
},
audio: { bitrate: AUDIO_BITRATE },
});
if (!conversion.isValid) throw new Error('Cannot convert this file');
await conversion.execute();
return new Blob([output.target.buffer], { type: 'video/mp4' });
}
// Encoders drift, so measure and correct once if the first pass missed.
const blob = await compressToSize(file, 10 * 1024 * 1024);
console.log(blob.size / 1048576, 'MB'); Build me a video compressor that runs entirely in the browser — no upload, no server.
Requirements:
- Use the "mediabunny" npm package, which wraps WebCodecs. Do not use ffmpeg.wasm: it is ~30 MB and
needs SharedArrayBuffer, which requires COOP/COEP headers that break third-party scripts.
- Let the user target a file size (presets: 10 MB Discord, 16 MB WhatsApp, 25 MB email) as well as
picking a quality.
- To hit a size: size = bitrate x duration, so videoBitrate = (targetBytes * 8 * 0.96 - audioBitrate
* duration) / duration. Aim at 96% of the limit, because a file of exactly 10.00 MB is still
rejected by a 10 MB limit.
- Encoders do not obey a requested bitrate exactly. Measure the result; if it missed by more than 4%
or broke the limit, re-encode once with bitrate * (target / actual), damped to at most a halving
or doubling. Stop at two passes.
- Pass hardwareAcceleration: 'prefer-hardware'. Measured on an M5 at 1080p: 180 fps against 34 fps
for software, and the software encoder also overshot the requested bitrate by 3.5x.
- Show the estimated output size before encoding, and the real before/after afterwards.
- Refuse impossible targets up front: below about 90 kbps video is unwatchable, so if the target
cannot be met at that floor, say so and give the smallest honest size instead of producing junk.
- Warn when the source is already compressed below what its resolution needs — re-encoding it will
make it larger, and only reducing the resolution will help.
Reference implementation: https://life2film.com/tools/video-compressor/
The engine is documented for agents, and every tool page is available as
markdown by adding .md to its address.