Why Do TWS Earbuds Limit AAC to 128 kbit/s?
An investigation into why popular TWS earbuds artificially limit AAC bitrate to 128 kbit/s, making them sound like low-quality MP3s. Bluetooth traffic analysis reveals it's a deliberate firmware choice, not a hardware limitation.
I've been using SOUNDPEATS Sonic Pro earbuds for nearly two years. They're comfortable and sound good, though recently the left earbud has started playing noticeably quieter than the right. When I went looking for replacements, I tried the CMF Buds 2 Plus—a modern model featuring "Personal Sound" for hearing-adjusted EQ curves and "Spatial Audio" for pseudo-surround effects from stereo.
However, within the first several minutes of listening, I encountered unpleasant artifacts. Complex tracks sounded like low-bitrate MP3s with unnaturally smoothed cymbal strikes and barely audible bass drums.
After discovering a "High-quality audio" menu allowing codec switching between AAC and LDAC, changing to LDAC resolved the issue. This prompted me to investigate: why does AAC sound so poor when even SBC sounds better?
Bluetooth Traffic Analysis
By capturing and analyzing Bluetooth traffic, I discovered the root cause:
- SBC is artificially limited to 250 kbit/s (max bitpool = 39)
- AAC is artificially limited to 128 kbit/s
Patching PipeWire for Higher Bitrate
I modified PipeWire's MIN_AAC_BITRATE constant in the a2dp-codec-aac.c file. The CMF Buds 2 Plus accepted 239 kbit/s despite the firmware's 128 kbit/s restriction, proving the limitation is a deliberately configured profile, not a hardware constraint.
What the Manufacturer Says
I contacted CMF support, explaining the artificial bitrate limitations and requesting an explanation. CMF responded that "certain limitations are applied to encoding formats to ensure stable performance" and that bitrates too high cause performance degradation in interference-prone environments.
I countered that LDAC uses 330+ kbit/s (often 660 kbit/s or higher) without problems, while iPhone users would be stuck with low-quality AAC since iOS doesn't support LDAC.
Could It Be About Battery Life?
Testing with identical volume and personal sound settings showed:
| Codec | Battery Life |
|---|---|
| AAC 128k | 13:06 / 12:33 |
| AAC 229k | 10:56 / 11:04 |
| LDAC 660k | 9:32 |
| SBC XQ 463k | 9:24 |
| SBC 250k | 11:15 |
AAC at 229 kbit/s reduces battery time by about 1.5 hours compared to 128 kbit/s. The reasons for such a significant difference remain unclear—possibly related to processor overhead, SRAM behavior, DSP word sizing, or radio amplifier efficiency.
The 229 kbit/s Ceiling
The maximum possible AAC bitrate is constrained by the MTU (Maximum Transmission Unit) size of 679 bytes. Unlike other codecs, AAC packets cannot be fragmented. Each AAC-LC packet contains exactly 1024 audio frames (21 ms at 48 kHz), limiting peak bitrate to approximately 229 kbit/s at 44.1 kHz or 250 kbit/s at 48 kHz.
Industry-Wide Problem
Through the btcodecs project, I found that low-bitrate AAC is widespread across the industry:
| Manufacturer | Model | Max AAC Bitrate |
|---|---|---|
| Nothing | Ear (1) | 160 kbps |
| CMF | Buds 2 / 2 Plus / 2 Pro | 128 kbps |
| OPPO | Enco X / Free2 / Free3 / Air3 | 128 kbps |
| OnePlus | Buds | 165 kbps |
| OnePlus | Buds Pro 2 | 128 kbps |
| OnePlus | Buds Z2 | 145 kbps |
| Xiaomi | Mi True Wireless 1/2 | 96 kbps |
| Xiaomi | Air 2s | 128 kbps |
| realme | Buds Air 3/3s/5 Pro | 128 kbps |
| realme | Buds 6 Pro | 192 kbps |
| Huawei | FreeBuds 3i | 128 kbps |
| Huawei | FreeBuds SE 2/3 | 192 kbps |
| Honor | Choice Earbuds X7 Lite | 128 kbps |
| Bose | QC35 II / QC Earbuds | 192 kbps |
| Tecno | FreeHear 1 | 128 kbps |
Why Some Devices Sound Fine at 128 kbps
Audio quality depends heavily on the encoder configuration. Android uses FDK-AAC, which:
- Encodes poorly at low bitrates for AAC-LC
- Applies an unremovable frequency filter around 17 kHz in CBR mode
- In VBR mode, ignores device bitrate limits and uses the maximum possible bitrate, raising the filter cutoff to 19.3 kHz
VBR must be explicitly enabled by the firmware (available since Android 11.0.0_r7).
Apple uses a proprietary encoder that provides exceptional sound at low bitrates, though even with the industry's best encoder, 128 kbps hardly suffices for good audio.
Age matters too: as hearing diminishes with age, high-frequency artifacts become less noticeable. Younger listeners hear the degradation more clearly, especially with Android's 17 kHz cutoff.
How to Check Your Earbuds' Bitrate
- Windows: Bluetooth Tweaker
- Linux:
avinfo
Using Wireshark with the filter btavdtp.media_codec_audio_type==0x02 reveals the bitrate in the AVDTP Protocol capabilities section.
Conclusion
While CMF Buds 2 Plus users can switch to LDAC for quality audio, standard CMF Buds 2 users remain limited to 128 kbit/s AAC. I see no reason beyond marketing for restricting quality when the hardware clearly supports better.
If CMF truly cares about its users, they should add bitrate configuration options to their app, allowing users to choose between sound quality and battery life.