В режиме разработчика не сохраняются настройки bluetooth
Некоторые пользователи беспроводных наушников отмечают низкое качество звука и недостаток высоких частот при использовании стандартного Bluetooth-кодека SBC, который поддерживают все аудиоустройства. Частой рекомендацией для улучшения звука является покупка устройств и наушников с поддержкой кодеков aptX и LDAC. Эти кодеки требуют лицензионных отчислений, поэтому устройства с их поддержкой стоят дороже.
Оказывается, низкое качество SBC обусловлено искусственными ограничениями Bluetooth-стеков и настроек наушников, и это ограничение можно обойти на любых существующих устройствах, путём программных изменений смартфона или компьютера.
Кодек SBC
У кодека SBC есть множество разных параметров, которые согласуются на этапе установки соединения. Среди них:
- Количество и тип каналов: Joint Stereo, Stereo, Dual Channel, Mono;
- Количество частотных полос: 4 или 8;
- Количество блоков в пакете: 4, 8, 12, 16;
- Алгоритм распределения битов при квантовании: Loudness, SNR;
- Максимальное и минимальное значение пула битов, используемых при квантовании (bitpool): обычно, от 2 до 53.
Декодирующее устройство обязано поддерживать любое сочетание этих параметров. Кодирующее устройство может реализовывать не все.
Существующие Bluetooth-стеки, как правило, согласуют следующий профиль: Joint Stereo, 8 полос, 16 блоков, Loudness, bitpool 2..53. Этот профиль кодирует 44.1 кГц аудио с битрейтом 328 кбит/с.
Параметр bitpool напрямую влияет на битрейт в рамках одного профиля: чем он выше, тем выше битрейт, а следовательно и качество.
Однако параметр bitpool не привязан к конкретному профилю; влияние на битрейт также в значительной степени оказывает и другие параметры: тип каналов, количество частотных полос, количество блоков. Поднять битрейт можно косвенно, путем согласования нестандартных профилей, без изменения bitpool.
Формула подсчета битрейта SBC
Например, режим Dual Channel кодирует каналы раздельно, используя весь bitpool для каждого из каналов. Заставив устройство использовать Dual Channel вместо Joint Stereo, мы получим почти удвоенный битрейт при том же максимальном значении bitpool: 617 кбит/с.
По моему мнению, использование не привязанного к профилю значения bitpool на этапе согласования — недоработка стандарта A2DP, которая и привела к искусственному ограничению качества SBC. Разумней было бы согласовывать bitrate, а не bitpool.
Такие фиксированные значения Bitpool и Bitrate берут свое начало из таблицы с рекомендованными к использованию значениями для высококачественного аудио. Но рекомендация — не повод ограничиваться этими значениями.
Спецификация A2DP v1.2, которая была активна с 2007 по 2015 год, предписывает всем декодирующим устройствам корректно работать с битрейтами до 512 кбит/с:
The decoder of the SNK shall support all possible bitpool values that do not result in excess of the maximum bit rate. This profile limits the available maximum bit rate to 320kb/s for mono, and 512kb/s for two-channel modes.
В новой версии спецификации ограничение по битрейту отсутствует. Предполагается, что современные наушники, выпущенные после 2015 года и поддерживающие EDR, могут поддерживать битрейты до ≈730 кбит/с.
По какой-то причине, у проверенных мной Bluetooth-стеков Linux (PulseAudio), Android, Blackberry и macOS есть искусственные ограничения максимального значения параметра bitpool, который напрямую влияет на максимальный битрейт. Но это — не самая большая проблема, почти все наушники тоже ограничивают максимальное значение bitpool числом 53.
Как я уже успел убедиться, большинство устройств отлично работает на модифицированном Bluetooth-стеке с битрейтом в 551 кбит/с, без прерываний и треска. Но такой битрейт никогда не будет согласован в обычных условиях, на обычных Bluetooth-стеках.
Модифицируем Bluetooth-стек
В любом Bluetooth-стеке, который совместим со стандартом A2DP, есть поддержка режима Dual Channel, но активировать её из интерфейса не представляется возможным.
Давайте добавим переключатель в интерфейс! Я сделал патчи для Android 8.1 и Android 9, которые добавляют полноценную поддержку Dual Channel в стек, добавляют режим в меню переключения режима в инструменты разработчика, и обрабатывают SBC с поддержкой Dual Channel так, будто это дополнительный кодек, вроде aptX, AAC или LDAC (Android называет это HD Audio), добавляя галочку в настройки Bluetooth-устройства. Вот как это выглядит:
При активации галочки, Bluetooth-аудио начинает передаваться с битрейтом 551 кбит/с, если наушники поддерживают соединение на скорости 3 мбит/с, или 452 кбит/с, если наушники поддерживают только 2 мбит/с.
- LineageOS
- Resurrection Remix
- crDroid
Откуда взялись 551 и 452 кбит/с?
Технология разделения эфира в Bluetooth предназначена для эффективной передачи больших пакетов фиксированного размера. Передача данных происходит слотами, самое большое количество слотов, отправляемых за одну передачу — 5. Также есть режимы передачи, использующие 1 или 3 слот, но не 2 или 4. В 5 слотах можно передать до 679 байт на скорости соединения 2 мбит/с и до 1021 байт на скорости 3 мбит/с, а в 3 — 367 и 552 байта соответственно.
Если мы хотим передать меньше данных, чем 679 или 1021 байт, но больше, чем 367 или 552 байта, то передача всё равно займет 5 слотов, а данные будет передаваться за такое же время, что уменьшает эффективность передачи.
SBC в режиме Dual Channel, на 44100 Гц-аудио с параметрами Bitpool 38, 16 блоков во фрейме, 8 частотных диапазонов, кодирует аудио во фреймы размером 164 байт, с битрейтом 452 кбит\с.
Аудио должно быть инкапсулировано в протоколы передачи L2CAP и AVDTP, которые забирают 16 байт от полезной аудионагрузки.
Таким образом, в одну Bluetooth-передачу с 5 слотами удаётся вместить 4 аудиофрейма:
Мы вместили 11.7 мс аудиоданных в отправляемый пакет, который будет передан за 3.75 мс, и у нас осталось 6 неиспользованных байт в посылке.
Если чуть поднять bitpool, 4 аудиофрейма уже не удастся упаковать в одну посылку. Придётся отправлять по 3 фрейма за раз, что снижает эффективность передачи, уменьшает количество передаваемого аудио за одну посылку, и быстрее приведёт к заиканиям аудио при плохих радиоусловиях.
Таким же образом был подобран битрейт 551 кбит/с для EDR 3 мбит/с: с Bitpool 47, 16 блоками во фрейме, 8 частотными диапазонами получается размер фрейма 200 байт, при битрейте 551 кбит/с. В одну посылку вмещается 5 фреймов или 14.6 мс музыки.
Зачем всё это нужно?
Вопреки расхожему мнению о качестве звука кодека aptX, на некоторых файлах он может давать результаты хуже, чем SBC со стандартным битрейтом в 328 кбит/с.
SBC динамически выделяет биты квантования для частотных полос, действуя по принципу «от нижних к верхним». Если весь битрейт использовался на нижние и средние частоты, верхние частоты «обрежутся» (вместо них будет тишина).
aptX квантует частотные полосы одним и тем же количеством бит постоянно, из-за чего у него постоянный битрейт: 352 кбит/с для 44.1 кГц, 384 кбит/с для 48 кГц, и он не может «перенести биты» на те частоты, которые больше всего в них нуждаются. В отличие от SBC, aptX не будет «обрезать» частоты, а будет добавлять в них шумы квантования, уменьшая динамический диапазон аудио, и иногда привносить характерные потрескивания. SBC же «съедает детали» — отбрасывает наиболее тихие участки.
В среднем, по сравнению с SBC 328k, aptX вносит меньше искажений в музыку с широким частотным диапазоном, но на музыке с узким диапазоном частот и широким динамическим диапазоном SBC 328k иногда выигрывает.
Рассмотрим частный случай. Спектрограмма записи игры на фортепиано:
Основная энергия лежит в частотах от 0 до 4 кГц, и продолжается до 10 кГц.
Спектрограмма файла, сжатого в aptX, выглядит следующим образом:
А так выглядит SBC 328k.
Видно, что SBC 328k периодически полностью отключал диапазон выше 16 кГц, и расходовал весь доступный битрейт на диапазоны ниже этого значения. Однако, aptX внес больше искажений в слышимый человеческим ухом спектр частот, что можно видеть на вычтенной оригинальной спектрограмме из спектрограммы aptX (чем ярче, тем больше искажений):
В то время как SBC 328k меньше испортил сигнал в диапазоне от 0 до 10 кГц, а остальное — обрезал:
Битрейта 485k SBC хватило, чтобы сохранить весь диапазон частот, без отключения полос.
SBC 485k на этой композиции значительно опережает aptX в диапазоне 0-15 кГц, и с меньшей, но все же заметной разницей — в 15-22 кГц (чем темнее, тем меньше искажений):
Переключившись на высокобитрейтный SBC, вы получите звук, зачастую превосходящий aptX, на любых наушниках. На наушниках, поддерживающих подключение EDR 3 мбит/с, битрейт 551 кбит/с даёт звук, сравнимый с aptX HD.
А можно ещё больше?
В патче для Android также имеется опция для ещё большего повышения битрейта для устройств EDR 2 мбит/с. Можно повысить битрейт с 452 кбит/с до 595 кбит/с, ценой уменьшения стабильности передачи в сложных радиоусловиях.
Достаточно установить переменную persist.bluetooth.sbc_hd_higher_bitrate в значение 1:
Патч на экстремальный битрейт пока принят только в LineageOS 15.1, но не в 16.0.
Совместимость с устройствами
SBC Dual Channel поддерживается практически всеми наушниками, колонками и автомобильными головными устройствами. Это немудрено — стандарт предписывает его поддержку в любых декодирующих устройствах. Есть небольшое количество устройств, на которых этот режим вызывает проблемы, но это — единичные экземпляры.
Более подробно с совместимыми устройствами можно ознакомиться на 4pda или xda-developers.
Сравнение различий звука
Связь с разработчиками Android
Я писал многим разработчикам Bluetooth-стека из Google, с просьбой рассмотреть включение патчей в основную ветку Android — AOSP, но не получил ни одного ответа. Мои патчи в системе работы с патчами Gerrit для Android также остались без комментариев со стороны кого-либо причастного.
Я был бы рад, если бы мне посодействовали в связи с разработчиками из Google и внедрении SBC HD в Android. Патчcет в gerrit уже устарел (это одна из ранних ревизий), и я его обновлю, если разработчиков заинтересуют мои изменения (мне непросто его обновлять, у меня нет совместимых с Android Q устройств).
Прежде чем задать свой вопрос, ознакомьтесь со способами решения проблемы, указанными ниже, а также воспользуйтесь поиском по теме. Возможно для Вашей модели аппарата уже есть решение.
Общая информация:
- Зайти в Настройки->Об устройстве->Статус (может потребоваться включённый Bluetooth)
- Включить Bluetooth у себя, включить обнаружение, после чего посмотреть через другое устройство (для этого читайте: "Способы узнавания MAC-адресов чужих гарнитур")
- Если у вас есть директория /data/misc/bluetoothd , то название единственной папки внутри bluetoothd будет именно ваш MAC-адрес
- Программа AndroBluetooth, запущенная на рабочем устройстве (показывает снизу имени)
- Также, старые Sony Ericsson отображают MAC адрес устройств до начала сопряжения
- Asus ME173X - /data/misc/bluedroid/
- HTC One XL - /data/misc/bluetoothd/
- Samsung Galaxy S2 Plus - /data/misc/bluedroid/
Тенденция такова, что настройки находятся в папке /data/misc/blue*** . Но разделу требуется больше информации!
Известные способы решения проблем:
- Общее решение каких-то проблем, связанных с подключением к гарнитуре - Bluetooth Fix & Repair
- Решение проблем, связанных с автоподключением - Bluetooth Auto Connect или Bluetooth connect & Play
- Полная (не быстрая!) перезагрузка
- Если есть директория /data/misc/bluedroid/, то можно попробовать удалить папку с вашим MAC-адресом внутри неё и перезагрузиться. (нужен ROOT)
- Чистка разделов Cache и Dalvik Cache (через кастомный Recovery, разумеется)
- Если уж ну совсем ничего не помогло - может помочь Hard Reset или перепрошивка (однажды перепрошивка с CyanogenMod на сток решила проблему)
- Если проблема массовая, то производитель устройства, скорее всего, выпустит прошивку-патч. Попробуйте проверить это через поиск в Гугл
- Программа AndroBluetooth. Включить Bluetooth - Включить программу - Scan Devices - Pair
- Также, в теории должно быть можно через Bluetooth-терминалы, например, через такие: 1 (Android 4.0.4+) / 2 (Android 2.3+) / 3 (Android 2.1+). Требуется больше информации!
- Использовать телефон со все время включенным единожды Bluetooth (правда тогда будет больше жор зарядки). Возможно, проблема хардварная.
- Программа AndroBluetooth.
- Хард ресет/Перепрошивка
- Также, в теории должно быть можно через Bluetooth-терминалы, например, через такие: 1 (Android 4.0.4+) / 2 (Android 2.3+) / 3 (Android 2.1+). Требуется больше информации!
- Также рекомендуется прочитать эту тему для решения подобного рода проблем
- Модель Вашего устройства и установленная прошивка;
- Краткое описание проблемы (кратко, но емко и понятно);
- Предпринятые действия (в том числе, со ссылками на пункты под спойлером "Способы решения проблемы")
Убедительно просим Вас воздержаться в данной теме от вопросов о том, "что такое вайп?", "как сделать вайп/хард резет?" и т.д. Ответы на эти вопросы есть в FAQ по устройствам и Android OS.
Внимание! Теме требуется больше информации, так как на данный момент информации на тему Bluetooth в Интернете ну очень мало! Не стесняйтесь, пишите в комментах то, что вы знаете на эту тему!
Шапка более регулярно не обновляется! Если считаете, что что-то надо добавить в шапку, станьте куратором, или пользуйтесь кнопкой "Жалоба"
Причина редактирования: Компромиссное (не абсолютное) решение, если после пары вк/выкл bluetooth падает профиль HSP/HFPНу-с, начнем. Есть такая программа, как AndroBluetooth. Изначально она предназначалась как пример использования скриптов, связанных с Bluetooth, но она как раз может помочь в решении наших проблем! В частности, она позволяет выполнять следующие действия:
- Форсированно включать/выключать Bluetooth - кнопка Enable/Disable
- Форсированно проводить сканирование устройств - кнопка Scan Devices
- Форсированно подключаться (спариться) к устройствам с глючным именем, к которым стандарный менеджер устройств не подключается - кнопка Pair/Unpair
- Смотреть список спаренных устройств (что, в принципе, вряд ли пригодится) - кнопка Paired Devices
Программу можно скачать по следующим ссылкам (240 кб):
С GitHub разработчика: APK
С 4pda: AndroBluetooth.apk ( 239.81 КБ )
Здравствуйте.
Хочу вывести ФМ радио через Bluetoot наушники.
Обычные наушники должны оставаться подключенными как антенна.
Есть ФМ плееры в которых это можно сделать переключением вывода звука в самом плеере.
У меня на Sony Z3 такой возможности нет.
Есть ли какие-то микшеры, чтобы выводить звук на Bluetooth гарнитуру?
Люди, помогите, пожалста!
Такая беда: есть автомагнитола Sony DSX-A50BT с блютузом, есть новый, купленный 3 дня назад, Meizu M3s mini. Телефон никак в упор не видит магнитолу. Хотя старый Huawei G700 распознает ее без проблем в качестве гарнитуры и прекрасно с ней проработал три с лишним года.
Пробовала утилиты для поиска, в т.ч. AndroidBluetooth, результата нет. Делать хард ресет телефону не хочется - только-только все настроила. С другими устройствами, в т.ч. с наушниками соединяется без проблем.
Почему они с магнитолой могут друг друга игнорить?
В ожидании хорошего источника, слушаю Яндекс.Музыку, стримя её по Bluetooth со смарта Xiaomi Redmi 5 Plus на усилитель Denon PMA-600NE.
Опытным путем установил, что при смене кодека Bluetooth с ААС на SBC, в режиме разработчика, звук ощутимо лучше. НО! При отключении Bluetooth и повторном включении кодек сбрасывается на AAC, то есть надо постоянно заходить в режим разработчика и менять на SBC. Может кто знает, как раз и навсегда включить кодек SBC и не лазить в настройки? Понимаю, что вопрос для "задротов"), но все же, откликнетесь кто в теме.
Ответы
а как у вас выходит что sbc звучит лучше? он же самый плохо-звучащий который только есть в протоколах синезуба.
хотя. я кажется понял почему это происходит. дело в том что музыку вы слушаете в таком сжатом формате что там верх ощутимо шаркаетЪ. и вот это дело SBC кодек и срезает. на самом деле вам не кодек синезуба менять надо а качество исходного контента повысить. яндекс же может в платной версии хай резы. а вы значит на бесплатной версии сидите? хмм.
Да нет, на платной я версии HD. Просто погуглив тему, я узнал что ААС изначально под ios заточен и на андройде не всегда корректно работает, в определённых случаях хуже SBC. Так прям и пишут.
а проводом то смартфон к усилку подключали? а то ситуация такая что вот вообще беспредел с этим синезубом выходит. я думаю что аналоговый выход его в такой ситуации будет лучше.
Пробовал через провод, но теряется масштабность звука, глубина что ли, стереопанорама. Видать у смарта совсем цап бюджетный, у Денона получше даже по воздуху.
Дброе утро! У меня также андроид.Гоняю через кодек aptx.Кпчество звука приличное.Перейдите на Deezer HI FI. Разницу услышите.
Дело в том, что блутуз Денона поддерживает только 2 кодека
, ААС и SBC. А так то в меню разработчика ещё валом кодеков, в том числе и aptx.
Аналогичная проблема с внутриканальными наушниками Sony. Мне тоже больше нравится звук по SBC, но смарт Samsung упорно переключает на AAC при каждом новом подключении. Сброс настроек наушников, если что, не помогает. Может есть знающие люди?
Только авторизованные пользователи могут отвечать на вопросы, пожалуйста, войдите или зарегистрируйтесь.
Подробный разбор полезных функций и настроек вашего смартфона продолжается и сегодня речь пойдет о настройках звука, которые вы можете найти в меню «Для разработчиков».
В прошлой статье (ссылку на которую найдёте ниже) я показал несколько пунктов, которые я рекомендую отключать, а так же подробно остановился на настройке «Буфера журнала», если ещё не читали, то рекомендую ознакомиться после прочтения этой публикации.
Ну что же, без лишних слов приступаем к подробному обзору и первым пунктом, смысл которого я бы хотел объяснить, станет:
Отключить абсолютный уровень громкости Bluetooth
Основным назначением этой настройки является недопущение перегрузки подключённых по Bluetooth наушников и колонок. Если активировать этот переключатель, устройству будет запрещено выходить на максимальную мощность.
Именно поэтому если в ваших беспроводных наушниках, при подключении к смартфону, звук становиться сильно тише привычного уровня, я рекомендую отключить абсолютный уровень.
Отключить аппаратную разгрузку профиля
Этот пункт, как правило не требует вмешательства пользователя смартфона, но в очень редких случаях, при отсутствии звука в Bluetooth наушниках, его нужно включить в настройках. Если же у вас всё работает, никаких действий производить не нужно.
Версия Bluetooth AVRCP
Настройка поддерживается на смартфонах с Android 8.0 и выше, и отвечает за взаимодействие между двумя устройствами (наушники и телефон).
Скорее всего на вашем смартфоне выставлено значение «AVRCP 1.4» (по умолчанию), но я рекомендую выбрать «AVRCP 1.5», так как в этой версии сохранены все возможности 1.4, но она лучше оптимизирована и на некоторых смартфонах может оказать положительное влияние на скорость отклика на различные команды, по типу: Переключение треков, повышение/уменьшение громкости, вызов голосового ассистента и так далее.
Версия Bluetooth MAP
Аудиокодек для передачи через Bluetooth
Для того чтобы вносить изменения в это меню, вам нужно знать какие кодеки поддерживаются вашими наушниками или колонкой. Самыми распространёнными являются AAC и SBC, а лучшими по качеству передаваемого звука (из доступных) LDAC и Qualcomm aptX HD Audio.
Подчёркиваю, если ваши наушники работают только с SBC, от того что вы выберете тот же LDAC, качество не улучшится, это важно понимать.
Частота дискретизации при передаче через Bluetooth
Чем больше, тем лучше, но чем лучше, тем больше ресурсов на передачу и кодирование расходует смартфон. Как и предыдущий пункт должен поддерживаться не только смартфоном, но и Bluetooth устройством, иначе настройка будет сброшена до стандартного значения (44.1 кГц). Оптимальной принято считать 48.0 кГц.
Последующие пункты настраиваются только если наушники подключённые к смартфону поддерживают LDAC и aptxHD. Но при редактировании помните, что при выборе максимального качества звука, радиус приёма сигнала может сильно сократиться.
С настройками звука закончили, если вам интересно почитать про настройки графики, напишите об этом ниже и в ближайшее время я создам подробную инструкцию.
Читайте также: