How to format a video for twitter / x in 16:9
- Step 1Open the X / Twitter formatter and drop your clip — Drag an
.mp4,.mov,.mkv,.webm,.avi,.m4v, or.tsfile onto the dropzone, or click to browse. A hidden<video>element reads the dimensions and duration (~50 ms, no FFmpeg needed) so the file card shows sourcewidth×heightand length before you run. - Step 2Check the source aspect ratio against 16:9 — The formatter center-crops, it does not pad. A 4:3 or ultrawide clip loses its sides; a portrait or square clip loses its top and bottom. If the part you care about isn't centred, crop or recompose it first with the video-cropper so the formatter's centre crop frames the right region.
- Step 3Run the formatter — there are no settings to pick — Click Run X Format. There is no ratio, CRF, or size control for this tool: the pass is fixed at 16:9 → 1280×720, H.264 CRF 20, AAC 128 kbps. The only on-page note confirms the audio re-encode. Watch the Render Dashboard for the crop + scale + encode progress.
- Step 4Let the single pass crop, scale, trim, and encode — FFmpeg.wasm applies
crop(to 16:9, centred) thenscale=…:720:flags=lanczos, caps length at-t 140, and encodeslibx264 -preset medium -crf 20 -pix_fmt yuv420pwithaac -b:a 128kand-movflags +faststart. One pass, one MP4 out. - Step 5Download the 1280×720 MP4 — The result card shows input → output bytes and elapsed time. Download the
.mp4. Output size is whatever CRF 20 produced — it is a quality target, not a size target, so a busy 2:20 clip can land above 50 MB and a static one well under 10 MB. - Step 6Post it to X as a native upload — Attach the MP4 directly in the X composer. X still runs its own transcode, but because you handed it 720p H.264 at its target shape, the visible generation loss is smaller than uploading a raw 4K or portrait source. For multiple clips, the free tier does one file per job; paid tiers batch several (see the limits table).
Exact encode settings this tool applies
The X formatter is a fixed pass — these values are hard-coded in the processor, not user-adjustable. Verified against lib/video/video-processor.ts (runSocialFormat with ratio 16:9, height 720, maxSec 140).
| Stage | What runs | Adjustable? |
|---|---|---|
| Crop | crop to 16:9, centred — (in_w-cropW)/2 : (in_h-cropH)/2. Crop dims rounded to even numbers | No |
| Scale | scale=1280:720:flags=lanczos (target height 720, width derived from 16:9) | No |
| Length cap | -t 140 — hard-trims to the first 2:20, no re-cut prompt | No |
| Video codec | libx264 -preset medium -crf 20 -pix_fmt yuv420p | No |
| Audio codec | aac -b:a 128k (always re-encoded, even if the source is already AAC) | No |
| Container / flags | MP4 with -movflags +faststart | No (always MP4) |
How each source shape lands in the 16:9 frame
The formatter center-crops to 16:9, then scales to 1280×720. No padding or letterboxing is ever added — content outside the centred 16:9 rectangle is discarded.
| Source shape | Example in | What the centre crop keeps | Output |
|---|---|---|---|
| Already 16:9 | 1920×1080 | Whole frame (no crop) — just rescaled | 1280×720 |
| 4:3 | 1440×1080 | Full height, sides cropped to 16:9 | 1280×720 |
| Square 1:1 | 1080×1080 | Full width, top + bottom cropped off | 1280×720 |
| Portrait 9:16 | 1080×1920 | Full width, a thin horizontal centre strip only — most of the frame is lost | 1280×720 |
| Ultrawide 21:9 | 2560×1080 | Full height, far left + right cropped off | 1280×720 |
Free-vs-paid limits for this tool
Limits come from the shared video tier family (lib/tier-limits.ts). This tool processes one file per job; multiple files run as a sequential batch on paid tiers. Sizes are per-file caps.
| 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 source shapes and the exact frame the X formatter ships. The crop is always centred and never padded — these examples show what survives.
1080p landscape → clean 720p, no bars
A 16:9 source needs no crop — the formatter just downscales to X's target resolution and re-encodes at CRF 20. This is the ideal case: nothing is lost to the crop, and the +faststart MP4 plays instantly.
Source : 1920x1080 (16:9, 45s)
Pass : no crop -> scale=1280:720 lanczos
libx264 crf 20, aac 128k, +faststart
Output : 1280x720 MP4, 45s
(2:20 cap not hit; full clip kept)4:3 archive clip → sides cropped to 16:9
Old 4:3 footage gets a centred crop that keeps the full height and trims the left/right edges to reach 16:9. If important action lives at the frame edges, pre-crop with the cropper instead so the centre crop frames what matters.
Source : 1440x1080 (4:3)
cropW = round(1080 * 16/9) = 1920 -> clamped to source width 1440
=> keeps 1440x810 centred (full width, top/bottom trim)
Scale : 1440x810 -> 1280x720
Output : 1280x720 MP42:20 cap on a 3-minute clip
X rejects anything over 2 minutes 20 seconds. The formatter applies -t 140, so a 3-minute source is truncated to the first 140 seconds. There is no in-tool way to pick which 140 seconds — trim first if you need a later section.
Source : 1920x1080, 180s (3:00) Pass : -t 140 (hard cap) Output : 1280x720 MP4, 140s (first 2:20 kept) Need seconds 60-200? Run lossless-trimmer FIRST, then the formatter.
Re-encode is unavoidable (this is not stream-copy)
Unlike a lossless trim, the formatter always decodes and re-encodes — that is how it crops and rescales. So even a clip that is already 1280×720 H.264 comes out slightly different (one extra generation). For a length-only cut with zero quality loss, use the lossless trimmer instead.
Source : already 1280x720 H.264, 30s
Formatter -> still decodes + re-encodes (crf 20)
-> ~1 generation of loss, audio -> AAC 128k
Want zero re-encode? Use lossless-trimmer
(stream copy at keyframe boundary).Output size is a consequence of CRF, not a target
Because the encode is CRF 20 (constant quality), file size varies with content. A high-motion gameplay clip and a static talking-head at the same length and resolution land at very different sizes. If you need to hit a specific byte ceiling, this tool is the wrong one — see the size-targeted compressors.
Same 1280x720, 90s, crf 20: high-motion gameplay -> ~55 MB static talking head -> ~9 MB Need <= a fixed size? Use whatsapp-compressor / discord-compressor / email-compressor (2-pass size targeting), not this formatter.
Edge cases and what actually happens
Portrait source center-cropped to a thin strip
By designA 9:16 portrait clip cropped to 16:9 keeps only a narrow horizontal band through the centre — the top and bottom (often the subject's head and feet) are discarded. The formatter never pads. If you want the whole portrait frame visible on X, this tool will not do it; pre-compose a 16:9 frame yourself, or accept that X will pillarbox a portrait upload.
Clip longer than 2:20
Trimmed to 140sThe pass applies -t 140, keeping only the first 2 minutes 20 seconds. There is no UI to choose which segment. To post a later section, run the lossless-trimmer to cut your chosen range first, then format that.
No size target available
Unsupported hereThis formatter has no target-size field — output size falls out of CRF 20 at 720p. For a hard ceiling (e.g. to stay small on mobile data), use a size-targeted tool: whatsapp-compressor, discord-compressor, email-compressor, or set an explicit bitrate with video-bitrate-set.
Source dimensions can't be read
ErrorIf FFmpeg.wasm can't probe width/height (corrupt header, unusual container), the run throws "Could not determine video dimensions." Re-mux or transcode the file first with the video-transcoder, then format the result.
Source already 16:9 720p H.264
Re-encoded anywayThe formatter always decodes and re-encodes — it does not stream-copy. An already-conforming clip still gets one generation of re-encode (and audio re-coded to AAC 128k). If the file is already at spec and you only need a length cut, prefer the lossless-trimmer.
Output exceeds X's 512 MB upload cap
Possible at 2:20X's documented upload limit is 512 MB. CRF 20 at 720p for the full 2:20 of high-motion content can approach that. If your output is too large for upload, re-run it through a size-targeted compressor (see above) rather than expecting this fixed-quality pass to shrink it.
Silent source (no audio track)
SupportedThe encode requests aac -b:a 128k. If the source has no audio stream, FFmpeg simply produces a video-only MP4 — there is no error. The +faststart and 720p video are unaffected.
10-bit / HDR or yuv444p source
Converted to yuv420pOutput is forced to yuv420p 8-bit, which X and all browsers decode. HDR colour is tone-mapped down to SDR implicitly by the encode — fine for X (which delivers SDR on most clients), but it is not an HDR-preserving path. There is no 10-bit output option in this tool.
File above your tier's size cap
BlockedFree is capped at 1 GB per file; Pro 10 GB, Pro + Media / Developer 100 GB. A file over your cap is rejected at drop time with the size shown. Upgrade or pre-trim the source to get under the cap.
Batch of clips on a paid tier
SequentialThis tool takes one file per job. Drop several on a paid tier and they run as a sequential batch (one 1280×720 MP4 per input), each downloaded separately. Free tier handles one file at a time.
Frequently asked questions
What resolution and codec does the X formatter output?
Always 1280×720 H.264 MP4, encoded libx264 -preset medium -crf 20 -pix_fmt yuv420p with aac -b:a 128k audio and +faststart. These are fixed in the processor — there are no resolution, codec, or quality controls for this tool.
Does it add black bars to fit 16:9?
No. It center-crops to 16:9 — content outside the centred rectangle is discarded, never padded. A 16:9 source crops nothing; a 4:3 loses its sides; a portrait or square loses top and bottom. If you want the whole frame, recompose to 16:9 before formatting.
Can I choose a different aspect ratio?
Not in this tool — it is locked to 16:9 for X. For 9:16 use the youtube-shorts-formatter; for 1:1 or 4:5 use the instagram-feed-formatter; for a free choice of 9:16 / 1:1 / 4:5 use auto-reframe.
Will it trim my video to the X length limit?
Yes. The same pass applies -t 140, keeping only the first 2 minutes 20 seconds (X's documented timeline cap). It does not let you pick which segment — trim first with the lossless-trimmer if you need a later range.
Why re-encode to 720p — won't X just re-compress it again?
X always runs its own transcode, but it starts from your file. Handing it 720p H.264 at its target shape means less to resize and re-encode, so the visible generation loss is smaller than uploading a 4K or portrait source. +faststart also lets the post play during download.
How big will the output file be?
It depends entirely on content, because the encode is constant-quality (CRF 20), not size-targeted. A busy clip can exceed 50 MB at 2:20; a static one can be under 10 MB. For a fixed byte ceiling use a size-targeted compressor instead (Discord / email / WhatsApp) or video-bitrate-set.
Is the audio kept?
Yes, re-encoded to AAC at 128 kbps (the panel note states this). Even an already-AAC source is re-coded, since the whole file is re-encoded. A silent source produces a video-only MP4 with no error.
What input formats can I drop?
MP4, MOV, MKV, WebM, AVI, M4V, and TS. The output is always MP4 regardless of input container.
Does anything upload to a server?
No. The whole pass runs in your browser via FFmpeg.wasm. The clip's bytes never leave your machine — only an anonymous "a file was processed" counter is recorded for signed-in dashboards, with no file content.
Can I run several clips at once?
Free tier does one file per job. Paid tiers batch: Pro up to 5 files, Pro + Media up to 50, Developer unlimited — processed sequentially, one 1280×720 MP4 per input.
My source is already 1280×720 — should I still run it?
Only if you need the crop, the 2:20 cap, or +faststart applied. The formatter always re-encodes, costing one generation. If the file is already at spec and you only need a length cut, use the lossless-trimmer (stream copy, zero loss).
Can I script this in a pipeline?
Yes on paid tiers via the local runner — it runs ffmpeg directly (no headless browser) and writes the output to disk. The browser auto-routes to the runner when it's paired; the clip's bytes still stay local.
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.