Convert MP4 to WebM
Turn MP4, the most widely supported video container on the web and devices, into WebM, the open web-native video format supported by all modern browsers. FileChanger runs the video conversion in one call, no local tooling to install.
In the browser
Upload a file and download the result, no pipeline required. Open the converter.
One API call
POST the file with from=mp4 and to=webm, get the converted bytes back. Jump to the code.
From an agent
FileChanger ships an MCP server, so agents can run this conversion themselves. See the docs for setup.
Uploading something you care about? How to convert files safely explains what to check before you trust any converter, and Security and data handling describes exactly what we store and for how long.
Convert MP4 to WebM in code
The same call from any language: POST the file to /api/convert, the response body is the converted file.
curl -X POST https://filechanger.io/api/convert \
-H "X-Api-Key: fc_your_api_key_here" \
-F "file=@input.mp4" \
-F "from=mp4" \
-F "to=webm" \
-o output.webmimport requests
with open("input.mp4", "rb") as f:
response = requests.post(
"https://filechanger.io/api/convert",
headers={"X-Api-Key": "fc_your_api_key_here"},
files={"file": f},
data={"from": "mp4", "to": "webm"},
)
response.raise_for_status()
with open("output.webm", "wb") as out:
out.write(response.content)const formData = new FormData();
formData.append("file", fileInput.files[0]);
formData.append("from", "mp4");
formData.append("to", "webm");
const response = await fetch("https://filechanger.io/api/convert", {
method: "POST",
headers: { "X-Api-Key": "fc_your_api_key_here" },
body: formData,
});
const output = await response.blob();import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.file.Path;
String boundary = "----FormBoundary" + System.currentTimeMillis();
byte[] fileBytes = java.nio.file.Files.readAllBytes(Path.of("input.mp4"));
String body = "--" + boundary + "\r\n"
+ "Content-Disposition: form-data; name=\"file\"; filename=\"input.mp4\"\r\n"
+ "Content-Type: application/octet-stream\r\n\r\n"
+ new String(fileBytes) + "\r\n"
+ "--" + boundary + "\r\nContent-Disposition: form-data; name=\"from\"\r\n\r\nmp4\r\n"
+ "--" + boundary + "\r\nContent-Disposition: form-data; name=\"to\"\r\n\r\nwebm\r\n"
+ "--" + boundary + "--";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://filechanger.io/api/convert"))
.header("X-Api-Key", "fc_your_api_key_here")
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(BodyPublishers.ofString(body))
.build();
HttpResponse<byte[]> response = client.send(
request, BodyHandlers.ofByteArray());
java.nio.file.Files.write(Path.of("output.webm"), response.body());import Network.HTTP.Client
import Network.HTTP.Client.MultipartFormData
import qualified Data.ByteString.Lazy as BL
main :: IO ()
main = do
manager <- newManager defaultManagerSettings
initialReq <- parseRequest "POST https://filechanger.io/api/convert"
let req = initialReq
{ requestHeaders = [("X-Api-Key", "fc_your_api_key_here")] }
request <- formDataBody
[ partFileSource "file" "input.mp4"
, partBS "from" "mp4"
, partBS "to" "webm"
] req
response <- httpLbs request manager
BL.writeFile "output.webm" (responseBody response)About MP4
MP4 is the video container the world settled on: H.264 video alongside AAC audio in an MPEG-4 file, played by every phone, browser, smart TV, and editing suite without extra codecs. Cameras, phones, and screen recorders write it by default, which makes it both the usual starting point for a conversion and the safest thing to hand someone else.
About WebM
WebM is the open, royalty-free video format Google built for the web: VP9 or VP8 video with Opus or Vorbis audio, in a container derived from Matroska. Every modern browser plays it natively and browsers also produce it, which is why so many WebM files start life as screen recordings, downloads, and camera captures from a web page rather than as camera footage.
Frequently asked questions
How do I convert MP4 to WebM?
Upload your file in the browser converter and pick WebM as the target, or POST it to /api/convert with from=mp4 and to=webm. The response body is the converted file.
Is converting MP4 to WebM free?
Yes. Every account gets 200 MB of conversions free, metered on input size. After that you pay only for what you convert, from $0.10 per GB, with no monthly fee. See pricing for the paid tiers.
Is there an API for MP4 to WebM conversion?
Yes, this whole conversion is one POST to /api/convert (the code examples above show it in five languages), plus an MCP server so AI agents can run it directly.
Why convert MP4 to WebM?
WebM is royalty-free and, encoded with VP9, usually lands smaller than the equivalent H.264 MP4 at the same visual quality. That makes it the format to serve from your own pages in an HTML5 video element, where bandwidth and codec licensing both matter and every modern browser plays it without a plugin.
Which codecs does the WebM come out with?
VP9 video and Opus audio, the standard modern WebM pairing, encoded at CRF 32. If you want the newer and more efficient AV1 encoding instead, convert to av1 and you get a WebM file with an AV1 video track and the same Opus audio.
Does converting MP4 to WebM lose quality?
The H.264 video is decoded and re-encoded as VP9, so it is a lossy step. CRF 32 on VP9's scale sits at roughly the same visual quality as the CRF 23 we use for H.264, so the WebM should look like the MP4 it came from while taking up less space.