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.

CMF Buds 2 Plus

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?

Audio settings screenshot

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
Bluetooth traffic analysis

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.

Support conversation

Could It Be About Battery Life?

Testing with identical volume and personal sound settings showed:

CodecBattery Life
AAC 128k13:06 / 12:33
AAC 229k10:56 / 11:04
LDAC 660k9:32
SBC XQ 463k9:24
SBC 250k11: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.

MTU diagram

Industry-Wide Problem

Through the btcodecs project, I found that low-bitrate AAC is widespread across the industry:

ManufacturerModelMax AAC Bitrate
NothingEar (1)160 kbps
CMFBuds 2 / 2 Plus / 2 Pro128 kbps
OPPOEnco X / Free2 / Free3 / Air3128 kbps
OnePlusBuds165 kbps
OnePlusBuds Pro 2128 kbps
OnePlusBuds Z2145 kbps
XiaomiMi True Wireless 1/296 kbps
XiaomiAir 2s128 kbps
realmeBuds Air 3/3s/5 Pro128 kbps
realmeBuds 6 Pro192 kbps
HuaweiFreeBuds 3i128 kbps
HuaweiFreeBuds SE 2/3192 kbps
HonorChoice Earbuds X7 Lite128 kbps
BoseQC35 II / QC Earbuds192 kbps
TecnoFreeHear 1128 kbps
Bitrate comparison chart

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.