How to compress a video for twitter / x upload
- Step 1Confirm you want quality-based, not size-targeted, output — This tool encodes at a fixed CRF 20 — it does not accept a target file size. If you must hit a specific ceiling, stop here and use a size-targeted compressor (see step 6 and the table below). For "smaller and at X spec," continue.
- Step 2Drop your source clip — Drag an
.mp4,.mov,.mkv,.webm,.avi,.m4v, or.tsfile onto the dropzone. The card shows source resolution and length so you can gauge how much the downscale to 720p will save. - Step 3Run the formatter — Click Run X Format. There are no compression sliders — the pass is fixed (CRF 20, 720p, AAC 128k). The only on-page note confirms the audio re-encode.
- Step 4Let the single pass downscale and encode — FFmpeg.wasm center-crops to 16:9, scales to 1280×720 with Lanczos, caps at 140s, and encodes
libx264 -preset medium -crf 20 -pix_fmt yuv420p+aac -b:a 128kwith+faststart. - Step 5Check the output size on the result card — The card shows input → output bytes. Because size is content-driven, verify it's under X's 512 MB upload cap (and any size budget of your own). A busy 2:20 clip may still be large.
- Step 6If it's still too big, switch to a size-targeted tool — For a hard ceiling, use discord-compressor (25/50 MB), whatsapp-compressor (~15 MB), email-compressor (Gmail 25 / Outlook 20 MB), or set an explicit bitrate with video-bitrate-set.
What this 'compression' actually is
The formatter reduces size as a side effect of downscaling + CRF 20 — it is not a size-target encoder. Verified against lib/video/video-processor.ts (runSocialFormat).
| Aspect | This formatter | Implication |
|---|---|---|
| Encode mode | Constant quality (-crf 20) | Output size varies with content — you can't set a target MB |
| Resolution | Fixed 1280×720 | Big saving for 4K/1080p sources; none if already 720p |
| Passes | Single pass | No 2-pass size targeting (the compressors do that) |
| Audio | AAC 128 kbps (re-encoded) | Fixed — not lowered to save bytes |
| Length | Capped at 2:20 | Trims time, indirectly limiting size |
Pick the right tool for your size goal
Use this formatter for X-spec quality; use a size-targeted compressor when a hard byte ceiling matters. Targets below are the real defaults from each tool's client.
| Goal | Use | Target |
|---|---|---|
| X-spec 720p, smaller than a 4K source | This formatter | CRF 20 (quality, not size) |
| Under a hard ~15 MB | whatsapp-compressor | ~15 MB (under the 16 MB cap) |
| Under 25 / 50 MB | discord-compressor | 25 MB free · 50 MB Nitro |
| Under email limits | email-compressor | Gmail 25 MB · Outlook 20 MB |
| Exact bitrate | video-bitrate-set | You set video + audio kbps |
Free-vs-paid limits for this tool
From the shared video tier family (lib/tier-limits.ts). One file per job; paid tiers batch sequentially.
| Tier | Max file size | Batch files / job |
|---|---|---|
| Free | 1 GB | 1 |
| Pro | 10 GB | 5 |
| Pro + Media | 100 GB | 50 |
| Developer | 100 GB | Unlimited |
Cookbook
Real before/after sizes from CRF 20 720p encodes. Sizes are content-dependent — these illustrate the spread, not a guarantee.
4K source dramatically smaller at 720p
The biggest win is downscaling. A 4K 1080p+ source carries far more pixels than X needs; encoding to 1280×720 CRF 20 cuts the size a lot while staying sharp on a phone timeline.
Source : 3840x2160, 60s, ~480 MB
Pass : crop 16:9 (none) -> scale 1280x720
libx264 crf 20
Output : 1280x720, 60s, ~28 MB (approx)
(Size varies with content.)Already-720p source barely changes
If the source is already around 720p, there is little resolution to remove — the output may be similar in size or even larger if the source was heavily pre-compressed. 'Compression' here means matching X's spec, not always shrinking.
Source : 1280x720, 90s, ~18 MB (heavily compressed) Pass : re-encode crf 20 Output : ~22 MB (slightly bigger!) If you need it SMALLER, use a size-targeted compressor, not this formatter.
High-motion 2:20 clip still large
CRF 20 spends bits where there's motion. A full-length 2:20 gameplay or sports clip can stay tens of megabytes even at 720p — fine for X's 512 MB cap, but not 'small.'
Source : 1080p gameplay, 140s Pass : crf 20, 720p Output : ~55 MB Under X's 512 MB cap, but for mobile-data or a 15 MB target use whatsapp-compressor.
Need a real byte ceiling? Hand off to a compressor
When the requirement is 'must be under N MB,' the formatter can't promise it. The size-targeted tools run a bitrate-calc / 2-pass encode against your target. Format to X shape first if you also need the crop, then compress.
Goal: <= 15 MB for mobile upload. formatter -> 32 MB (too big) whatsapp-compressor on that file -> targets ~15 MB via bitrate calc -> ~14.6 MB MP4
Audio bitrate is fixed at 128k
The formatter always re-encodes audio to AAC 128 kbps — it does not drop audio quality to save space. If audio is eating your byte budget on a long clip, a size-targeted compressor that controls audio bitrate is the better fit.
Source : 5.1 surround, 320 kbps Formatter -> AAC 128k stereo (fixed) Want lower audio kbps to save size? Use video-bitrate-set (set audio kbps).
Edge cases and what actually happens
You typed a target size — there's no field
Unsupported hereThis formatter has no target-size control. Output size is whatever CRF 20 at 720p produces. For a hard ceiling use whatsapp-compressor, discord-compressor, email-compressor, or video-bitrate-set.
Output larger than the source
PossibleIf the source was already 720p and heavily pre-compressed, re-encoding at CRF 20 can produce a slightly larger file. CRF targets quality, not size — to guarantee a reduction, use a size-targeted compressor.
Output exceeds X's 512 MB upload cap
Possible at 2:20A high-motion full-length clip at CRF 20 720p can approach X's 512 MB upload limit. If the upload is rejected for size, re-run the output through a size-targeted compressor.
Source already 16:9 and 720p
Minimal gainThere's no crop and no downscale to save bytes — only the re-encode. Expect little to no size reduction, plus one generation of quality loss. Skip the formatter unless you need the 2:20 cap or +faststart.
10-bit / HDR source
Converted to 8-bit SDROutput is forced yuv420p 8-bit, so HDR is implicitly tone-mapped to SDR. This shrinks the data but is not an HDR-preserving encode; there is no 10-bit output option here.
Silent source
SupportedNo audio track means FFmpeg produces a video-only MP4 — no error, and the AAC request is simply unused. The video encode is unaffected.
Quality looks soft after X re-uploads
Expected (double encode)X re-encodes everything; your CRF 20 file is then transcoded again by X. Two generations soften detail. Handing X a clean 720p file minimises this versus uploading raw 4K, but it can't eliminate X's own pass.
Very large source above your tier cap
BlockedFree is 1 GB per file; Pro 10 GB; Pro + Media / Developer 100 GB. A source over your cap is rejected at drop. Pre-trim or upgrade.
Want lower resolution than 720p to save more
Not availableThe formatter is locked to 1280×720 — there is no 480p option. For a smaller frame, use video-resizer (set width/height) or a size-targeted compressor that picks resolution to fit the target.
Batch compress several clips
SequentialPaid tiers process several files one after another, each to 720p CRF 20. Free tier does one at a time. Each output is independent.
Frequently asked questions
Can I set a target file size for X?
No — this formatter encodes at a fixed CRF 20, so output size is content-driven. For a hard byte ceiling, use a size-targeted compressor: whatsapp-compressor (~15 MB), discord-compressor (25/50 MB), email-compressor, or video-bitrate-set.
How much will it shrink my file?
It depends on the source. A 4K or high-bitrate 1080p clip usually shrinks a lot at 720p CRF 20. An already-720p, already-compressed clip may shrink little — or grow slightly. CRF targets quality, not a number.
What encode settings does it use?
1280×720, libx264 -preset medium -crf 20 -pix_fmt yuv420p, audio aac -b:a 128k, container MP4 with +faststart. All fixed — no sliders.
Why re-encode at all if X re-compresses anyway?
X starts from your file. A clean 720p H.264 source means X has less to downscale and re-encode, so the visible loss is smaller than uploading raw 4K. +faststart also makes the post play during download.
Will it help me stay under X's 512 MB upload limit?
Usually for big sources (the downscale helps), but it's not guaranteed — a busy full-length clip can still be large. Check the output size; if it's over, run it through a size-targeted compressor.
Can I lower the audio bitrate to save space?
Not in this tool — audio is fixed at AAC 128 kbps. To control audio bitrate, use video-bitrate-set, which lets you set both video and audio kbps.
Can I output 480p instead of 720p?
No — the formatter is locked to 1280×720. For a smaller frame use video-resizer, or a size-targeted compressor that chooses resolution to meet the target.
Does it do 2-pass encoding?
No, it's a single CRF pass. The size-targeted compressors are the ones that do bitrate-calc / 2-pass encoding to hit a specific file size.
What input formats can I drop?
MP4, MOV, MKV, WebM, AVI, M4V, and TS. Output is always MP4.
Is my video uploaded anywhere?
No. The encode runs in-browser via FFmpeg.wasm — the file never leaves your machine. Only an anonymous processed-count is logged for signed-in dashboards.
Can I compress several clips at once?
Paid tiers batch: Pro 5, Pro + Media 50, Developer unlimited files per job (sequential). Free does one at a time.
Will the output look worse than my source?
Slightly — any re-encode costs a generation, and CRF 20 is a sensible quality point but not lossless. The trade is a smaller, X-spec file that survives X's own transcode better than a raw upload would.
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.