How to convert a video to instagram's 4:5 portrait format
- Step 1Open the formatter and drop your clip — Drag your MP4, MOV, WebM, or MKV onto the instagram-feed-formatter. It loads into the browser through FFmpeg.wasm — nothing uploads. A single file up to 1 GB works on free tier.
- Step 2Switch Ratio to 4:5 — The lone option is Ratio, with
1:1and4:5. Choose4:5for the tall portrait. (The tool defaults to1:1, so this is the one click that matters.) - Step 3Centre your subject before formatting — The 4:5 crop keeps a centred window. For a 16:9 source, that trims the left and right; for a 9:16 source, it trims the top and bottom. If your subject sits low or high in frame, reframe first with video-cropper.
- Step 4Run the conversion — JAD computes the largest centred 4:5 region, scales to 1080×1350 with
flags=lanczos, and encodes H.264 CRF 20. Speed depends on your CPU and whether the tab is cross-origin isolated (multi-threaded FFmpeg). - Step 5Mind the 60-second cap — Sources over a minute are trimmed to the first 60 seconds (
-t 60). To export a later window, cut it first with lossless-trimmer, then format the trimmed clip to 4:5. - Step 6Download and post — Out comes a 1080×1350 H.264 MP4 ready for the Instagram app or Creator Studio. The byte readout shows input → output so you can confirm it is well under Instagram's feed size ceiling.
What the 4:5 pass produces
Exact behaviour when Ratio = 4:5, read from runSocialFormat in lib/video/video-processor.ts. These are the real arguments, not guidance.
| Property | Value | Note |
|---|---|---|
| Output resolution | 1080×1350 | Height fixed at 1350; width = round(1350 × 4/5) = 1080. Instagram's documented 4:5 feed spec exactly |
| Crop | Centred 4:5 window ((in_w-W)/2, (in_h-H)/2) | Geometric centre — no subject tracking. Largest 4:5 region the source allows |
| Scaler | scale=1080:1350:flags=lanczos | Lanczos for sharp down/up-sampling to the portrait target |
| Video codec | H.264 (libx264 -preset medium -crf 20) | Constant-quality CRF 20; no bitrate slider |
| Pixel format | yuv420p | 8-bit 4:2:0 for reliable Instagram-app decode |
| Audio | AAC, 128 kbps | Source audio re-encoded and kept |
| Container flags | -movflags +faststart | Progressive playback in the feed |
| Length cap | First 60 seconds (-t 60) | No range picker; longer sources are trimmed |
How each source ratio crops into 4:5
Where the pixels go for common inputs converting to 1080×1350.
| Source | What gets trimmed | Risk |
|---|---|---|
| 1920×1080 (16:9 widescreen) | Large left + right slices (keeps centre 4:5 column) | Anything near the side edges is lost — common for two-person framing |
| 1080×1080 (square) | A little off top + bottom | Minor; centred subjects survive |
| 1080×1920 (9:16 vertical) | Top + bottom (source is taller than 4:5) | Captions at the very bottom or a top status bar get cut |
| 1080×1350 (already 4:5) | Nothing — only a re-encode | One extra compression generation |
| 2560×1080 (21:9 ultra-wide) | Most of the width | Only the centre column survives; reframe first if subjects sit wide |
Cookbook
Real conversions to 1080×1350. The crop/scale math is exactly what runSocialFormat applies for Ratio = 4:5.
16:9 talking-head → 4:5 portrait
A 1920×1080 interview clip with the speaker centred. The 4:5 crop keeps the full height and trims the sides, then scales to 1080×1350 — exactly the framing that wins feed real estate.
Source: 1920x1080 (16:9), speaker centred Ratio: 4:5 Target AR = 4/5 = 0.8; source AR = 1.78 > 0.8 → keep full height, crop width Crop: crop=864:1080:(1920-864)/2:0 (centre 864px-wide column) Scale: scale=1080:1350:flags=lanczos Encode: libx264 -crf 20 -pix_fmt yuv420p, AAC 128k Output: 1080x1350 MP4, faststart
9:16 phone clip → 4:5 (trims top and bottom)
A 1080×1920 vertical clip. Since the source is taller than 4:5, the crop keeps the full width and removes height from top and bottom — fine if the action is mid-frame, risky if you have a bottom caption bar.
Source: 1080x1920 (9:16) Ratio: 4:5 Source AR 0.5625 < 0.8 → keep full width, crop height Crop: crop=1080:1350:0:(1920-1350)/2 (trims 285px top + 285px bottom) Scale: scale=1080:1350 (already matches → no resample) Watch: lower-third captions in the bottom 285px are cut. Reframe with video-cropper if needed.
Square export bumped up to 4:5 for more footprint
A clip exported 1080×1080 that you'd rather post tall. The 4:5 pass trims a little off top and bottom and outputs 1080×1350 — gaining vertical screen space at the cost of a sliver of height.
Source: 1080x1080 (square) Ratio: 4:5 Source AR 1.0 > 0.8 → keep full height? No: 1.0 > 0.8 means crop width Crop: crop=864:1080:(1080-864)/2:0 Scale: scale=1080:1350:flags=lanczos (upscale width path) Output: 1080x1350. Note centred subjects stay safe; wide ones clip.
Repurpose a 16:9 product demo without re-shooting
A landscape product walkthrough you want native-feeling in the feed. Converting to 4:5 is the lowest-effort repurpose — no re-shoot, one pass, spec-perfect output.
Source: 1920x1080 product demo (product centred) Ratio: 4:5 One pass: centre 4:5 crop → 1080x1350 → H.264 CRF 20 If the product drifts to one side mid-clip: crop manually with video-cropper to follow it, THEN 4:5 format. For a vertical Reel version, use auto-reframe (9:16).
Over-length vlog → first 60 seconds at 4:5
A 3-minute vlog. The formatter keeps only the first 60 seconds. For a hook later in the clip, trim it first.
Source: 180s, 1920x1080 Ratio: 4:5 Applied: -t 60 (keeps 0:00–1:00) Want the 1:30–2:30 segment as a 4:5 post? 1. lossless-trimmer → cut 90–150s (stream-copy) 2. instagram-feed-formatter → Ratio 4:5
Edge cases and what actually happens
Low- or high-framed subject clipped on a 9:16 source
By designConverting a 9:16 clip to 4:5 trims top and bottom from the centre. A subject framed near the bottom (or a caption bar) gets cut. The crop has no awareness of where the subject is — reframe with video-cropper to pick the keep-region, then run the 4:5 pass.
Two-person 16:9 framing loses one person
By designA wide two-shot in 16:9 has subjects near the left and right edges. The centred 4:5 crop keeps only the middle column, so edge subjects are clipped. For interview-style content, crop to a tighter centred composition first, or post as 1:1 instead, which keeps more horizontal extent.
Source longer than 60 seconds is trimmed
By designThe pass applies -t 60 and keeps the first minute — Instagram's in-feed video limit. There is no window picker. Cut the segment you want with lossless-trimmer first (instant, no re-encode), then format to 4:5.
Could not determine video dimensions
ErrorFFmpeg.wasm probes the source for width/height before cropping. A corrupt header, audio-only file, or exotic container can fail with "Could not determine video dimensions." Re-mux via web-optimizer or transcode to a standard MP4 with video-transcoder, then retry.
10-bit / HDR source flattened to SDR
ExpectedOutput is yuv420p (8-bit). A 10-bit HDR portrait clip is converted to 8-bit SDR without tone mapping, so highlights and colour can shift. If colour fidelity matters, grade the clip before formatting — the 4:5 pass optimises for Instagram-app compatibility, not HDR.
Odd-pixel source dimensions
PreservedThe tool forces even crop and output dimensions before handing them to libx264, so an odd-width screen recording won't trip the encoder's "not divisible by 2" error. 1080×1350 is already even, so the 4:5 target is always valid.
Silent clip
SupportedA clip with no audio formats normally; the AAC step has nothing to encode and the output is a valid 1080×1350 MP4. Instagram accepts silent portrait video, though audio generally improves watch time.
You actually wanted full-screen 9:16
Wrong tool4:5 is the tallest the feed shows un-boxed, but it is not full-screen vertical. If your goal is a Reel or Story that fills the phone, 4:5 will letterbox there — use youtube-shorts-formatter (9:16, 1920 tall) or auto-reframe instead.
Already 1080×1350 but re-encoded
ExpectedEven a clip already at the 4:5 spec is re-encoded (no stream-copy path), adding one compression generation. If your file already matches spec and you only want it smaller, use a size-targeted compressor like whatsapp-compressor rather than re-formatting.
File exceeds your tier's size limit
Tier limitFree: 1 GB, 1 file. Pro: 10 GB, 5 files. Pro + Media: 100 GB, 50 files. Developer: 100 GB, unlimited batch. Over the limit the tool prompts an upgrade rather than truncating. Feed clips rarely approach these sizes.
Frequently asked questions
What exact resolution is the 4:5 output?
1080×1350. Output height is fixed at 1350 and 4:5 width is round(1350 × 4/5) = 1080, which is exactly Instagram's documented 4:5 feed spec. The clip displays edge-to-edge in the feed with no auto-crop and no pillarbox.
Why pick 4:5 over 1:1 square?
4:5 occupies more vertical space as the viewer scrolls, which generally lifts dwell time and reach — that is why it is the default for talking-head, lifestyle, and product video. Pick 1:1 instead only when your content needs to keep its full horizontal extent (centred flat-lays, wide compositions) where a portrait crop would lose the sides.
Why not just use 9:16 for even more height?
Because the feed pillarboxes 9:16 — it boxes the sides so you actually lose effective screen area and look like a misplaced Reel. 4:5 is the tallest ratio the feed renders un-boxed. For genuine full-screen vertical (Reels/Stories), use youtube-shorts-formatter or auto-reframe.
Is the 4:5 crop subject-aware?
No — it is a geometric centre crop. For a 16:9 source it trims the sides; for 9:16 it trims top and bottom. There is no face detection, so an off-centre subject can be clipped. Reframe with video-cropper first if your subject isn't centred.
What codec, quality, and audio does it use?
H.264 (libx264, preset medium, CRF 20), yuv420p, AAC audio at 128 kbps, with +faststart. CRF 20 is constant-quality, so there is no bitrate setting and no quality slider — the only control is Ratio. Output is always MP4.
Can I set a target file size?
Not here — quality is locked to CRF 20. If you must hit a size, run the 4:5 output through discord-compressor or whatsapp-compressor (size-targeted), or pin a bitrate with video-bitrate-set.
Does my video get uploaded?
No. The conversion runs entirely in your browser via FFmpeg.wasm; the file never leaves the tab. Signed-in users have a single "processed" counter recorded server-side with no content. Nothing else is stored or transmitted.
What happens to clips longer than 60 seconds?
They are trimmed to the first 60 seconds (-t 60), matching Instagram's feed limit. There is no range picker. To convert a later segment, cut it with lossless-trimmer first, then format the trimmed clip to 4:5.
Which input formats are accepted?
Containers FFmpeg.wasm can decode — MP4, MOV, WebM, MKV and more — with codecs like H.264, HEVC, VP9, and AV1. Output is always H.264 MP4. If probing fails, transcode to a baseline MP4 with video-transcoder first.
Will it add a watermark or force me to sign in?
No watermark. You can process a file on the free tier with no account. Signing in only raises limits (Pro: 10 GB / 5 files; Pro + Media: 100 GB / 50 files; Developer: unlimited batch).
Can I make both a 1:1 and a 4:5 version of the same clip?
Yes — run the formatter twice, once with Ratio 1:1 and once with 4:5. Each produces a separate MP4. There is no batch-export-both option; it is one pass per ratio. For a vertical 9:16 cut as well, add a pass through auto-reframe.
Can I batch-convert a folder to 4:5?
The web UI is one file at a time. Developer tier can automate via the local @jadapps/runner: GET /api/v1/tools/instagram-feed-formatter returns the schema (ratio), then POST each clip to 127.0.0.1:9789/v1/tools/instagram-feed-formatter/run with { ratio: '4:5' }. Everything runs on your machine.
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.