Convert Video to H.264 MP4

Force-transcode any clip to the most universally playable form — H.264 High profile, yuv420p, +faststart, AAC. Makes videos that won't play work everywhere. Runs in your browser, nothing is uploaded.

Try:
H.264 MP4 video

Convert any video to universally-playable H.264 MP4

Some videos just won't play — a .webm that Safari refuses, a 10-bit HEVC clip an old TV can't decode, a 4:2:2 export a phone chokes on, an .mkv a web page won't accept. The fix is almost always the same: re-encode to the one video form that decodes essentially everywhereH.264 video in an MP4 container, 8-bit 4:2:0 (yuv420p) chroma, with +faststart and AAC audio.

This tool always applies that exact recipe. Drop in any clip and you get a normalized .mp4 that plays in every modern browser, phone, TV, and editor. Everything runs locally with ffmpeg compiled to WebAssembly — your file is never uploaded to a server.

What "make it play anywhere" actually means

Profile — the compatibility dial

Worked example

Take a 1-second clip.webm (VP9 video + Opus audio) that won't play in Safari. Leave Profile on High and Quality at 75, drop the file in, and out comes clip.mp4: same 64×64 frame and ~1s duration, but now H.264 High / yuv420p with AAC audio — plays in Safari, on an iPhone, and in a plain <video> tag. Pick the Maximum compatibility preset instead and the same clip comes out as Constrained Baseline for old hardware.

Limits

FAQ

How is this different from mov-to-mp4 or video-transcode?

mov-to-mp4 stream-copies (-c copy) when it can — it keeps whatever codec and pixel format the source already has, so it does not guarantee H.264 High or yuv420p. video-transcode switches the container/codec (MP4 ⇆ WebM) and never pins a profile or pixel format. This tool always re-encodes and always forces H.264 + a chosen profile + yuv420p + +faststart — its entire job is the "make it play anywhere" normalize, not container conversion or size reduction.

Why does my video play now when it didn't before?

The most common culprits are a codec or pixel format the target can't decode: a VP9/AV1 .webm, a 10-bit HEVC clip, or 4:2:2 / 4:4:4 chroma from a pro camera. Re-encoding to H.264 with -pix_fmt yuv420p collapses all of those to the 8-bit 4:2:0 H.264 that virtually every decoder supports, so the picture shows up instead of a black frame or an "unsupported format" error.

Which profile should I choose?

Leave it on High — it plays on every browser and device from roughly 2012 onward and compresses best. Only switch to Baseline if a specific old or embedded player (a legacy set-top box, an ancient phone, some hardware decoders) refuses the file; Baseline drops B-frames and CABAC for maximum reach at the cost of a larger file. Main sits in between.

Does the quality slider make it lossless?

No — this tool always re-encodes, so there is no bit-for-bit lossless mode. The slider maps 1–100 onto a practical slice of libx264's CRF scale (higher = better quality and a larger file): 100 is visually lossless (CRF 18), the default 75 is roughly CRF 24, and 1 is small and low quality (CRF 40). If you need a true lossless container change and your source is already H.264/HEVC, use mov-to-mp4 in remux mode instead.

Is my video uploaded anywhere?

No. The conversion runs entirely in your browser using ffmpeg compiled to WebAssembly — the file never leaves your device, and the page works offline once it has loaded.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool video-to-h264 'url=https://example.com/input' 'profile=high' 'quality=75'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/video-to-h264/?url=https://example.com/input&profile=high&quality=75