VIDSHIFT / LOCAL VIDEO EXPERIMENT
Let the camera move.
A full-window canvas above. Your editable motion timeline below. Back to preview ↑
Higher values prefer “nothing” when motion barely improves the pixel match; 0 removes this extra preference. Applies to the next analysis. Choose decoding/analysis threads beside Open video above.
How this works
Each selected worker decodes and analyzes queued 6-second slices of your local file. Frame overlap keeps boundaries intact; raw motion is joined before the parallel second pass checks neighbors across slices. Slice boundaries are not scene cuts. The browser then plays your original video; only its position and scale change. Short clips may contain fewer slices than threads, and codec/hardware limits still affect speed.
Movement is a two-dimensional X/Y vector, not separate horizontal/vertical actions. Tiny improvements need not count as motion. Positive X/Y describe image movement right/down; the video rectangle moves inversely. Moving subjects, parallax, blur and lighting changes can still confuse the estimate.
Per-frame motion is coalesced into steady movements: each row is one operation at one constant rate. Expand a row to change its type or rate. Edits update playback without reanalysis. Export/import JSON contains only operations and identifying metadata, never the video. Import after analyzing the matching local video; Reset restores the original analysis.
Use MP4/MOV or WebM with one video track and a codec supported by your browser's WebCodecs implementation. Audio stays with native playback. HTTPS or localhost is required; no special isolation headers, WASM, bundler or video encoding is used.
Embedding: import web/video-shift.js and put <video-shift threads="4"></video-shift> inside a parent with a defined width and height. The operations editor is an optional, separate component.