How to format a video for the instagram feed in 1:1 square
- Step 1Open the Instagram Feed Formatter and drop your clip — Drag any MP4, MOV, WebM, or MKV onto the instagram-feed-formatter. The file is read into the browser via FFmpeg.wasm and never uploaded. Free tier handles one file up to 1 GB; Pro raises that to 10 GB and 5 files at once.
- Step 2Set Ratio to 1:1 — The single option panel exposes one control — Ratio — with two choices:
1:1and4:5. Leave it on1:1(the default) for a square. There is no 9:16 here by design; the feed pillarboxes 9:16 content, so vertical clips belong in youtube-shorts-formatter or auto-reframe. - Step 3Check that your subject is centred — The crop takes the centre square of the source. Preview your clip mentally as a centred box: a person standing on the left third, or text in the lower-third, will be clipped. If the subject is off-centre, crop manually first with video-cropper, then run the formatter.
- Step 4Run the format pass — JAD crops to the largest centred square, scales to 1350×1350 with
flags=lanczos, and encodes H.264 CRF 20. A 30-second 1080p clip typically finishes in well under a minute; FFmpeg.wasm speed scales with your CPU and whether the tab is cross-origin isolated (multi-threaded). - Step 5Confirm the 60-second trim — If the source runs longer than 60 seconds, the output is trimmed to the first 60 (
-t 60). There is no in-tool range picker — to choose a specific 60-second window, cut it first with lossless-trimmer, then format the result. - Step 6Download the MP4 and upload to Instagram — The result is a self-contained
.mp4ready for the Instagram app or Creator Studio. The size readout shows input → output bytes; a square 1350×1350 30-second clip is usually a few MB, comfortably under Instagram's feed ceiling.
What the 1:1 pass actually produces
Exact behaviour of the Instagram Feed Formatter when Ratio = 1:1. Values read from lib/video/video-processor.ts (runSocialFormat) — these are the real FFmpeg arguments, not recommendations.
| Property | Value | Note |
|---|---|---|
| Output resolution | 1350×1350 | Height is fixed at 1350; for 1:1 the width equals the height. The popular "1080×1080" is a minimum, not what this tool emits |
| Crop | Centre square (crop=W:H:(in_w-W)/2:(in_h-H)/2) | Mathematical centre — no face or saliency detection. Largest square the source allows is taken, then scaled |
| Scaler | scale=1350:1350:flags=lanczos | Lanczos preserves edge detail when down- or up-sampling to the target |
| Video codec | H.264 (libx264 -preset medium -crf 20) | CRF 20 is visually near-lossless; preset medium balances speed and size. No bitrate/CRF control is exposed |
| Pixel format | yuv420p | 8-bit 4:2:0 — the only chroma format the Instagram app reliably decodes without green-tint artefacts |
| Audio | AAC, 128 kbps | Re-encoded; the source audio track is preserved and converted, not dropped |
| Container flags | -movflags +faststart | moov atom moved to file head for progressive playback in the feed |
| Length cap | First 60 seconds (-t 60) | Longer sources are silently trimmed to 60 s; no range picker in this tool |
When 1:1 is the right call vs other IG formats
Choosing square over portrait or vertical. Only 1:1 and 4:5 exist inside this tool; 9:16 lives in sibling tools.
| Source / goal | Best format | Where to do it |
|---|---|---|
| Centred product, flat-lay, logo sting | 1:1 square | This tool, Ratio = 1:1 |
| Talking head, lifestyle, max feed footprint | 4:5 portrait | This tool, Ratio = 4:5 — see the 4:5 portrait guide |
| Reels / Stories full-screen vertical | 9:16 | Not here — use youtube-shorts-formatter (9:16, 1920 tall) or auto-reframe |
| Subject sits off to one side | Manual crop first, then square | Crop with video-cropper, then format |
| Already square but oversized file | 1:1 re-encode at CRF 20 | This tool shrinks via re-encode; for a hard size target use discord-compressor |
Cookbook
Real source-to-square scenarios. Dimensions and crops are the exact math runSocialFormat applies for Ratio = 1:1.
1080p widescreen flat-lay → centred square
A 1920×1080 overhead flat-lay of a product on a table. The subject is centred, so a centre-crop loses only the empty left/right margins. The tool takes the tallest square (1080×1080 of source), then scales up to 1350×1350.
Source: 1920x1080 (16:9), subject centred
Ratio: 1:1
Crop step: crop=1080:1080:(1920-1080)/2:(1080-1080)/2
→ takes centre 1080x1080 block
Scale step: scale=1350:1350:flags=lanczos
Encode: libx264 -preset medium -crf 20 -pix_fmt yuv420p
Output: 1350x1350 MP4, faststart, AAC 128kVertical phone clip → square (top and bottom trimmed)
A 1080×1920 portrait phone clip. Because the source is taller than square, the crop keeps the full width and trims height from top and bottom equally — so a logo in the top bar or captions at the very bottom will be cut.
Source: 1080x1920 (9:16)
Ratio: 1:1
Crop step: crop=1080:1080:0:(1920-1080)/2
→ keeps full width, trims 420px off top AND 420px off bottom
Scale step: scale=1350:1350:flags=lanczos
Watch out: anything in the top/bottom 420px is gone.
Reframe with video-cropper first if your subject is high or low.Already-1080×1080 square just needs the right codec
A clip exported square from another editor but in HEVC/H.265 that the Instagram app sometimes mis-handles. Running it through the 1:1 pass re-encodes to H.264 yuv420p and upscales to 1350 — fixing the codec without manual settings.
Source: 1080x1080 (already square), HEVC Ratio: 1:1 Crop step: crop=1080:1080:0:0 (no edges to remove) Scale step: scale=1350:1350:flags=lanczos (mild upscale) Encode: libx264 yuv420p → H.264 the IG app expects Output: 1350x1350 H.264 MP4. Codec fixed, no options touched.
Ultra-wide 21:9 clip → heavy side crop
A 2560×1080 cinematic clip. The centre square is only 1080 wide, so the tool discards a large portion of the left and right. Verify nothing important lives near the edges before committing.
Source: 2560x1080 (21:9 ultra-wide)
Ratio: 1:1
Crop step: crop=1080:1080:(2560-1080)/2:0
→ discards 740px from EACH side
Scale step: scale=1350:1350:flags=lanczos
Result: only the centre 42% of the frame survives.
For ultra-wide subjects at the edges, crop manually first.75-second clip → first 60 seconds, squared
A 75-second source. The formatter has no range picker — it always keeps the first 60 seconds. To square a later segment, trim it first.
Source: 75s, 1920x1080 Ratio: 1:1 Applied: -t 60 (keeps 0:00–1:00, drops the last 15s) Need seconds 60–120 instead? 1. lossless-trimmer → cut 60–120 (stream-copy, no re-encode) 2. instagram-feed-formatter → Ratio 1:1 on the trimmed clip
Edge cases and what actually happens
Subject is off-centre and gets clipped
By designThe crop is (in_w-cropW)/2 — pure geometric centre. There is no face detection or saliency tracking. If your speaker stands in the left third or your product sits low in frame, the square crop removes them. Reframe with video-cropper to choose the exact region, then run the 1:1 pass on the cropped result.
Expected 1080×1080 but got 1350×1350
ExpectedThe tool targets 1350 px tall for both ratios (1:1 → 1350×1350, 4:5 → 1080×1350). 1080×1080 is Instagram's documented minimum, not a maximum — the platform accepts and downsamples a larger square, and feeding it cleaner source pixels reduces compounding compression loss. This is intentional, not a bug.
Source longer than 60 seconds is trimmed
By designFeed video maxes at 60 seconds, so the pass applies -t 60 and keeps the first minute. There is no UI to pick a different window. Cut the segment you want with lossless-trimmer first (stream-copy, instant, no quality loss), then format.
Could not determine video dimensions
ErrorIf FFmpeg.wasm can't probe width/height — a corrupt header, an unusual container, or an audio-only file — the pass throws "Could not determine video dimensions" before encoding. Re-mux the file (try web-optimizer) or transcode to a standard MP4 with video-transcoder first.
Odd-pixel source dimensions
PreservedH.264 yuv420p requires even width and height. The tool forces even crop dimensions (cropW -= cropW % 2) and an even output width, so an odd-pixel source (e.g. 1079-px-wide screen recording) is handled automatically — no "width not divisible by 2" encoder failure.
HDR / 10-bit source loses tone mapping
ExpectedOutput is forced to yuv420p (8-bit). A 10-bit HDR source is converted to 8-bit SDR during encode — colours may shift versus the original because no HDR tone-mapping curve is applied. For SDR-faithful results, grade the clip first; the formatter prioritises Instagram-app compatibility over HDR fidelity.
No audio track in source
SupportedA silent clip formats fine; the AAC audio step simply has nothing to encode and the output is a valid square MP4 with no audio. Instagram accepts silent feed video, though a soundtrack generally lifts watch time.
Vertical 9:16 source you actually wanted to keep vertical
Wrong toolIf you feed a 9:16 clip and pick 1:1, the top and bottom are cropped away — usually not what a Reel creator wants. For a full-height vertical export use youtube-shorts-formatter (9:16, 1920 tall) or auto-reframe, which keep the vertical canvas.
File exceeds your tier's size limit
Tier limitFree tier caps a single video at 1 GB; Pro at 10 GB (up to 5 files); Pro + Media at 100 GB (up to 50 files); Developer at 100 GB with no batch cap. Over the limit, the tool prompts to upgrade rather than silently truncating. Most short feed clips are nowhere near these ceilings.
Already-correct square re-encoded anyway
ExpectedEven a clip that is already 1350×1350 H.264 is re-encoded (there is no stream-copy/lossless path in the formatter). That means one extra generation of compression. If your clip already matches spec and you only want to shave file size, use a size-targeted tool like discord-compressor instead of re-formatting.
Frequently asked questions
What resolution does the 1:1 square output?
1350×1350. The formatter fixes output height at 1350 for both ratios, so a square comes out 1350×1350 (and 4:5 comes out 1080×1350). The widely quoted 1080×1080 is Instagram's minimum acceptable square, not the cap — Instagram happily takes a larger square and downsamples it, and a higher-resolution source survives Instagram's own re-encode with fewer artefacts.
Is the square crop smart / face-aware?
No. It is a centre crop: the tool takes the largest square centred on the frame using (in_w-cropW)/2 offsets. There is no face detection or subject tracking. If your subject is off-centre, the crop will clip it — reframe first with video-cropper, which lets you pick the exact region to keep, then run the 1:1 pass.
Why is there no 9:16 / Reels option in this tool?
The Instagram Feed Formatter is scoped to the feed, which uses 1:1 and 4:5. The feed pillarboxes 9:16 content, so a vertical export here would waste canvas. For 9:16 Reels and Stories, use youtube-shorts-formatter (9:16 at 1920 px tall) or auto-reframe, which keep the full vertical frame.
What codec and bitrate does it use?
H.264 via libx264 at preset medium and CRF 20, with yuv420p pixel format and AAC audio at 128 kbps. CRF 20 is constant-quality (visually near-lossless), so there is no fixed bitrate and no slider — the encoder spends bits where the picture needs them. +faststart is added for progressive feed playback.
Can I control the quality or file size?
Not in this tool — the only control is Ratio (1:1 or 4:5); quality is locked to CRF 20. If you need to hit a specific file size, run the squared output through a size-targeted compressor like discord-compressor or whatsapp-compressor, or set an explicit bitrate with video-bitrate-set.
Will my clip be uploaded anywhere?
No. Processing runs entirely in your browser through FFmpeg.wasm. The video bytes never leave the tab — no server upload, no temporary cloud storage. The only thing recorded server-side (if you are signed in) is a single counter that a file was processed, with no content.
What input formats can I drop in?
Standard containers FFmpeg.wasm decodes — MP4, MOV, WebM, MKV, and more — with common codecs like H.264, HEVC, VP9, and AV1. Output is always H.264 MP4. If a file fails to probe, transcode it to a baseline MP4 with video-transcoder first, then format.
My clip is longer than 60 seconds — what happens?
It is trimmed to the first 60 seconds (-t 60), matching Instagram's in-feed limit. There is no range picker. To square a different window, cut it first with lossless-trimmer (instant, stream-copy, no re-encode) and run the formatter on the trimmed clip.
Does it add a watermark or require sign-in?
No watermark, ever. You can process a file on the free tier without an account. Signing in only raises your size/batch limits (Pro: 10 GB and 5 files; Pro + Media: 100 GB and 50 files; Developer: unlimited batch) and enables dashboard stats.
Why does my already-square clip still get re-encoded?
The formatter always crops, scales, and re-encodes — there is no lossless/stream-copy path. So a clip that is already square still passes through libx264 once more. That is fine for a final upload, but if your clip already matches spec and you only want a smaller file, skip the formatter and use a compressor tool to avoid a needless generation of loss.
How does this compare to letting Instagram crop it?
If you upload a non-square clip, the Instagram app crops to its own choice and re-encodes — you lose control over what stays in frame and add a compression pass on top of whatever you uploaded. Pre-formatting to 1:1 at 1350×1350 H.264 lets you decide the framing and hands Instagram clean, spec-matching source so its own encoder does less damage.
Can I automate squaring a whole folder of clips?
The web UI processes one file at a time. For unattended batches, Developer tier can drive the same operation through the local @jadapps/runner: GET /api/v1/tools/instagram-feed-formatter returns the option schema (ratio), then POST each file to 127.0.0.1:9789/v1/tools/instagram-feed-formatter/run with { ratio: '1:1' }. Everything still runs on your machine — no clip is uploaded.
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.