Cookies for analytics and advertising
We use cookies for analytics and advertising, both sent to Google. Refusing changes nothing you can see.Read the privacy page
Converting WebM to AAC gives you the audio as a raw ADTS stream rather than a container — AAC frames one after another, which is what a segmenter, a broadcast encoder or an embedded player means when its documentation asks for AAC. The Opus inside the WebM is decoded and re-encoded in your browser, so nothing is uploaded and nothing is rate-limited.
Up to 100 files at once. Mixed formats are fine.
They convert one after another and download together as a ZIP.
WebM to AAC
There are two things people mean by "AAC". One is the codec, which is also what sits inside every M4A, every MP4 and every streamed track from a major service. The other is the elementary stream: the encoded frames on their own, with no container around them. This conversion produces the second.
That distinction decides whether you are on the right page. If the goal is a recording you can add to a music library, give a title and press play on, the M4A conversion is the one you want and this one will make your life harder. If something in a pipeline has told you it wants AAC and rejected an MP4, this is the file it was asking for.
ADTS stands for Audio Data Transport Stream, and its design goal is that any point in the file is a valid starting point. Every frame carries a seven-byte header stating the profile, the sample rate and the channel configuration, so a decoder that joins halfway through knows immediately how to interpret what follows.
That is exactly what broadcast and streaming need. An HLS segmenter can cut a stream at a frame boundary and each piece stands alone. Two streams can be concatenated with nothing more than a byte-level join and the result is valid. An embedded player with a few kilobytes of buffer can start decoding without parsing an index it does not have room for. None of that is true of an MP4, where the index lives in one place and describes everything.
Everything the container was doing is now absent. There is no stored duration, so players compute the length by scanning frames or, more often, estimate it from the bitrate and get it wrong on variable-rate audio. There is no seek table, so jumping to a position is a calculation rather than a lookup. There is nowhere to write a title, an artist or a date.
For a machine reading the stream once, from the beginning, none of that matters — which is why the format survives. For a person with a media player it matters immediately, and it is the reason an `.aac` file so often shows a plausible but wrong duration in a file browser. If that bothers you, the file wanted to be an M4A.
AAC was standardised by MPEG in 1997 as ISO/IEC 13818-7 and has been the default for delivery ever since — broadcast, streaming, mobile, Apple’s catalogue. It handles up to 48 channels, though anything from a browser recording is mono or stereo.
What went in was Opus, which is a newer and generally better codec that almost nothing outside a browser accepts. Converting between them is a full decode and re-encode: two lossy codecs cannot exchange data directly, so this is a second generation of compression. For speech it is inaudible, and for a pipeline it is usually irrelevant next to whatever compression the delivery chain applies afterwards.
The common shape of this problem is a web application that records through the browser. `MediaRecorder` writes WebM with Opus because that is what browsers are required to support, and the recording then has to enter a backend that was designed around AAC — an ingest service, a transcoding farm, a telephony platform, an app bundle with a fixed asset format.
Converting on the client side, before the upload, is often the cheaper architecture. The file that crosses the network is already in the format the backend wanted, no server has to run a transcoder per recording, and there is nothing to queue. That is the same reasoning that put this conversion in the browser in the first place.
Opus operates at 48 kHz, so a browser recording is 48 kHz and the AAC written from it is 48 kHz. The channel count is likewise whatever was captured — mono for a microphone, stereo for anything that recorded system audio.
Nothing here resamples, and that is deliberate: resampling is a signal-processing decision with its own quality trade-offs, and a converter that silently did it would be hiding a step. If a target platform requires 44.1 kHz, or a specific channel layout, do that conversion in the tool that has the requirement, where the resampler is one you chose.
Any video track in the WebM is discarded outright rather than ignored, which is the point when the source is a screen capture with narration. Only the first audio track survives; a recording that captured a microphone and system audio as separate tracks yields one of them with no way to choose.
For a pipeline this is worth asserting rather than assuming. If the recorder on the other end of your system writes two tracks, verify which one arrives before the behaviour becomes a bug report about missing audio three weeks later.
It is worth ruling out the wrong use before it costs somebody an afternoon. Pointing an `<audio>` element at an `.aac` file is unreliable: browsers vary in whether they will parse a raw ADTS stream, and the ones that do often report a wrong duration because there is nothing in the file to tell them the real one. The seek bar then behaves oddly and the bug looks like a player problem.
For anything played in a browser, the same audio in an M4A works everywhere and behaves correctly, because the container carries the duration and the index. Keep the ADTS stream for the pipeline that asked for it and use a container for anything a person interacts with — that division is what the two formats are actually for.
Up to a hundred WebM files convert in one pass, each with its own progress, downloading together as a ZIP. Because there is no server involved, there is no daily quota and no queue; the per-file ceiling is 100 MB.
That is the practical difference for anyone doing this as part of a job rather than once. A free converter that uploads will cap you somewhere between five and twenty files a day; here the hundred can be dropped again immediately, and it behaves the same on the hundredth file as on the first.
| WebM | AAC | |
|---|---|---|
| Full name | WebM Video | Advanced Audio Coding |
| File extension | .webm | .aac |
| Media type | video/webm | audio/aac |
| Compression | Lossy — file size is bought with quality | Lossy — file size is bought with quality |
| First published | 2010 | 1997 |
| Published by | MPEG | |
| Specification | — | ISO/IEC 13818-7 |
| Licensing | Open standard | Open standard |
| Standing today | Current | Current |
| Audio channels | — | up to 48 |
| Opens in a browser | Every browser | Every browser |
| Considered instead | MP4, MKV | MP3, OPUS |
VLC and FFmpeg read both WebM and AAC, so there is a way to check the result against the original without a second tool.
AAC comes from MPEG and dates from 1997, specified as ISO/IEC 13818-7. VLC, FFmpeg and iTunes all read it.
The codec is identical; the packaging is not. This page writes a bare ADTS stream — AAC frames, each with its own header, one after another. M4A wraps the same frames in an MP4 container with an index and room for tags. If you want a file to double-click, take the M4A. If a specification asked for AAC, take this.
Usually, but not always, and that is the honest answer. VLC and FFmpeg-based players handle ADTS without complaint. Some music libraries, some phone file browsers and some editors expect a container and either refuse it or import it with the wrong duration. That is not a defect in the file; it is what an elementary stream is.
Because an ADTS stream has no header describing the file as a whole. There is no index and no stored duration — a player works out the length by scanning frames, and some estimate instead. Seeking is approximate for the same reason. Containers exist precisely to solve this, which is why M4A is the better choice for anything a human will scrub through.
Yes, and it is the property the format is built around. Every ADTS frame carries its own sample rate and channel configuration, so joining two streams with `cat` produces a valid third one. Doing the same to two MP4 files produces rubbish. This is why segmenters and broadcast chains want the elementary stream.
No. The Opus is decoded and the AAC encoded inside your browser. For a build pipeline that also means no service dependency and no rate limit — the conversion works the same whether you run it once or over a folder.
Whatever the WebM already had, carried across unchanged. Browser-recorded Opus runs at 48 kHz, so that is the usual answer, in mono or stereo depending on how it was captured. If your target requires 44.1 kHz or a specific channel layout, resample in the tool that has the requirement.