MP3 → AAC
MP3 to AAC converter
MP3 audio is decoded and re-encoded as AAC-LC in a raw ADTS stream (.aac). Both codecs are lossy, so this costs one generation.
…or drag files and folders here. Add as many as you like — everything is processed on this device.
.aif .aifc .aiff .flac .m4a .mp3 .oga .ogg .opus .wav .wave
In one paragraph
A raw ADTS .aac file is what streaming and broadcast pipelines often want: self-synchronising frames with no container overhead, so a segmenter can cut it anywhere. HLS audio segments, Icecast/Shoutcast sources, some DAB encoders and a number of embedded players all expect it.
If you want a file for a music library instead, you almost certainly want M4A — the same AAC audio inside an MP4 container, with a duration field, tags and artwork. This page writes the bare stream deliberately.
Does this change the audio quality?
Both sides of this conversion are lossy, so the encoder is working from audio that has already been through a codec. The result is one generation further from the original recording.
- ADTS carries no metadata at all. Title, artist and artwork cannot be stored — use M4A if you need them.
- ADTS has no duration header, so some players show the length only after scanning the whole file.
- The output uses AAC-LC. HE-AAC (AAC+) is not produced by this build, so do not expect usable results below 64 kbps.
A worked example
Preparing station idents for an Icecast source
- Drop the MP3 idents into the queue.
- Set 128 kbps and force the sample rate to 44100 so every segment matches the stream configuration.
- Set Channels to Stereo explicitly — a mono ident in a stereo stream can cause a channel-count switch mid-stream.
- Convert all and download individually into the playout folder.
Match the stream, not the source
For a streaming pipeline, consistency matters more than absolute quality: every file should have the same sample rate, channel count and bitrate as the stream itself, otherwise decoders re-initialise between tracks and listeners hear a gap. Pick the stream’s settings and force them on every file with Apply to all.
Supported formats, limits and browser notes
Sonic Batch decodes with the browser when it can (faster, no engine download) and falls back to the self-hosted WebAssembly engine when it cannot. Every combination below works in every listed browser; the column only tells you which decoder does the work.
| Input | What it is | Chrome | Firefox | Safari | iOS |
|---|---|---|---|---|---|
| MP3 | The universal lossy format. Plays on essentially every device made since 1998. | Native | Native | Native | Native |
| WAV | Raw PCM samples with a small header. Perfect fidelity, roughly 10 MB per stereo minute. | Native | Native | Native | Native |
| FLAC | Lossless compression, typically 50–60% of WAV size, bit-identical when decoded. | Native | Native | Native | Native |
| M4A | Apple’s default AAC container. Better quality than MP3 at the same bitrate. | Native | Native | Native | Native |
| OGG | Royalty-free lossy codec. Standard in game engines, Godot, Unity and Wikimedia. | Native | Native | Engine | Engine |
| Opus | The best-sounding lossy codec below 128 kbps. Used by WhatsApp, Discord and YouTube. | Native | Native | Partial | Partial |
| AIFF | Apple’s uncompressed PCM format — the WAV equivalent for Logic and Pro Tools. | Partial | Partial | Native | Native |
| Output | Encoder | Bitrates / depth | Sample rates | Tags |
|---|---|---|---|---|
| AAC | aac | 32–320 kbps | 8–48 kHz | No |
- Max per file
- 400.0 MB
- Max per queue
- 4.00 GB
- Max duration
- 4:00:00
- Max archive
- 1.50 GB
These are enforced ceilings, checked before any decoding starts, not measured maximums — a file over the limit is rejected rather than allowed to exhaust the tab’s memory. Real-world capacity is lower on older phones, which is why the scheduler runs one file at a time on iOS and Safari.
Where your audio goes
Nowhere. Your file is read from disk into this browser tab with the File API, decoded and encoded by code running in that same tab, and handed back to you as a download. It is never transmitted.
That is a structural property of the application, not a policy promise: there are no API routes, no server actions and no third-party processing services in this project, so there is nothing capable of receiving a file. The page’s Content-Security-Policy also restricts connections to this origin, and the automated test suite includes a browser test that fails if any network request during import, preview, conversion or download carries media bytes.
The trade-off, stated plainly:results live in your tab’s memory until you download them. Closing or reloading the page discards them. There is nothing on a server to recover, because nothing was ever put there.
Troubleshooting
My player shows the wrong duration.
ADTS has no duration field. That is a property of the format. Use M4A if you need a duration in the header.
The file will not import into iTunes or Apple Music.
Correct — those want M4A. Use the MP3 to M4A page instead.
Low bitrates sound bad.
This build encodes AAC-LC only, which needs about 96 kbps stereo to be respectable. Below that, use Opus, which is designed for low bitrates.
Frequently asked questions
What is the difference between .aac and .m4a?
Identical codec, different packaging. .aac is bare frames; .m4a wraps them in MP4 with metadata and a duration.
Which should I choose?
M4A for anything a person will browse in a library. Raw AAC for pipelines that segment or stream the file.
Is AAC better than MP3?
Yes at equal bitrate, but converting an existing MP3 does not recover the MP3’s losses. Encode from lossless when you can.
Does the encoder support 5.1?
This page downmixes anything above stereo. Multi-channel encoding is out of scope for the launch build.