Bluetooth для android stereo

Модифицируем Bluetooth-стек для улучшения звука на наушниках без кодеков AAC, aptX и LDAC

Некоторые пользователи беспроводных наушников отмечают низкое качество звука и недостаток высоких частот при использовании стандартного 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 мс музыки.

Алгоритм расчёта всех параметров SBC достаточно сложный, можно легко запутаться, если считать вручную, поэтому я сделал интерактивный калькулятор в помощь интересующимся: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Зачем всё это нужно?

Вопреки расхожему мнению о качестве звука кодека aptX, на некоторых файлах он может давать результаты хуже, чем SBC со стандартным битрейтом в 328 кбит/с.

SBC динамически выделяет биты квантования для частотных полос, действуя по принципу «от нижних к верхним». Если весь битрейт использовался на нижние и средние частоты, верхние частоты «обрежутся» (вместо них будет тишина).
aptX квантует частотные полосы одним и тем же количеством бит постоянно, из-за чего у него постоянный битрейт: 352 кбит/с для 44.1 кГц, 384 кбит/с для 48 кГц, и он не может «перенести биты» на те частоты, которые больше всего в них нуждаются. В отличие от SBC, aptX не будет «обрезать» частоты, а будет добавлять в них шумы квантования, уменьшая динамический диапазон аудио, и иногда привносить характерные потрескивания. SBC же «съедает детали» — отбрасывает наиболее тихие участки.
В среднем, по сравнению с SBC 328k, aptX вносит меньше искажений в музыку с широким частотным диапазоном, но на музыке с узким диапазоном частот и широким динамическим диапазоном SBC 328k иногда выигрывает.

Рассмотрим частный случай. Спектрограмма записи игры на фортепиано:

Основная энергия лежит в частотах от 0 до 4 кГц, и продолжается до 10 кГц.
Спектрограмма файла, сжатого в aptX, выглядит следующим образом:

Читайте также:  What android sdk contains

А так выглядит 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.

Сравнение различий звука

Я сделал веб-сервис, кодирующий аудио в SBC (а также aptX и aptX HD) в реальном времени, прямо в браузере. С помощью него вы сможете сравнивать звук различных профилей SBC и другие кодеки, без фактической передачи аудио по Bluetooth, на любых проводных наушниках, колонках, и вашей любимой музыке, а также изменять параметры кодирования прямо во время воспроизведения аудио.
btcodecs.valdikss.org.ru/sbc-encoder

Связь с разработчиками Android

Я писал многим разработчикам Bluetooth-стека из Google, с просьбой рассмотреть включение патчей в основную ветку Android — AOSP, но не получил ни одного ответа. Мои патчи в системе работы с патчами Gerrit для Android также остались без комментариев со стороны кого-либо причастного.
Я был бы рад, если бы мне посодействовали в связи с разработчиками из Google и внедрении SBC HD в Android. Патчcет в gerrit уже устарел (это одна из ранних ревизий), и я его обновлю, если разработчиков заинтересуют мои изменения (мне непросто его обновлять, у меня нет совместимых с Android Q устройств).

Источник

Как выбрать блютуз-приемник для подключения к усилителю без потери качества звука

Приветствую вас, меломаны и почитатели качественного звука! Задумался над внедрением беспроводного соединения телефона(как источника Flac) с усилителем Барк 001. Иногда хочется плюхнуться на диван и лежа перебирать треки. У кого какие мысли, и может есть опыт?

Ответы

У меня на даче вот такой блюпуп с aptx hd.

Устраивает на 127,5%

как flac проигрывает? Есть искажения?

Искажений нет. Звук приятный получается. Провода тыкать в смартфон, смысла нет. Слушаю Tidal master и Qobuz

Прикольно). слышал тидал просто так без махинаций не подключишь, а кобуз? Каков трафик на тидале и кобузе? Я пока что юзаю спотифай ломаный, но кач-во звука мп3

И тидал и кобуз только после «махинаций» играют. Но играют замечательно!

( Подписку только нужно выбрать хай резную)

А спотифай зачем ломать. Он же официально у нас.

По трафику не могу подсказать. У меня безлимит.А дома вай фай.))

Поддерживаю, у меня такой есть, играет супер!!

Без потери качества Flac через Bluetooth передать не удастся!

Читайте также:  Android support usb otg

Даже если оба устройства (приемник Bluetooth и телефон) поддерживают Aptx HD — будет «почти CD качество»!

Ищите другие варианты!

К примеру: Купить нормальный усилитель со стриминговыми возможностями))

Bluetooth это не лучшее решение для качественно звука! Но это наиболее дешевый вариант. ЕСли нужен именно он, то необходим простой Bluetooth приемник, их масса в продаже, в т.ч. на али.

Наиболее качественные варианты «перебирать треки с телефона», это стримить звук по wi-fi через специальные приложения на сетевой плеер или медиасервер, который сам воспроизводит файлы, а вы управляете им с телефона.

имеется стример Pioneer n30, но он без блютуза, как его можно использовать?

Ставите приложение на смартфон и он превращается в пультДУ для стримера.

На нём так же можно листать треки:))

Интересный вы человек. Вот характеристики стримера (с яндекс маркета):
Функциональность

Протокол беспроводной связи AirPlay

Интерфейсы

USB 2.0 Type A, выход аудио стерео, выход аудио коаксиальный, выход аудио оптический

Поддержка форматов

MP3, WMA, AAC, PCM, OGG, FLAC, WAV

Аудиоплеер

Макс. битрейт аудиофайлов

Управление со смартфона

Такое чувство, что вы им не пользовались даже.
Если по каким-то необычным причинам все же нужен Bluetooth (например чтобы любой из ваших гостей мог подрубиться), то это не про качество и подойдет любой с Али. Ну ок, смотрите поувесистее, чтобы блютус был последний, чтобы выход на RCA.
Если у вас какие-то плейлисты во вконтакте, яндекс музыке или таком же ресурсе, и вы не знаете что с этим делать кроме как запустить по Bluetooth, то вы спокойно можете затащить их в Tidal, Deezer, Spotify с помощью специальных сервисов. Я пользуюсь https://soundiiz.com/

Гугл хромкаст аудио , отличный вариант.

Или эпл тв. Если у Вас айфон например.

У Эпл ТВ есть аналоговый выход?

Некоторое время пользовался Vikefon- bt b27.Через кодек aptx hd.У меня дорогой довольно таки смартфон на андроид. С вашим усилителем будет прекрасно. Слушал с более дешёвыми смартфонами -хуже по звуку. Сейчас уровень сетапа выше, использую через блютуз цапа Topping d50s.Там уже кодек ldac.Прекрасно всё звучит. Особенно через qobuz. По проводу минимальные отличия.

Значит можно подключить VIKEFON BT-B27 через RCA на 5-штырковый вход моего усилителя и слушать с телефона?

Через переходник. Кто сам делает, по моему и готовые продаются.Все эти кодеки заточены под андроид.

Такой. Пользуемся на работе, для страждущих подключить «свою музыку». По сравнению с плеером xDuoo X20 звук «типа жЫрнее», но качества там не много.

как понимаю, надо искать aptX HD

Да без разницы. В отличие от вайфай, в синем зубе «играет» сам приёмник. И ничем это не поправить.

ничего не понял, но очень интерессно). Можете просвятить?

При передаче через блютуз декодированием передаваемой информации занимается блютуз-приёмник. Он же является и ЦАПом. И даже при наличии продвинутых кодеков вы получаете результат декодирования сравнимый с переводом ФЛАК в МР3.

Игорь всё правильно написал. Но у меня по блюпупу,

lgv30+ играет лучше чем sony z 1.

Я чуть выше написал характеристику такого результата, «жЫрнее» играет. Но не лучше. Хотя для машины вполне оправдано. Я например слушаю с флэшки музыку в WAV.

Не доверяете Вы Игорь » эфиру»! )))

Даже забыл когда радио слушал:))

Дома пускаю иногда свежескачанное с ноутбука по вайфаю на ресивер. Но это скорей для ознакомления.

В машине старенькой стоит обычный блюпуп. Без aptx hd.

Так вот, с aptx hd , звук заметно лучше. Не катастрофически ,но очень хорошо слышно разницу .

Добрый день. Ищите вариант с поддержкой aptX (и aptX HD). Только для полноценного результата нужно, чтобы передающее устройство (смартфон, планшет и др) тоже имело поддержку этих данных.

Только авторизованные пользователи могут отвечать на вопросы, пожалуйста, войдите или зарегистрируйтесь.

Источник

Оцените статью