How to stabilize shaky video in your browser for free
- Step 1Confirm you're on Pro or higher — The stabilizer is a Pro-tier tool (
minTier: pro). Pro allows up to 10 GB per file; Pro+Media raises it to 100 GB. There is no minutes cap — a long clip is fine as long as it fits the byte limit. Free tier cannot run this tool. - Step 2Drop your shaky clip onto the tool — Drag any common container (MP4, MOV, MKV, WebM, AVI) onto the dropzone. The file is read into FFmpeg.wasm in the tab — no upload progress bar because nothing is sent anywhere.
- Step 3Set Zoom to control crop-in — Zoom ranges 0–15 (default 5). It pre-zooms the frame so the blank edges created by shifting don't show. Start at 5; raise it only if you still see black wedges or jelly at the borders. Every point of zoom costs field of view, so don't over-crop.
- Step 4Set Smoothing to control how locked-down the result feels — Smoothing ranges 0–30 (default 15). It's the number of frames averaged into the smoothed path. Lower = the camera still follows your intentional moves; higher = the shot floats like it's on a tripod but may rubber-band on fast pans. 15 is a sane handheld default.
- Step 5Run the two-pass job and watch the log — JAD runs
vidstabdetectfirst (analysis, no visible output), thenvidstabtransform+unsharpto produce the file. Both passes read the full clip, so processing time is roughly double a single-pass filter. The detect pass writes a temporary.trfmotion file that is discarded after the run. - Step 6Download the stabilised MP4 and compare — Output is H.264 MP4 (libx264, preset medium, CRF 20) with your original audio copied in. Scrub the edges: if you see residual border wobble, re-run with higher Zoom; if intentional pans rubber-band, re-run with lower Smoothing.
The two controls and what they actually change
These are the only user-adjustable options in the stabilizer client. Everything else (detect sensitivity, codec, CRF, sharpening) is fixed by the pipeline.
| Control | Range (default) | vidstab param | What it does | Raise it when… |
|---|---|---|---|---|
| Zoom | 0–15 (5) | vidstabtransform zoom= | Pre-crops/zooms the frame so the blank wedges from frame-shifting fall outside the visible area | You still see black borders or edge jelly after a run |
| Smoothing | 0–30 (15) | vidstabtransform smoothing= | Number of frames averaged into the smoothed camera path — bigger window = steadier, more tripod-like | You want a locked-off look and don't mind slower response to real pans |
Fixed pipeline (not adjustable)
These values are hard-coded in the processor. If you need different codecs or a sharpening change, do it in a separate step with a sibling tool.
| Stage | Exact setting | Note |
|---|---|---|
| Detect pass | vidstabdetect=stepsize=6:shakiness=8:accuracy=9 | Tuned for general handheld shake; not exposed in the UI |
| Sharpening | unsharp=5:5:0.8:3:3:0.4 | Light recovery of detail lost to warping; always applied in pass two |
| Video codec | libx264 -preset medium -crf 20 | Output is always H.264 MP4 — re-encoded, not stream-copied |
| Audio | -c:a copy | Bit-identical passthrough, stays in sync |
| Container | .mp4 | Output container is always MP4 regardless of input |
Pro+ tier ceilings for this tool
Stabilizer requires Pro. There is no duration cap — only file size and batch count apply. Streaming is in-browser.
| Tier | Max file size | Files per batch |
|---|---|---|
| Free | Not available (Pro-only tool) | — |
| Pro | 10 GB | 5 |
| Pro+Media | 100 GB | 50 |
| Developer | 100 GB | Unlimited |
Cookbook
Settings recipes for the most common shake patterns. Zoom and Smoothing are the only dials — these pair them sensibly for each scenario.
Default-everything first pass
When you don't yet know how bad the shake is, run the defaults and judge from the result. This is the fastest way to get a baseline before tuning.
Settings: Zoom: 5 Smoothing: 15 Pipeline: pass 1 vidstabdetect=stepsize=6:shakiness=8:accuracy=9 -> motion.trf pass 2 vidstabtransform=zoom=5:smoothing=15,unsharp=... -> out.mp4 Result: input.mov (shaky) -> out.mp4 (H.264, audio copied)
Mild jitter, keep the wide framing
Light tabletop or seated-handheld jitter doesn't need much crop. Drop Zoom so you keep almost all the field of view, keep Smoothing moderate.
Settings: Zoom: 2 # minimal crop-in, preserves FOV Smoothing: 12 # gentle averaging Best for: short product clips, talking-head with small drift
Heavy walk-and-shoot shake
Walking introduces big low-frequency bounce plus high-frequency steps. You need more crop headroom to hide the bigger shifts and a wider averaging window.
Settings: Zoom: 9 # more crop to swallow large edge wedges Smoothing: 22 # heavy averaging for a steadier path Trade-off: noticeably tighter framing; check faces aren't cropped
Two attempts to dial it in
Stabilisation is iterative. Run once at defaults, inspect the edges and the pans, then adjust the one knob that addresses what you saw.
Run 1 (Zoom 5 / Smoothing 15): -> black wedge still visible bottom-left on fast turns Run 2 (Zoom 8 / Smoothing 15): -> wedge gone; framing tighter but acceptable Lesson: edge artifacts = raise Zoom; rubber-banding = lower Smoothing
Stabilise, then trim losslessly
Because the stabilizer re-encodes, do framing-sensitive edits in the right order. If you only need part of the clip, stabilise first, then cut without a second re-encode using the lossless trimmer.
Step 1 stabilizer -> out.mp4 (H.264, re-encoded once)
Step 2 [lossless trimmer](/video-tools/lossless-trimmer)
-c copy at keyframe -> clip.mp4 (no extra re-encode)
Keeps quality: only one re-encode totalEdge cases and what actually happens
Rolling shutter ‘Jello’ wobble
Not fixablevidstab corrects whole-frame motion (shift and roll). Rolling-shutter Jello is a per-line skew inside each frame caused by a CMOS sensor scanning top-to-bottom during fast motion. It is not a frame-level transform, so no Zoom/Smoothing value removes it. Capture with a gimbal or global-shutter camera, or fix it in a dedicated NLE rolling-shutter tool.
Motion blur on individual frames
Not fixableIf shake was severe enough to smear individual frames during exposure, stabilisation realigns those blurry frames but cannot un-blur them. The result is steady-but-soft. The baked-in unsharp pass adds light edge recovery, not deblurring. Shoot at a faster shutter to avoid it.
Detect pass fails — vidstab missing in build
errorIf the FFmpeg.wasm build lacks the vidstab filter, the detect pass exits non-zero and you'll see Stabiliser detect pass failed (vidstab may not be present in this build). This is an environment issue, not your file. Retry; if it persists the build doesn't include vidstab and stabilisation can't run.
Black wedges still visible at frame edges
By designWhen a frame is shifted to compensate, the freed edge shows as a blank wedge. Zoom crops in to push those wedges off-screen. If you see them, your Zoom is too low for the amount of shake — raise it. The cost is a tighter crop and reduced field of view.
Intentional pans rubber-band or overshoot
ExpectedHigh Smoothing averages the camera path so aggressively that deliberate pans look like the camera lags then catches up. Lower Smoothing so the smoothed path follows your real movement more closely. There's no separate 'pan detection' control to exempt intentional moves.
Variable frame rate (VFR) source
Re-encodedScreen-capture and phone footage is often VFR. The stabilizer re-encodes to H.264 MP4, which normalises timing as part of the encode. Audio is stream-copied; if you hear A/V drift on an unusual VFR source, transcode to constant frame rate first with the video transcoder.
Very long or 4K clip is slow
ExpectedTwo full passes over the file plus a CPU-side H.264 encode means processing scales with resolution and length. There is no duration cap, but a long 4K clip takes real time in FFmpeg.wasm. Lower the resolution first with the video resizer if speed matters more than native resolution.
Featureless scenes (sky, water, fog)
Reduced effectvidstab tracks visual features to measure motion. Frames dominated by flat sky, calm water, or fog give it little to lock onto, so stabilisation is weaker on those sections. This is inherent to feature-based tracking, not a tier limit.
Output is always MP4, never the source container
By designRegardless of whether you drop a MOV, MKV, or WebM, the output is H.264 MP4 because the transform pass re-encodes with libx264. If you need a different container or codec afterward, run the video transcoder or H.265 encoder as a second step.
Free-tier user can't open the tool
rejectedThe stabilizer is gated to Pro and above (minTier: pro). On Free tier you'll be prompted to upgrade rather than run a job. There is no free quota for this specific tool.
Frequently asked questions
Does my video get uploaded anywhere?
No. Stabilisation runs entirely in your browser through FFmpeg.wasm. The file is read into the tab and processed on your CPU — nothing is sent to a server, which is why there's no upload progress bar and why private footage stays private.
Which filter does JAD use — deshake or vidstab?
vidstab, run as a genuine two pass: vidstabdetect analyses motion vectors across the whole clip into a .trf file, then vidstabtransform warps each frame onto the smoothed path. vidstab handles rotation as well as translation, which the older single-pass deshake filter does not.
What do Zoom and Smoothing actually control?
Zoom (0–15, default 5) is vidstabtransform's crop-in — it pre-zooms so the blank edges from frame-shifting fall off-screen. Smoothing (0–30, default 15) is the number of frames averaged into the camera path — higher is steadier but slower to follow real pans. These are the only two controls.
Can I adjust shakiness or accuracy?
No. The detect pass uses fixed shakiness=8, accuracy=9, and stepsize=6, tuned for general handheld footage. Those aren't exposed in the UI. You shape the result with Zoom and Smoothing only.
What format is the output?
Always H.264 MP4 (libx264, preset medium, CRF 20), regardless of input container. The audio track is stream-copied unchanged. If you need a different codec or container, run the transcoder or H.265 encoder afterward.
Will it fix rolling-shutter Jello?
No. Jello is a per-line skew inside each frame from a CMOS sensor scanning during motion. vidstab corrects whole-frame movement, not intra-frame distortion. Use a gimbal or global-shutter camera, or a dedicated rolling-shutter tool in an NLE.
Why is there a slight crop on my stabilised video?
Stabilising shifts frames to cancel shake, which exposes blank edges. Zoom crops in to hide them — so a non-zero Zoom always costs some field of view. Lower the Zoom to keep more framing, at the risk of visible edge wedges on big shifts.
Is there a limit on video length?
No minutes cap. The only limits are file size and batch count by tier: Pro 10 GB / 5 files, Pro+Media 100 GB / 50 files, Developer 100 GB / unlimited. A long clip is fine as long as it's under your size ceiling.
Why does it take roughly twice as long as a simple filter?
Because it's two full passes over the file — detect then transform — plus a CPU-side H.264 encode in the second pass. There's no shortcut: the smoothed path can't be computed without first measuring every frame's motion.
Does it work on Free tier?
No. The stabilizer is gated to Pro and above. Free-tier users see an upgrade prompt. Pro is the entry point, with a 10 GB per-file ceiling.
Can I stabilise several clips at once?
Batch count is tier-limited (Pro 5, Pro+Media 50, Developer unlimited), but the video engine serialises jobs through a single FFmpeg.wasm instance, so multiple files process one after another rather than truly in parallel.
Stabilised result still looks shaky — what now?
Raise Smoothing for a steadier path and Zoom if edge wedges are the giveaway. If shake is severe or has heavy rolling shutter, browser vidstab has limits — a desktop NLE like DaVinci Resolve or Premiere's Warp Stabilizer will go further on extreme cases.
Privacy first
Every JAD Video tool runs entirely in your browser via WebCodecs and FFmpeg (WebAssembly). Your video files never leave your device — verified by zero outbound network requests during processing.