How to flip a video horizontally for a mirror effect
- Step 1Drop your video onto the tool — Drag the clip onto the Flip tool or click to browse. It accepts MP4, MOV, MKV, WEBM, AVI, M4V and TS. The file is read into your browser's memory only — nothing is uploaded.
- Step 2Leave the Axis dropdown on h — The Flip axis panel has a single Axis control. h (the default) applies
hflipfor a left-to-right mirror. Leave it on h for a horizontal flip; switch to v only if you actually want the upside-down vertical flip. - Step 3Run the flip — JAD invokes FFmpeg with
-vf hflipand re-encodes the video stream once usinglibx264 -preset medium -crf 20. There are no quality, preset, or resolution sliders to set — CRF 20 is fixed and near-visually-lossless. - Step 4Wait for the single pass to finish — Flipping requires a full re-encode (it is not stream-copy), so expect roughly real-time-to-a-few-times-real-time depending on resolution and your CPU. A progress indicator tracks the FFmpeg
time=output. - Step 5Download the mirrored MP4 — The result is delivered as an H.264 MP4 with the audio copied unchanged. The output filename is your source name with
-out.mp4appended. - Step 6Verify text and logos read correctly — Play the first few seconds. Any on-screen text, watermark, or logo will now be reversed — that is expected for a mirror. If you only wanted to fix orientation and the text must stay readable, you wanted a rotation, not a flip; use the rotator instead.
What the horizontal flip changes (and what it leaves alone)
Behaviour of the hflip pass as implemented in runFlip. CRF and preset are fixed in code — there are no sliders for them.
| Aspect | Behaviour | Why |
|---|---|---|
| Pixel orientation | Left-to-right mirror across the vertical centre line | -vf hflip reverses every column |
| Audio track | Copied byte-for-byte (-c:a copy) | No re-encode of sound — stays in sync, no quality loss |
| Video codec | Re-encoded to H.264 (libx264) | Filtering pixels requires a re-encode; stream-copy is impossible |
| Quality | Fixed CRF 20, -preset medium | Near-visually-lossless default; not user-adjustable here |
| Output container | Always .mp4 | Output name is fixed to .mp4 regardless of input container |
| Resolution / frame rate / duration | Unchanged | hflip only mirrors; it does not scale, retime, or trim |
Accepted inputs and tier limits
Inputs come from the VIDEO_ACCEPT list in the client; size and batch limits come from lib/tier-limits.ts (video family).
| Item | Value |
|---|---|
| Accepted containers | MP4, MOV, MKV, WEBM, AVI, M4V, TS |
| Output | Single H.264 MP4 (1 file in, 1 file out) |
| Free tier max size | 1 GB per file, 1 file |
| Pro tier | 10 GB per file, 5 files |
| Pro-media tier | 100 GB per file, 50 files |
| Developer tier | 100 GB per file, unlimited files |
Cookbook
Concrete mirror-flip situations and the exact result. The tool does one thing per run — apply hflip — so the cookbook is about knowing when a horizontal flip is the right move versus a rotation, crop, or resize.
Mirror a screen-recorded demo that exported reversed
Some capture presets save a horizontally inverted file. hflip restores correct orientation. Note: any UI text in the recording will now read normally again only if it was reversed to begin with.
Input: demo-capture.mov (1920x1080, H.264, AAC) Axis: h (hflip) FFmpeg: -i demo-capture.mov -vf hflip -c:v libx264 -preset medium -crf 20 -c:a copy out.mp4 Output: demo-capture-out.mp4 (mirrored, audio identical)
Match orientation across two camera angles in an edit
When B-roll faces the opposite direction from your A-cam, a horizontal flip makes eyelines and motion match before you cut between them.
Input: broll-angle2.mp4 Goal: subject should look screen-left to match A-cam Axis: h Result: broll-angle2-out.mp4 — motion direction reversed, durations untouched
Don't use flip for a sideways phone clip
A 90-degree-wrong phone video is a ROTATION problem, not a mirror. hflip will not un-rotate it — it will mirror an already-sideways frame.
Symptom: clip is sideways (90deg off) Wrong: Axis h -> still sideways, now also mirrored Right: use the rotator -> /video-tools/video-rotator (transpose 90/270)
Mirror, then crop to a square for social
Flip first, then hand the MP4 to the cropper. The flip output is a standard H.264 MP4 that every other JAD video tool accepts directly.
Step 1: Flip (Axis h) -> clip-out.mp4 Step 2: drop clip-out.mp4 into /video-tools/video-cropper -> 1:1 crop Step 3: download square mirrored clip
Confirm audio stayed in sync after the flip
Because audio is stream-copied, lip-sync is preserved exactly. If you ever see drift, it was present in the source — the flip does not retime audio or video.
Check: -c:a copy means the AAC track is unchanged. The video PTS are preserved by hflip; only spatial layout changes. Sync after = sync before.
Edge cases and what actually happens
Burned-in text now reads backwards
By designA horizontal mirror reverses everything in the frame, including hardcoded captions, lower-thirds, and timestamps. There is no way to mirror the picture but keep text forward in a single hflip pass. If readable text matters and you only need orientation fixed, you likely want a rotation, not a flip.
Logo or watermark is now reversed
ExpectedBrand logos in the source frame flip with everything else and will look wrong. Apply your overlay AFTER flipping (with the watermark tool), not before, so the logo stays correct on the final mirrored frame.
Clip is sideways and flip didn't fix it
Wrong toolhflip mirrors; it does not rotate. A 90/180/270-degree orientation problem needs the rotator (transpose). Mirroring a sideways frame leaves it sideways and reversed. Use /video-tools/video-rotator.
Wanted a true 180-degree turn, got a left/right mirror
Wrong toolA 180-degree rotation (hflip + vflip combined) is NOT available here — the Axis dropdown picks one axis only. For an actual upside-down-and-reversed result use the rotator's 180 option, which is a single correct operation.
Input was WEBM or MKV — output came back MP4
By designThe flip always writes an H.264 MP4 no matter the input container. This is normal; the MP4 is broadly compatible. If you specifically need the result back in WEBM, run the MP4 through the transcoder afterward.
Re-encode took longer than expected
ExpectedFlipping is a full libx264 re-encode at CRF 20, not a stream-copy, so it is slower than lossless operations like trim or merge. 4K and long clips take proportionally longer; this is the cost of touching every pixel.
File larger than the tier limit
RejectedFiles above your tier's per-file size are blocked before processing: 1 GB on Free, 10 GB on Pro, 100 GB on Pro-media and Developer. Compress first or upgrade.
Slight quality change after flipping
ExpectedAny filter that re-encodes loses a small amount of fidelity versus the source. CRF 20 is near-visually-lossless and fixed in code — there is no quality slider on the flip tool. For maximum fidelity round-trips, prefer doing all edits in one pass elsewhere.
Audio came through untouched
PreservedThe audio stream is copied with -c:a copy, so it is bit-identical to the source and stays in sync. Only the video stream is filtered and re-encoded.
Frequently asked questions
What does a horizontal flip actually do?
It mirrors the frame left-to-right across the vertical centre line — the same inversion a mirror produces. JAD applies FFmpeg's hflip filter, which reverses every column of pixels. The result reads as a mirror image of the original.
Is the video uploaded anywhere?
No. The flip runs entirely in your browser via FFmpeg.wasm. Your file is read into local memory, processed, and downloaded — it never touches a server.
Does flipping hurt quality?
Flipping requires a full video re-encode (stream-copy is impossible when you change pixels), so there is a small, usually invisible quality cost. JAD encodes with libx264 -preset medium -crf 20, which is near-visually-lossless. The audio is copied unchanged, so sound quality is untouched.
Will my audio stay in sync?
Yes. The audio track is stream-copied with -c:a copy, so it is identical to the source and stays in sync. hflip preserves the video timestamps, so picture and sound remain aligned.
Can I flip horizontally and vertically at the same time?
Not in one pass — the Axis dropdown lets you choose h or v, not both. A combined flip equals a 180-degree rotation; for that, use the rotator's 180 option at /video-tools/video-rotator, which is a single correct operation.
Why is the on-screen text now backwards?
Mirroring reverses everything in the frame, including burned-in captions and logos. That is unavoidable for a true mirror. If you only need orientation corrected and the text must remain readable, you probably want a rotation rather than a flip.
What output format do I get?
Always an H.264 MP4, regardless of input container. If you need a different container such as WEBM, run the MP4 through the transcoder at /video-tools/video-transcoder afterward.
What input formats are supported?
MP4, MOV, MKV, WEBM, AVI, M4V and TS. All are normalised to an H.264 MP4 on output.
My clip is sideways — will flipping fix it?
No. hflip mirrors, it does not rotate. A sideways clip is a rotation problem; use the rotator at /video-tools/video-rotator and pick 90 or 270 degrees.
Is there a file-size limit?
Yes, by tier: Free 1 GB per file (1 file), Pro 10 GB (5 files), Pro-media 100 GB (50 files), Developer 100 GB (unlimited files). There is no duration cap — only file size and batch count.
Can I flip only part of the video?
No — the flip applies to the entire clip. To flip a single segment, trim it out with the lossless trimmer, flip that piece, then stitch it back with the merger.
Can I batch-flip several files at once?
The flip tool processes one file per run (acceptsMultiple is false). Run each clip individually. For multi-file workflows, do each flip then combine results with the merger.
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.