✳ OMNIVIEWER MP3 viewer Anatomy of an MP3 ← back

AAC, M4A & the licensing catch

The MP3 EXPORT tab offers M4A/AAC alongside WAV, FLAC, Opus and Ogg Vorbis — but AAC is the one format with an asterisk. Here is what AAC and the M4A container actually are, why an MP3 → AAC conversion is a second lossy pass, and the patent-licensing reason a free, in-browser converter cannot simply ship the best AAC encoder in existence.

On this page AAC vs M4A Inside an .m4a The second-generation-loss problem The licensing catch What we ship, and why Which format to pick

AAC is a codec; M4A is a container

AACAdvanced Audio Coding, standardised in MPEG-2 Part 7 (1997) and extended in MPEG-4 Part 3 (1999) — is the lossy audio codec Apple, YouTube and broadcast built on. It was designed as MP3's successor and is genuinely better per bit, especially below 128 kbps, thanks to a longer filter bank, better joint-stereo, temporal noise shaping and (in the HE-AAC profiles) spectral band replication.

M4A is not a codec at all — it is a filename convention for an MP4 container (ISO Base Media File Format, ISO/IEC 14496-12) that happens to hold only audio. The very same bytes renamed .mp4 would play identically. So “M4A/AAC” is really “AAC audio wrapped in an MP4 box tree,” the way “MP3” is “MPEG audio in a raw frame stream.”

Rule of thumb. .aac = raw AAC frames (ADTS). .m4a / .mp4 = AAC (or ALAC) inside an MP4 container with an index, so players can seek and read metadata without scanning. OmniViewer exports the container form (.m4a) because that is what phones and music apps expect.

Inside an .m4a: the box tree

Where an MP3 is a flat run of self-describing frames, an MP4/M4A is a tree of length-prefixed boxes (also called “atoms”). Each box is [4-byte big-endian size][4-char type][payload], and boxes nest. A minimal audio file:

┌─ ftyp ─ file type & brand ────────────  "M4A ", "isom", "mp42"
├─ moov ─ movie metadata (the index) ───
│    ├─ mvhd  movie header (timescale, duration)
│    ├─ trak  one audio track
│    │    └─ mdia → minf → stbl  ← the sample tables
│    │         ├─ stsd  sample description
│    │         │    └─ mp4a → esds   ← "this is AAC-LC, N channels, R Hz"
│    │         ├─ stts  sample → duration
│    │         ├─ stsc / stsz / stco  where each sample lives in mdat
│    │         └─ …
│    └─ udta → meta → ilst  ← iTunes-style tags (©nam ©ART ©alb covr…)
└─ mdat ─ the actual coded AAC audio ───  (the bytes the boxes above index)

The critical leaf is mp4a and its child esds (Elementary Stream Descriptor): that is where the object type — AAC-LC (Low Complexity) is the common one — the sample rate and the channel count are declared. The tags live under moov/udta/meta/ilst using Apple's four-character keys (©nam title, ©ART artist, ©alb album, covr cover art) — which is why the title and artist you edit in the METADATA tab can ride across into an exported M4A.

One consequence of putting the index (moov) in its own box: a muxer has to know the whole stream before it can finalise the tables. FFmpeg either writes moov at the end, or — with -movflags +faststart — rewrites the file to move it to the front for progressive playback. In a one-shot local convert, either is fine.

MP3 → AAC is a second lossy pass

This matters more than the container details. An MP3 has already thrown away everything a psychoacoustic model judged inaudible. Re-encoding to AAC runs a different psychoacoustic model over what's left and throws some more away — generation loss. AAC cannot recover detail the MP3 already discarded; at best it preserves what remains, at a similar or smaller size.

This is exactly why the EXPORT tab does not offer MP3 as a target. Re-encoding MP3 → MP3 only adds loss, and a true no-loss copy — keeping the original frames, changing only the tag — is what the METADATA tab's “Download tagged copy” already does.

The licensing catch

Here is the asterisk. Unlike MP3 — whose patents expired in 2017, making it free to implement — AAC is still patent-encumbered. A pool (historically Via Licensing, now managed under Dolby) licenses the AAC patent families, and commercial products that encode or decode AAC are expected to hold a licence.

That directly shapes which encoder a project can use:

EncoderQualityCan a free web tool ship it?
FDK-AAC (Fraunhofer, libfdk_aac)Best-in-class, especially at low bitrate / HE-AACNo. Its licence (a Fraunhofer copyright licence) is not GPL-compatible and does not grant the underlying patent rights — so FFmpeg builds that include it are non-redistributable. It is deliberately absent from this build.
FFmpeg native (aac)Good at ≥128 kbps; clean-room, no third-party patented code bundledYes — it is part of FFmpeg's own source. That is what we use.
Browser WebCodecs AudioEncoderUses the OS/hardware AAC encoder (often excellent)Only where the browser supports it, and support/quality vary — so not a dependable single answer.

(The patent question is separate from any encoder's copyright licence, and none of this is legal advice — it is why the engineering choice looks the way it does.)

What OmniViewer ships, and why

The EXPORT tab runs a vendored, single-threaded build of FFmpeg compiled to WebAssembly, entirely in your browser — no upload, no server. For AAC it uses FFmpeg's native aac encoder, not libfdk_aac. Practically:

So which format should you actually pick?

You want…PickWhy
To edit or archive with zero further lossFLAC (or WAV)Lossless container for the MP3's decoded audio; no new generation loss.
The smallest good-sounding file for the web/phoneOpusBest modern size-to-quality ratio, and fully free to implement.
Maximum compatibility, especially Apple appsM4A / AACPlays everywhere Apple does; accept the licensing asterisk above.
An open-format lossy fileOgg VorbisPatent-free lossy option, though Opus generally beats it.
Open the EXPORT tab →Convert an MP3 to WAV, FLAC, M4A, Opus or Ogg — all in your browser. Anatomy of an MP3 →Frame headers, ID3 tags and the MPEG versions, byte by byte.