How to trim a video to fit twitter / x's 2:20 limit
- Step 1Know the target ceiling — Standard X video length is 2:20 = 140 seconds. Plan an output duration of 140 seconds or less. Some premium accounts allow longer; this tool just trims to whatever Start/End you set, so use your account's real limit.
- Step 2Drop your clip — Drag in the MP4 (or MOV/MKV/WebM/etc.) you want to post (one file per run). FFmpeg.wasm probes its duration and shows it in the panel.
- Step 3Set Start (s) — Enter the in-point. Stream-copy snaps it to the nearest keyframe at/before your value, so the clip may begin a second or two early — fine for most posts, but factor it into the 140-second budget.
- Step 4Set End (s) under the ceiling — Set End so that End minus the effective (snapped) Start stays comfortably under 140 seconds. Leaving a couple of seconds of headroom protects you from the keyframe snap pushing the duration over.
- Step 5Run the trim — The tool runs
-ss {start} -to {end} -i input -c copy -avoid_negative_ts make_zero. No re-encode, native quality preserved. - Step 6Check duration, then post to X — Confirm the output is at or under 140 seconds (player scrubber or MediaInfo), then upload the
name-out.extto X. If it's a hair over because of the keyframe snap, nudge End down and re-run — each run is seconds.
Twitter / X video constraints (mid-2026)
The length cap is what this trimmer addresses. Other limits (size, aspect) are handled by X on upload or by sibling tools.
| Constraint | Typical limit | How to handle |
|---|---|---|
| Video length (standard) | 2:20 (140 seconds) | Trim here with -c copy to fit |
| Video length (some premium accounts) | Longer, account-dependent | Trim to your account's real limit |
| Quality | X re-compresses on upload | Hand it a native-quality, non-re-encoded source |
| Aspect / size for the feed | X auto-fits; many crop to 16:9 or square | Use the Twitter/X formatter to set aspect |
Why not re-encode to shorten?
Two reasons stream-copy wins for social posts: quality and speed.
| Approach | Quality at X | Time |
|---|---|---|
| Stream-copy trim (this tool) | Native source → X re-compresses once | Seconds |
| Re-encode-to-trim in an editor | Re-encode + X re-compress = two generations of loss | Minutes |
| Cut precision | Start snaps to nearest keyframe | Plan a couple seconds of headroom |
Cookbook
Trims aimed at the X 2:20 ceiling and the command each runs. Keep an eye on the snapped start when budgeting the 140 seconds.
Cut a 3-minute clip down to 2:20
A 182-second clip is over the cap. Trim the last 42 seconds off to land at 140.
Source duration: 182s
Inputs: Start (s) = 0 End (s) = 140
Command run:
ffmpeg -ss 0 -to 140 -i clip.mp4 \
-c copy -avoid_negative_ts make_zero clip-out.mp4
Output: 140s, native quality, ready for X.Pull a 130-second highlight from a long stream
Grab the best moment from a long recording, leaving headroom under 140 so the keyframe snap can't push it over.
Inputs: Start (s) = 905 End (s) = 1035 (target ~130s) Effective start snaps to keyframe <= 905 (e.g. 903.2s), so output ≈ 131.8s — still safely under 140.
Trim only the tail — keep the open
Your intro is fine; just cut the overlong ending. Leave Start at 0 and set End to 140.
Inputs: Start (s) = 0 End (s) = 140 Output: open preserved, anything past 2:20 dropped.
Over by 2 seconds — nudge and re-run
The keyframe snap made the first pass 141.5s. Drop End a couple seconds and re-run; it's instant.
Pass 1: Start 0, End 142 → output 141.5s (rejected by X) Pass 2: Start 0, End 139 → output 139.0s (accepted) Each pass: -c copy, seconds of work.
Trim then set the aspect for the feed
This tool only trims length and won't change aspect ratio. To reframe to a feed-friendly shape, chain the X formatter (which re-encodes).
Step 1 (this tool): trim to 140s → clip-out.mp4 (lossless) Step 2 (twitter-x-formatter): set aspect/size for the feed (re-encodes to platform spec)
Edge cases and what actually happens
Output a hair over 140 seconds
By designBecause Start snaps to an earlier keyframe, the actual duration can be longer than (End - typed Start). If it tips over 2:20, X rejects it. Leave a couple of seconds of headroom under 140, or nudge End down and re-run — each run is seconds with -c copy.
Start lands between keyframes
ExpectedStream-copy must begin on a keyframe, so your in-point snaps back 1-5 seconds. For a social clip this is usually fine, but it affects your length budget. For a frame-exact in-point you'd need a re-encode via the transcoder.
Clip needs a different aspect ratio for X
Wrong toolThis tool only changes length — it never re-frames or re-scales. To produce a feed-optimised aspect ratio (16:9, square, etc.), use the Twitter/X formatter, which re-encodes to a platform preset. Trim first, then format.
End set to 0 on an over-length source
Does not fitEnd of 0 trims to the full duration — if the source is longer than 140 seconds, that output won't fit X. Always set an explicit End at or under your account's length cap for X posts.
End not greater than Start
RejectedThe run is refused with End time must be after start time. Raise End above Start. Remember the effective Start may be earlier than typed due to the keyframe snap.
X still re-compresses your upload
ExpectedX always re-encodes uploads to its own delivery profile — that's outside this tool. Handing it a native-quality, non-re-encoded source (what stream-copy gives you) means X's single re-compression starts from the best possible bytes, so the post looks as sharp as the platform allows.
File over your tier limit
BlockedFree 1 GB, Pro 10 GB, Pro-Media/Developer 100 GB per file. A source above your tier's byte cap is blocked before processing. There's no duration cap on the tool itself — the 140-second limit is X's, enforced by your End value, not by the tool.
Audio drifts on a malformed source
Rare-avoid_negative_ts make_zero rebases timestamps so audio and video start together. On rare malformed sources sync can still look off after stream-copy; if so, re-encode the trim via the transcoder, which rebuilds timestamps.
Frequently asked questions
What's the Twitter / X video length limit I'm trimming to?
The standard cap is 2 minutes 20 seconds — 140 seconds. A clip even slightly over gets rejected at upload. Set the tool's End so the output stays at or under 140 seconds. Some premium accounts allow longer, in which case trim to your account's real limit; the tool simply trims to whatever Start/End you give it.
Will trimming for X lower my video quality?
No. This tool uses -c copy stream-copy, which doesn't re-encode — the trimmed clip is native quality. That actually helps on X: the platform re-compresses every upload, so giving it a non-re-encoded source means a single generation of X compression instead of two, and a sharper-looking post.
My output is 141 seconds and X rejected it — why?
Because the start snapped to an earlier keyframe, the real duration ran longer than (End minus your typed Start). Leave a couple of seconds of headroom: set End so the result lands around 138 seconds, or just nudge End down and re-run. Each run is seconds because there's no encode.
Why does my clip start a little before the timestamp I picked?
Stream-copy can only begin on a keyframe. The engine snaps your Start back to the nearest keyframe at/before your value (typically 1-5 seconds). It's the trade-off for zero re-encode time. If you need an exact in-point, re-encode via the transcoder.
Can this also crop my video to the right aspect ratio for X?
No — it only changes length. To set a feed-friendly aspect (16:9, square, etc.), use the Twitter/X formatter, which re-encodes to a platform preset. The usual flow is: trim to 2:20 here (lossless), then run the formatter for the aspect.
What formats can I post-trim for X?
MP4, MOV, MKV, WebM, AVI, M4V, and TS. X prefers MP4 (H.264/AAC), so if your source is already MP4 the output stays MP4 and is upload-ready. For other containers, you may want to transcode to MP4 with the transcoder after trimming.
Does the audio stay in sync after trimming?
Yes. -c copy copies the audio track alongside video without re-encoding, and -avoid_negative_ts make_zero rebases timestamps so both start at 0. The trimmed clip keeps its original AAC track in sync from the first frame.
Is my clip uploaded to your servers before it goes to X?
No. The trim runs entirely in your browser via FFmpeg.wasm — your clip stays local until you upload it to X yourself. Only the FFmpeg engine downloads once; no request carries your video.
Can I trim several clips for a thread in one go?
The tool handles one file per run, but each run is seconds because nothing re-encodes — so trimming a few clips for a thread is quick. Just re-drop and set new Start/End values for each.
What if I need the file smaller for X, not just shorter?
Trimming reduces length and therefore size, but if you need to hit a specific file-size target, that requires a re-encode. Use a target-size compressor like the Discord or email compressor (they do bitrate-targeted encodes), or the transcoder for general re-compression.
Does leaving End at 0 work for X posts?
Only if your source is already 140 seconds or shorter. End of 0 trims to the full duration, so a longer source would exceed X's cap. For posts, set an explicit End at or under your account's length limit.
How big a source can I trim for X?
Per-file limits are Free 1 GB, Pro 10 GB, and Pro-Media/Developer 100 GB. Most social-bound sources are well under these, but a long high-bitrate master could approach the Free cap — trimming it down (or upgrading) resolves that.
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.