AAC works in Chrome 12+, Edge 12+, Safari 4+ on macOS and iOS, Opera 15+, IE 9+, Samsung Internet, and the Android Browser. Firefox 22+ uses the OS decoder.

Prince Dewani
May 1, 2026
AAC (Advanced Audio Coding) is a lossy audio codec that ISO/IEC standardized as MPEG-4 Part 3 to replace MP3 with smaller files at the same quality. It works in Chrome 12+, Edge 12+, Safari 4+ on macOS and iOS, Opera 15+, IE 9+, Samsung Internet, and the Android Browser, while Firefox 22+ uses the OS decoder.
This guide covers what AAC is, the browsers that support it, the AAC profiles, common use cases, AAC versus MP3, and the known issues.
AAC, short for Advanced Audio Coding, is a lossy audio compression standard that AT&T, Dolby, Fraunhofer, and Sony developed under MPEG-4 Part 3 (ISO/IEC 14496-3) and MPEG-2 Part 7 (ISO/IEC 13818-7). The codec delivers smaller files than MP3 at the same audio quality and supports up to 48 channels at sample rates from 8 kHz to 96 kHz.
Every modern browser engine supports AAC inside an MP4 or ADTS container, with global support sitting at roughly 97% of all web traffic. Firefox is the only mainstream engine that does not bundle a built-in decoder and instead calls the operating system.
Chrome supports AAC from Chrome 12 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 4 to 11 did not include the codec. The browser plays AAC inside MP4 and ADTS containers and supports the AAC Main and Low Complexity profiles. The open-source Chromium build excludes AAC for licensing reasons, so Chromium-only forks ship without it.
Edge supports AAC from Edge 12 on Windows, macOS, Linux, and Android. The legacy EdgeHTML 12 to 18 and the current Chromium-based Edge 79+ both ship the codec by default through Windows Media Foundation or the Chromium media stack, so AAC inside MP4 and ADTS plays without a separate plug-in.
Firefox 22+ supports AAC, but it does not bundle a decoder. The browser calls the operating system: Media Foundation on Windows Vista and later, AVFoundation on macOS, the Android system decoder, and GStreamer on Linux. Firefox 2 to 21 did not support AAC at all. A Linux build without the gst-libav or fdk-aac GStreamer plugins installed cannot play AAC files.
Safari supports AAC from Safari 4 on macOS and from Safari 4 on iOS, iPadOS, and visionOS. Safari 3.1 and 3.2 did not support AAC. Apple uses AAC as the default audio codec across iTunes, Apple Music, Apple Podcasts, and FaceTime, so AAC inside MP4 and HLS plays on every modern Apple device without extra configuration. Safari is also the only browser that ships an xHE-AAC decoder out of the box.
Opera supports AAC from Opera 15 on Windows, macOS, and Linux. Opera 9 to 12.1 (the Presto-engine versions) did not support AAC. Blink-based Opera 15 and later inherit Chromium's AAC support, and Opera Mobile 80+ on Android plays AAC inside MP4 and ADTS.
Samsung Internet supports AAC across every shipped version on Galaxy phones and tablets. The browser uses the Android system AAC decoder through MediaCodec, so AAC, HE-AAC, and HE-AAC v2 inside MP4 and ADTS all play without configuration.
The legacy Android Browser supports AAC from Android 3.0 on. Android 2.1 to 2.3 did not include AAC inside the browser. Chrome for Android supports AAC from Chrome 12, and the Android System WebView used by in-app browsers tracks the Chrome version installed on the device.
Internet Explorer 9 and later support AAC on Windows Vista and Windows 7+, since IE 9 was the first version to add the HTML5 audio element and route decoding through Media Foundation. IE 5.5 to IE 8 did not support AAC. Microsoft has retired Internet Explorer 11, and Edge has replaced it, so the AAC notes here are kept for legacy QA scenarios only.
Note: AAC playback breaks across older Firefox on Linux, the open-source Chromium build, and the Presto-era Opera. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
AAC ships as a family of profiles that trade complexity for bitrate efficiency. Each profile uses the same MDCT core but adds tools on top, and browsers support a different subset.
AAC is the default audio codec for almost every modern streaming, broadcasting, and mobile workflow. It pairs with H.264 in MP4 video, ships as the audio track in HLS, and powers the largest music and podcast libraries on the web.
AAC and MP3 are both lossy audio codecs in the MPEG family, but AAC is the modern successor. The table below sums up the differences across compression behavior, browser reach, and licensing.
| Dimension | AAC | MP3 |
|---|---|---|
| Standard | MPEG-4 Part 3 (ISO/IEC 14496-3) and MPEG-2 Part 7 (ISO/IEC 13818-7) | MPEG-1 Part 3 (ISO/IEC 11172-3) and MPEG-2 Part 3 (ISO/IEC 13818-3) |
| File extensions | .aac, .m4a, .mp4 | .mp3 |
| MIME types | audio/aac, audio/mp4 | audio/mpeg |
| Quality at 128 kbps stereo | Transparent for most listeners | Audible artefacts on cymbals and reverb |
| Sweet spot for low bitrate | HE-AAC at 32 to 64 kbps stereo | Quality drops below 128 kbps |
| Maximum channels | 48 plus 16 LFE | 5.1 surround |
| Maximum sample rate | 96 kHz | 48 kHz |
| Browser support | Every modern browser, Firefox via OS | Every browser natively, including IE 9+ |
| Patent status | Licensed via Via LA, royalties for encoder vendors | Patents expired, royalty-free |
AAC plays cleanly across the major browser engines, so the painful edge cases land on Firefox on bare Linux, the open-source Chromium build, profile mismatches, and licensing rules for self-built encoders.
In my experience, the trickiest failure is the Firefox-on-Linux gap. An AAC podcast that works on Chrome, Safari, and Firefox on macOS silently fails on a stock Fedora or Alpine box because the user has Firefox but no GStreamer codec plugin. Probe the user agent server-side and route Linux Firefox visitors to an Opus or MP3 fallback, or your Linux analytics will show a flat zero on play events.
Confirm AAC support across browsers by pasting the snippet below into the DevTools console.
// Paste this into the DevTools console to confirm the browser plays AAC.
const audio = document.createElement("audio");
const aacMimeTypes = [
"audio/aac",
'audio/mp4; codecs="mp4a.40.2"', // AAC-LC inside MP4
'audio/mp4; codecs="mp4a.40.5"', // HE-AAC inside MP4
'audio/mp4; codecs="mp4a.40.29"' // HE-AAC v2 inside MP4
];
for (const mime of aacMimeTypes) {
const result = audio.canPlayType(mime);
console.log(mime, "->", result || "(empty: not supported)");
}
// 'probably' or 'maybe' means the browser will try to decode AAC.
// An empty string means the engine has no AAC decoder for that profile or container.All AAC version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance