Разделить видео
Нарежьте длинное видео на клипы, которые начинаются там, где меняется картинка, — а не каждые тридцать секунд. Всё происходит на вашей машине.
Файл читает и перекодирует ваш собственный браузер. Ни один запрос никуда его не отправляет — у этой страницы просто нет сервера, куда его загружать.
Вопросы
Чем это отличается от других разделителей видео?
Большинство режет каждые N секунд, поэтому клип может начаться на середине фразы и оборваться на середине жеста. Этот находит склейки, которые в видео уже есть, и собирает клипы из целых планов. Примерную длину вы по-прежнему выбираете сами; границы просто ложатся на ближайшую настоящую смену, а не на секундомер.
Что означают звёзды у клипов?
Движок оценивает каждый выбранный кадр по резкости, экспозиции, контрасту, цветности и детализации, а клип получает среднее по длительности от планов внутри. Звёзды относительны лучшему клипу этого видео, а не абсолютная шкала: это подсказка, куда смотреть в первую очередь, а не приговор о том, что интересно.
Не обрежет ли вертикальный кроп людей?
Он берёт центр кадра — чаще всего это верно и неверно тогда, когда объект стоит сбоку. Отслеживания лиц здесь пока нет, поэтому проверяйте превью перед публикацией. Если план снят широко, обрезать вручную обычно лучше.
Видео загружается на сервер?
Нет. Браузер декодирует его, WebAssembly анализирует кадры, а клипы кодируются локально через WebCodecs — тот же аппаратный путь, которым браузер проигрывает видео. Никуда ничего не отправляется, и именно поэтому нет ни лимитов тарифа, ни очередей, ни водяных знаков.
Другие инструменты
Build this into your own project
Splitting video at its shot changes — 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.
// Shot detection uses the Life2Film engine:
// https://life2film.com/wasm/va_wasm.js
const engine = await import('https://life2film.com/wasm/va_wasm.js');
await engine.default({ module_or_path: 'https://life2film.com/wasm/va_wasm_bg.wasm' });
// pixels: centre-column mean RGB per sampled frame, timestamps in seconds
const { scenes } = JSON.parse(engine.detect_scenes_slick(JSON.stringify({
pixels, timestamps, duration, algo: 'adjacent_diffs',
}))); Build a video splitter that cuts at the shot changes instead of every N seconds, in the browser.
Requirements:
- Every other splitter cuts on a fixed interval, so clips open mid-gesture. Find the cuts the video
already has and build clips out of whole shots.
- Detect shots with the "life2film-engine" npm package (WebAssembly): sample frames, take the mean RGB
of the centre column, pass pixels + timestamps to detect_scenes_slick.
- Sampling rate decides accuracy, not the algorithm. At 2 samples/second boundaries land 1-3 seconds
out and all sixteen algorithms are wrong the same way; at 10/second they land on the frame. Use a
coarse pass to find candidates, then re-sample tightly around each one at ten times the resolution.
- Group whole shots into clips near the target length; never cut inside a shot. A shot longer than the
target becomes its own clip. Absorb a short tail into the previous clip rather than leaving a
two-second orphan.
- Rank clips by picture quality using score_frame, taking the MEDIAN score per shot (one bad frame
should not sink a good shot) and weighting by duration when combining shots.
- Encode with "mediabunny", trim: {start, end} per clip, and offer a 9:16 crop via
video: { width: 1080, height: 1920, fit: 'cover' }.
- Cap the input length — every sample is a seek costing tens of milliseconds.
Reference implementation: https://life2film.com/tools/video-splitter/
The engine is documented for agents, and every tool page is available as
markdown by adding .md to its address.