← Все инструменты

Сжать видео

Задайте размер — 10 МБ для Discord, 25 МБ для почты — или просто снизьте качество. Всё считается на вашей машине, поэтому нет ни лимита, ни очереди.

Файл читает и перекодирует ваш собственный браузер. Ни один запрос никуда его не отправляет — у этой страницы просто нет сервера, куда его загружать.

Вопросы

Он правда попадает в точный размер?

Для этого и сделан режим «уложиться в размер». Вес файла — это битрейт, умноженный на длительность, поэтому при известной длительности нужный битрейт вычисляется арифметически. Кодировщики не соблюдают заданный битрейт идеально — управление потоком плывёт в зависимости от материала, — поэтому если первый проход промахнулся больше чем на несколько процентов, промах измеряется и файл перекодируется ещё раз с поправкой. На практике результат оказывается в паре процентов от цели.

Почему именно 10, 16 и 25 МБ?

Это стены, о которые люди реально бьются: 10 МБ — бесплатный лимит Discord, 16 МБ — WhatsApp, 25 МБ — Gmail и большинство почтовых серверов, 50 МБ — Discord Nitro Basic. Инструмент целится чуть ниже лимита, а не ровно в него, потому что файл ровно на 10,0 МБ десятимегабайтный лимит всё равно отклонит.

А если цель недостижима?

Он скажет об этом до начала и назовёт минимальный честный размер для этого видео. Втиснуть час материала в 10 МБ означало бы битрейт, которого не переживает ни одно разрешение: инструмент, который выдал бы нечитаемое видео и назвал это успехом, хуже того, который отказывается.

Насколько уменьшится мой файл?

Прогноз показывается до того, как вы что-то нажали, — из настроек и длительности. Материал прямо с телефона или камеры обычно записан с запасом далеко выше необходимого, и сокращение на 60–90 % там обычное дело. У того, что уже сжимали однажды, запаса почти нет, и инструмент сравнивает ваш файл с тем, что его разрешению разумно требуется, и предупреждает, когда перекодирование только увеличит размер.

Что вообще уменьшает видео?

Меньше пикселей и меньше битов на пиксель. Разрешение — грубый и надёжный рычаг: переход с 4K на 1080p убирает три четверти пикселей ещё до разговора о качестве. Битрейт затем решает, сколько деталей уцелеет. Отключение звука помогает мало: он редко составляет больше нескольких процентов видеофайла.

Файл куда-нибудь загружается?

Нет. Всё идёт через WebCodecs в вашем браузере — именно это делает такой подход осмысленным: загрузить гигабайт, чтобы сервер вернул 200 МБ, дольше, чем посчитать локально, и попутно оставляет ваш материал на чужом диске. Ни лимита размера, ни очереди, ни водяных знаков — потому что нет сервера, который бы их вводил.

Другие инструменты

Build this into your own project

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');

The engine is documented for agents, and every tool page is available as markdown by adding .md to its address.