Зачем TWS-наушникам ограничение AAC в 128 кбит/с?
- вторник, 24 июня 2025 г. в 00:00:10
This article is also available in English.
Я пользуюсь Bluetooth-наушниками SOUNDPEATS Sonic Pro уже почти два года, и редко какая пара и удобна, и хорошо звучит, и не вываливается из ушей — они мне нравятся. По сегодняшним меркам, это довольно простая модель, без активного шумоподавления и режима прозрачности, эквалайзера или автоматической паузы при извлечении, зато с эргономичным управлением физическими кнопками, и с защитой от воды.
Увы, левый наушник стал играть заметно тише правого. Можно подкрутить баланс звука на самом устройстве, но в Android он настраивается только глобально, поэтому приходится сбрасывать баланс на середину каждый раз, когда подключаю Bluetooth-колонки — неудобно!
Посему решил, что пришло время попробовать что-то новое. Взгляд упал на новинку этого сезона от CMF: вкладыши Buds 2 Plus.
Современная модель с кучей функций! "Personal Sound" настраивает кривую эквалайзера в зависимости от вашего профиля слуха, а "Spatial Audio" управляет бинауральной панорамой — можно сделать псевдо-многоканальный звук из стерео. Кроме этого, в CMF используются 6 микрофонов для улучшения качества звука во время разговора, а у SOUNDPEATS он совсем плохой и полностью забивается на улице при ветре.
Однако уже в течение первых нескольких минут прослушивания я столкнулся с неприятными артефактами. Сложные треки звучали как типичный низкобитрейтный mp3, с неестественно сглаженными ударами тарелок («ссс» вместо «цссс»), едва заметными бас-барабанами, и отчетливым металлическим эхом.
Крайне странно для наушников этого ценового сегмента.
Попробовав различные настройки, пресеты эквалайзера, включение и выключение режима для игр (снижает задержку звука), я обнаружил меню "High-quality audio", которое позволяет переключаться между кодеками AAC и LDAC. Приложение сообщило, что LDAC может «сократить длительность работы батареи и привести к прерываниям звука». Переключение кодека на LDAC сделало свое дело: звук наконец-то стал отличным, как и должно было быть с самого начала!
Но почему AAC звучит так плохо? Более того, почему стандартный кодек SBC звучит лучше, когда я переключаюсь на него вручную с помощью настроек разработчика на смартфоне?
У моих предыдущих наушников такой проблемы нет. Независимо от кодека, будь то SBC, AAC (или aptX, если уж на то пошло), они выдают хороший звук без слышимых артефактов.
Заинтересовавшись причиной, я в конечном счёте перехватил и проанализировал трафик Bluetooth между моим Linux ПК и наушниками. Выяснилось, что:
SBC искусственно ограничен 250 кбит/с (max bitpool = 39)
AAC искусственно ограничен 128 кбит/с
PipeWire, сервер аудио для Linux, работает не только с физическими аудиокартами — он также заведует и Bluetooth-звуком. Битрейт AAC можно увеличить путём модификации одной единственной константы MIN_AAC_BITRATE
в файле a2dp-codec-aac.c.
CMF Buds 2 Plus без проблем приняли новый битрейт в 320 239 кбит/с, несмотря на ограничение в 128 кбит/с в самих наушниках.
--- a/spa/plugins/bluez5/a2dp-codec-aac.c
+++ b/spa/plugins/bluez5/a2dp-codec-aac.c
@@ -19,7 +19,7 @@
static struct spa_log *log;
#define DEFAULT_AAC_BITRATE 320000
-#define MIN_AAC_BITRATE 64000
+#define MIN_AAC_BITRATE 320000
Подробнее о 239 кбит/с поговорим далее в статье.
Благодаря этому изменению качество аудио теперь отличное, и всё ещё без каких-либо прерываний звука из-за повышенного битрейта. Малый битрейт — не результат аппаратных ограничений наушников, а просто намеренно заданный конфигурационный профиль.
Хм?!
I just bought CMF Buds 2 Plus, connected with my phone and PC, and was presented with audible AAC artifacts right away. After checking the settings in the Bluetooth configuration, in the app, I’ve ended capturing and analyzing Bluetooth traffic on the PC.
It turns out that
-SBC codec is artificially limited to 250 Kbit/s (max bitpool = 39)
-AAC codec is artificially limited to 128 Kbit/sAAC sounds really bad, SBC is a bit better. Only LDAC is all right at 660 Kbit/s.
The industry standard for SBC max bitpool is 53 (328 kbit/s @ 44100 Hz Joint Stereo) but it could (and really should) be higher, and for AAC it’s usually set to 320 kbit/s.May I ask you for the reason of such limitations, and could they be addressed in the next firmware update? My Buds are on 1.0.1.36 firmware version (the latest available).
Thank you for contacting CMF by Nothing.
Thank you for your detailed and professional feedback, and we sincerely apologize for any inconvenience you’ve experienced with the audio quality of your CMF Buds 2 Plus.
In actual user scenarios, certain limitations are applied to the encoding formats to help ensure stable performance. These limitations are mainly in place to enhance resistance to signal interference. If the bitrate is set too high, performance may degrade in environments with more interference, which could negatively impact the overall user experience.
We have conducted extensive laboratory comparisons with other brands and applied optimized codec limitations based on real-world performance under various conditions.Your expertise and input are highly appreciated, and we’ve shared your feedback with our development team for further review. Thank you again for helping us improve.
Unfortunately that doesn’t make sense to me—LDAC uses bitrates not lower than 330 kbit/s, usually 660 kbit/s and higher, while CMF Buds 2 Plus’s AAC codec is capped down to 128 kbit/s with hearable artifacts.
iPhones don’t support LDAC and will use AAC with CMF Buds 2 Plus, with very low audio quality.
This is a major deal breaker for otherwise nice earphones, and this definitely seems like a bug in the firmware.
We understand how important audio quality is to our users, and we are always looking for ways to improve our products. Regarding firmware bugs or possible improvements, we will review your feedback with our technical team to see if there are any enhancements we can make for future updates.
Thank you again for sharing your experience—your input is valuable to us. If you have any other questions or need further assistance, please let us know.
Best regards,
Hannah Grace
CMF Customer Support
Хм, ну ладно.
Пост на форуме в течение 25 дней никто не подтвердил, поэтому он виден только мне и модератору, которому даже нельзя ответить второй раз.
Было ли ограничение сделано из чисто маркетинговых соображений, или для такой конфигурации есть какое-то техническое основание?
Может быть, дело в энергопотреблении? Компания оптимизировала наушники под более длительную работу на одном заряде батареи, а не под качество звука?
На сайте указаны значительно отличающиеся цифры работы на одном заряде для AAC и LDAC:
Расходует ли AAC 128 кбит/с намного меньше заряда, чем AAC с более высоким битрейтом?
Потребляет ли LDAC больше энергии из-за своей комплексности?
Я всегда считал LDAC low-complexity кодеком из-за его высокого битрейта, но и AAC-LC (Low Complexity) едва ли можно назвать по-настоящему лёгким для кодирования и декодирования.
Единственный вариант выяснить — провести тестирование самостоятельно!
Тестирование проводилось с одинаковой громкостью, без шумоподавления, но с включённым personal sound, на одинаковых композициях
AAC 128k | AAC 229k | LDAC 48KHz 660k | SBC XQ 463k | SBC 250k |
13:06 | 10:56 | 9:32 | 9:24 | 11:15 |
И действительно:
AAC 229 кбит/с уменьшает время работы от батареи на 1 час 30 минут от результата 128 кбит/с
С LDAC наушники продержались на 3 часа меньше, чем с AAC 128 кбит/с (но на 1.5 часа дольше заявленного)
SBC, будучи low-complexity-кодеком, показал результаты, сопоставимые с высокобитрейтным AAC
Причины такой разницы во времени работы неясны.
Быть может, обработка бо́льшего количества данных банально больше расходует процессорное время? Или SRAM реже уходит в режим простоя? А может, из-за повышенного битрейта данные не помещаются в одно слово DSP, из-за чего на обработку уходит больше тактов? Либо причина в радиотракте, усилитель мощности которого работает дольше из-за более частых ACK-пакетов?
У меня нет ответа.
AAC 229 кбит/с — максимально возможный битрейт для этих наушников, так как размер пакета AAC ограничен значением MTU в 679 байт, согласованное наушниками.
Пакеты AAC, в отличие от других кодеков, не могут быть фрагментированы, поэтому передача должна умещаться в значение MTU. При этом каждый пакет AAC-LC содержит ровно 1024 закодированных аудиокадра, что соответствует 21 мс аудиоданных при 48 кГц частоте дискретизации.
Поскольку CMF Buds 2 Plus поддерживает только 44100/48000 Гц для режима AAC-LC (Low Complexity) и не имеют поддержки AAC Enhanced Low Delay (AAC-ELD), уменьшить количество аудиокадров в одном пакете невозможно — в одном пакете будет не меньше 21 мс аудионагрузки, которые должны уместиться в MTU. Это накладывает ограничение пикового битрейта в 229 кбит/с для 44,1 кГц или 250 кбит/с для 48 кГц.
Благодаря проекту btcodecs у меня есть дампы трафика с тысяч устройств, что позволило исследовать битрейты AAC на различных наушниках. Удивительно, но AAC с низким битрейтом довольно распространен в индустрии:
Производитель | Модель | Макс. битрейт AAC |
Nothing | Ear (1) | 160 кбит/с |
CMF | Buds 2 | 128 кбит/с |
OPPO | Enco X | 128 кбит/с |
OnePlus | Buds | 165 кбит/с |
Buds Pro 2 | 128 кбит/с | |
Buds Z2 | 145 кбит/с | |
Xiaomi | Mi True Wireless Earphones 1 | 96 кбит/с |
Air 2s | 128 кбит/с | |
realme | Buds Air 3 | 128 кбит/с |
Buds 6 Pro | 192 кбит/с | |
Huawei | FreeBuds 3i | 128 кбит/с |
FreeBuds SE 2 | 192 | |
Honor | Choice Earbuds X7 Lite | 128 |
Bose | QC35 II | 192 |
Tecno | FreeHear 1 | 128 |
Все зависит от энкодера и его конфигурации.
Android по умолчанию использует программный кодировщик FDK-AAC от института Фраунгофера, который:
Не очень хорошо справляется с кодированием на низких битрейтах для наиболее распространенного профиля AAC-LC
Задействует неотключаемый фильтр ограничения полосы частот в 17 кГц и ниже, применяемый в режиме кодирования с постоянным битрейтом (CBR)
Но в режиме переменного битрейта (VBR) игнорирует установленное наушниками ограничение и использует максимально возможный битрейт, а также повышает фильтр частот до 19.3 кГц, почти что отключая его
Режим VBR должен быть включён разработчиком прошивки в явном виде. Он доступен начиная с Android 11.0.0_r7.
Фильтр частот зависит от битрейта.
Для режима CBR это 17000 Гц для битрейта >=192 кбит/с, 16120 Гц для <144 кб/с, 15500 Гц при < 112 кб/с.
Для VBR профиля 5 (единственный используемый в AOSP) фильтр устанавливается в 19.3 кГц. Для других профилей срез ниже, вплоть до 13 кГц, согласно таблице.
Всё это актуально для FDK-AAC. Однако на смартфонах чаще всего кодирование выносится в отдельный аппаратный блок или чип цифровой обработки звука (DSP), и оно может быть (и как правило бывает) более качественным, и с собственным алгоритмом переменного битрейта и частотного фильтра. У каждого производителя SoC алгоритмы разные. Чаще всего FDK-AAC используется на альтернативных (неофициальных) прошивках для смартфонов.
Apple использует высококачественный кодировщик собственной разработки на iPhone, обеспечивающий исключительный звук на низких битрейтах, но 128 кбит/с все еще едва ли достаточно для хорошего звука, даже с лучшим энкодером в индустрии.
Другой важный фактор — возраст.
С возрастом наша способность слышать высокие частоты снижается. Большинство аудиокодеков распределяют битрейт между средними→низкими→высокими частотами, и если у вас уши уже сточены, вы можете не расслышать мешанину на высоких частотах, где больше всего присутствуют артефакты.
Это особенно актуально для молодой аудитории: срез в 17 кГц в Android FDK-AAC не будет звучать идеально даже при битрейте 320 Кбит/с, если сравнивать с другими кодеками (хоть с SBC).
К сожалению (или к счастью), мой предел слышимости составляет около 15,5 кГц — я едва различаю частоту развертки старого ЭЛТ-телевизора.
Вы можете проверить свою частотную характеристику своего уха в онлайн-генераторе звуковых сигналов.
Windows: Bluetooth Tweaker
Linux: avinfo
Проект btcodecs
пока что не отображает битрейт AAC, скоро обновлю сайт.
Если у вас есть дамп трафика Bluetooth, можно использовать Wireshark для проверки битрейта.
Примените фильтр btavdtp.media_codec_audio_type==0x02
и смотрите Bluetooth AVDTP Protocol → Capabilities → Service: Media Codec - Audio MPEG-2,4 AAC → Bit Rate
внизу выпадающего списка.
Хоть CMF Buds 2 Plus позволяет переключаться на LDAC для полноценного прослушивания качественной музыки, покупатели обычных CMF Buds 2 (не plus) ограничены AAC с битрейтом 128 кбит/с, и я не вижу никаких причин помимо маркетинговых для гордости «большим и высококачественным динамиком», если его качество нельзя задействовать в полной мере.
Если CMF действительно есть дело до пользователей, им следует добавить в свое приложение опцию настройки битрейта, позволяющую самостоятельно выбирать между качеством звука и временем автономной работы.
I’ve got ripped, LAME! (v3.98)