Convert video
Convert video writes MP4 (H.264), WebM (VP8), or MOV. Same-family remux uses stream copy when it can; otherwise it re-encodes. Exotic inputs may decode and still fail an encode, I'll show an error rather than a broken file.
Convert, trim, compress, GIF, extract audio, mute, resize, rotate, and merge video in the tab with FFmpeg.wasm. The clip isn't uploaded.
Runs in your browser · Nothing uploaded
Video is the category upload sites love most: a 200 MB file, a progress bar, an email with a link. These pages load a local FFmpeg build once (about 30 MB, then cached) and do the work in the tab. First visit of a video tool pays for the encoder. Your file is still not POSTed.
Outputs I actually ship are MP4, WebM, and MOV for conversion, plus GIF and extracted audio. I'm not advertising AVI, MKV, or FLV as first-class destinations. Long clips are slower here than on a rented GPU farm because they never leave the machine. That's the deal.
The encoder is GPL FFmpeg compiled to WebAssembly, single-thread, same origin. There's no COEP experiment that would break Analytics and the rest of the static site.
Convert video writes MP4 (H.264), WebM (VP8), or MOV. Same-family remux uses stream copy when it can; otherwise it re-encodes. Exotic inputs may decode and still fail an encode, I'll show an error rather than a broken file.
Trim video cuts a start and end time. Re-encode keeps the cut close to the times you typed. A 30-minute source doesn't need a 30-minute wait if you set a short window.
Compress video uses CRF or a one-pass bitrate guessed from a target size. There's no multi-encode binary search in wasm; that would mean encoding the clip over and over in a browser tab.
Video to GIF runs the two-pass palette recipe at a width and frame rate you pick. Default 320px and 10 fps is a reaction GIF, not a film print. You can limit the time range so a 30-second source doesn't become a 30-second GIF by accident.
Extract audio drops the picture and writes MP3, WAV, or AAC. Same job as Audio from video; two URLs because people search both phrases. No audio stream means an error, not a silent success.
Mute video strips the soundtrack and keeps the picture, via stream copy when the container allows it. For a clip you can send without the room noise, that's enough.
Resize video scales to a width, with aspect locked by default (even height). 4K phone clips for a slide deck are the use. Unchecking aspect will squash on purpose.
Rotate video is 90, 180, or 270 for the phone clip that was sideways. 90 and 270 transpose; 180 flips. Not an arbitrary-angle 3D rotate.
Merge clips concatenates two or more files in order. Matching formats can stream-copy; mismatches re-encode. It won't auto-letterbox mixed resolutions into a pretty sequence.
Extract frames writes PNGs at a frame rate you pick and zips them. High fps on a long clip will fill memory. Contact sheet is the one-image cousin.
Reverse video plays the clip backwards, audio included, and caps at 20 seconds so a feature film doesn't live in RAM.
Change video speed uses setpts and atempo. 2 is twice as fast. Pitch stays put. The whole file is re-encoded.
Crop video is a numeric rectangle, same idea as image crop, no drag box. Even width and height.
Split video cuts N equal parts into a zip. Arbitrary cue points are trim, not this page.
Watermark video overlays a logo. Clip first, then the image. Alpha in the PNG is opacity.
Replace audio swaps the soundtrack. Clip first, then audio. The shorter stream wins.
Video contact sheet tiles frames into one PNG (3×3 at 1 fps). Short clips may not fill the grid.
Boomerang concatenates forward and reverse, no audio, 8 second cap. The Instagram-era loop.
No. After the page and the local encoder load from this origin, the bytes of your file stay in the tab. The network panel should show ffmpeg-core.wasm once, not a POST of the movie.
Those sites use someone else’s CPUs, which is also why they have your file. This page uses yours. A short 1080p clip is fine. A half-hour 4K dump belongs in HandBrake on the desktop.
FFmpeg compiled to WebAssembly, GPL. It runs in your tab; I didn't relicense it. The rest of the site is still static files. If GPL is a problem for how you use the output, that's a conversation with a lawyer, not a badge I'll fake.
There is no server to upload to. Each page is a static file, and the work happens in your browser. Your file is read from disk into memory, processed, and handed back as a download. Once the page has loaded you can disconnect from the network and it keeps working. The longer explanation