Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

Предупреждение: это очень сложное руководство, которое включает в себя изменение ваших стеков Bluetooth на Android – прочтите это руководство полностью и следуйте всем инструкциям в точности так, как указано.

Несмотря на то, что Bluetooth-гарнитуры и Bluetooth-звук стали довольно популярными, это небольшая проблема для аудиофилов, потому что Bluetooth, как было доказано, снижает качество звука, поскольку биты аудиоинформации и частот теряются в воздухе. Потоковая передача по Bluetooth.

Вот почему некоторые производители выпускают кодеки aptX и LDAC, чтобы улучшить качество звука по сравнению с стандартный кодек SBC Bluetooth, который поддерживается всеми наушниками и большинством устройств Bluetooth – однако устройства с кодеками aptX и LDAC намного дороже, потому что эти кодеки требуют лицензионных сборов, которые потребитель платит в долгосрочной перспективе.

Низкое качество звука кодека SBC Bluetooth вызвано искусственными ограничениями всех текущих устройств Bluetooth. cks и наушников, и это ограничение можно обойти на любых существующих устройствах.

Если вас интересует звук Bluetooth, в конце этого руководства мы покажем вам, как выполнить Сделайте дамп аудиожурнала Bluetooth и проверьте его, чтобы узнать, какое качество звука и частоту вы получаете от Bluetooth-приемника Android.

Большая часть этого руководства будет посвящена нескольким простым настройкам и способам их устранения. прочтите свой аудиовыход Bluetooth, чтобы значительно улучшить качество вывода стандартных кодеков SBC Bluetooth – пожалуйста, внимательно прочтите это руководство, так как оно достаточно образовательное, и в зависимости от модели вашего устройства есть много разных вещей, которые можно прошить или настроить.

В конце этого руководства находится список предварительно пропатченных стеков Bluetooth для многих популярных устройств Android – их можно прошить при восстановлении, как и любой другой флешируемый .zip – если ни одно из устройств не принадлежит вам придется следовать руководству по изменению стеков Bluetooth на Android.

Краткая техническая информация о кодеке SBC

SBC имеет множество различных параметров, которые согласовываются на этапе установки соединения:

  • Тип и номер аудиоканала: Joint Stereo, Stereo, Dual Channel, Mono;
  • Количество полос частот: 4 или 8;
  • Количество аудиоблоков в один пакет: 4, 8, 12, 16;
  • Алгоритм распределения битов квантования: Громкость, SNR;
  • Максимальный и минимальный битовый пул, используемый в процессе квантования: обычно 2 -53.

Декодер должен поддерживать любую комбинацию этих параметров. Кодировщик может реализовать только часть из них.

Существующие стеки Bluetooth обычно согласовывают следующий профиль: Joint Stereo, 8 диапазонов, 16 блоков, Loudness, bitpool 2..53. Этот профиль кодирует звук 44,1 кГц с битрейтом 328 кбит/с.

Параметр Bitpool напрямую влияет на битрейт в том же профиле: чем он выше, тем выше битрейт и, следовательно, качество.

Однако параметр bitpool не привязан к конкретному профилю. На битрейт также существенно влияют другие параметры: тип аудиоканала, количество полос частот, количество аудиоблоков. Вы можете косвенно увеличить битрейт, согласовав нестандартные профили без изменения битового пула.

Например, Dual Channel кодирует каналы отдельно, используя весь битовый пул для каждого канала. Вынуждая устройство использовать Dual Channel вместо Joint Stereo, мы получим почти удвоенный битрейт при том же максимальном битпуле, 617 кбит/с.

Мне кажется, что битпул должен быть внутренней переменной. Ошибка разработки спецификации A2DP заключается в том, что значение битового пула не привязано к другим параметрам кодека и определяется только как глобальное значение.

Эти фиксированные значения битового пула и битрейта происходят из рекомендуемых значений для высококачественного звука. Но эта рекомендация не является оправданием для ограничения профиля этими значениями.

Спецификация A2DP v1.2, действовавшая с 2007 по 2015 год, требует, чтобы все декодеры работали правильно с битрейтом до 512 кбит/с. :

Декодер SNK должен поддерживать все возможные значения битового пула, которые не приводят к превышению максимальной скорости передачи битов. Этот профиль ограничивает доступную максимальную скорость передачи данных до 320 кбит/с для моно и 512 кбит/с для двухканальных режимов.

В новой версии спецификации нет ограничения скорости передачи данных. Предполагается, что современные наушники, выпущенные после 2015 года, могут поддерживать битрейты до 1000 кбит/с .

По какой-то причине все протестированные на данный момент стеки Bluetooth (Linux (PulseAudio), Android, Blackberry и macOS) имеют искусственные ограничения максимального параметра bitpool, который напрямую влияет на максимальный битрейт. Но это не самая большая проблема, почти все наушники также ограничивают максимальное значение битового пула 53.

Большинство устройств нормально работают на модифицированном стеке Bluetooth с битрейтом 507 кбит/с, без прерываний и треска. Но такой битрейт никогда не будет согласован в нормальных условиях со стандартными стеками Bluetooth.

*** Требуется для тестирования с использованием руководств ниже: bluetooth-dualchannel-test-ubuntu-18.04 .1-desktop-amd64.iso.torrent

Как протестировать на ПК

SBC с высоким битрейтом Тест на совместимость наушников проще всего выполнить на ПК с адаптером Bluetooth. Я подготовил образ Ubuntu с модифицированным стеком Bluetooth, который можно запускать как на виртуальной машине (подключив адаптер Bluetooth в качестве USB-устройства внутри виртуальной машины, он также работает с адаптерами, встроенными в ноутбуки) или загрузившись с флешку. В этом изображении используется следующий профиль: двухканальный, 8 диапазонов, 16 блоков, громкость, битовый пул 2..41, 44,1 кГц, что обеспечивает битрейт 485 кбит/с.

Работа в режиме VM

  • Загрузите Virtualbox и Virtualbox Extension Pack: https://www.virtualbox. org/wiki/Downloads;
  • Установить Virtualbox, запустить его;
  • Установить пакет расширений, используя Файл → Настройки → Расширения;
  • Создать новая виртуальная машина: Linux, Ubuntu (64-бит), 1024 RAM. Не создавайте жесткий диск.
  • Перейдите к настройкам виртуальной машины, в Хранилище выберите Контроллер: IDE, Пусто, нажмите значок компакт-диска → Выбрать файл виртуального оптического диска;
  • Выбрать загружен bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Сохраните и закройте окно настроек, запустите виртуальную машину;
  • Щелкните правой кнопкой мыши Значок USB-кабеля в правом нижнем углу выберите свой адаптер Bluetooth;

Работает на ПК

Изображение поддерживает загрузку BIOS/CSM и UEFI.

  • Запишите образ на USB-накопитель с помощью Etcher: https://etcher.io/. Эта операция удалит все существующие файлы на USB-накопителе.
  • Выключите ПК;
  • Вставьте USB-накопитель, включите ПК и нажмите кнопку порядка загрузки ( обычно Esc или F12);
  • Выберите USB-накопитель.

Выполнение теста

  • (необязательно, но рекомендуется) Дважды щелкните сценарий «Btsnoop Dump» на рабочем столе. Он начнет сбор данных Bluetooth для последующего анализа. Не закрывайте окно терминала.
  • Переключите наушники в режим сопряжения;
  • Щелкните стрелку в правом верхнем углу, выберите значок Bluetooth → Настройки Bluetooth;
  • Выберите наушники, дождитесь завершения сопряжения и закройте окно;
  • Установите громкость Ubuntu примерно на 2/3. Также уменьшите громкость с помощью кнопок гарнитуры, так как после сопряжения звук может быть очень громким.
  • Откройте папку «музыка», запустите «testrecord1.flac»;
  • (необязательно, но рекомендуется ) Закройте плеер, закройте окно терминала. Это остановит сбор данных.
  • (необязательно, но рекомендуется) Откройте браузер Firefox, загрузите дамп данных (btsnoop_hci.btsnoop на рабочем столе) на https://btcodecs.valdikss.org.ru/

Вы можете слушать другую музыку в музыкальной папке или загружать свою собственную;

Не должно быть потрескивания, прерывания звука или других искажений звука в наушники. Если вы слышите хороший высококачественный звук, это означает, что ваши наушники поддерживают звук с битрейтом 485 кбит/с.

Как протестировать на устройстве Android

Для тестирования со смартфона или планшета Android вам необходимо использовать модифицированный стек Bluetooth, для которого требуются права root.

Как записать дамп данных Bluetooth на Android

  1. Отключить Bluetooth;
  2. В настройках разработчика включите переключатель «Включить журнал отслеживания Bluetooth HCI»;
  3. Включите Bluetooth, подключитесь к гарнитуре с помощью меню Bluetooth (это важно! Не разрешайте автоматическое подключение!);
  4. Воспроизвести короткий фрагмент аудио;
  5. Откройте настройки разработчика, отключите переключатель «Включить журнал отслеживания Bluetooth HCI»;
  6. Должно быть/storage/emulated/0/btsnoop_hci.log или/data/misc/bluetooth/logs/ btsnoop_hci.log создан. Если он отсутствует, откройте/etc/bluetooth/bt_stack.conf с помощью текстового редактора и посмотрите путь в параметре BtSnoopFileName.

Не должно быть потрескивания, прерывания звука или других искажений звука. в наушниках. Если вы слышите качественный звук с исправленной библиотекой, это означает, что ваши наушники поддерживают звук с битрейтом 512 кбит/с.

Пожалуйста, внимательно следуйте приведенному выше алгоритму. Особенно, если вы выключите наушники или отключите их после сопряжения, важно подключиться к наушникам вручную в настройках Bluetooth, не разрешайте автоматическое подключение!

Устройства, поддерживающие в минимум 512 кбит/с SBC

  • 1 БОЛЬШЕ iBFree
  • JBL Everest 310
  • JBL Everest 700
  • Skullcandy HESH 3
  • Sony WI-C400
  • Sony MDR-1ABT
  • Sony MDR- ZX770BT
  • Sony MDR-XB650BT
  • Sony MDR-XB950B1
  • Sony SBH50
  • Bluedio T4s ( Bitpool max 39. Отвечает, что не поддерживает Dual Channel, но работает, если принудительно, 462 кбит/с. Не соответствует спецификации A2DP.
  • Bluedio T5 (Отвечает, что не поддерживает Dual Channel, но работает если принудительно. Не соответствует спецификации A2DP.)
  • Bluedio T6 (Отвечает, что не поддерживает Dual Channel, но работает, если принудительно. Не соответствует спецификации A2DP. Принять микросхему Max 97220.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Адаптер Logitech BT
  • Автомобильное головное устройство Noname (микросхема CSR8645 )
  • Автомобильное головное устройство Sony DSX-A400BT

Устройства, поддерживающие SBC более 512 кбит/с

  • JBL Everest 310 (617-660 кбит/с)
  • Sony WI-C400 (576 кбит/с)
  • Sony MDR-ZX770BT (617-660 кбит/с)
  • Marshall Major II Bluetooth (617-660 кбит/с)
  • Overdrive RealForce D1 (730 кбит /s, двухканальный, 4 поддиапазона)

Устройства, которые не работают с более высокими битрейтами или двухканальными

  1. Harper HB-202 (треск; Чип Beken BK3256)
  2. Sony Ericsson MW600 (высокочастотные искажения, треск; устройство с 2009 года)

Почему это важно: SBC 328k и 485k против aptX

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

SBC динамически выделяет биты квантования для частотных диапазонов, действуя по принципу «снизу вверх». Если для нижних и средних частот использовался весь битрейт, верхние частоты «обрезаются» (заглушаются).

aptX постоянно квантует полосы частот с одинаковым количеством битов, что делает его кодек с постоянным битрейтом: 352 кбит/с для 44,1 кГц, 384 кбит/с для 48 кГц. Он не может «передавать биты» на частоты, которые им больше всего нужны.. В отличие от SBC, aptX не «срезает» частоты, но добавляет к ним шум квантования, уменьшая динамический диапазон звука и иногда вызывая потрескивание. SBC, напротив, «ест детали» – отбрасывает самые тихие участки.

В среднем, по сравнению с SBC 328k, aptX дает меньше искажений в музыке с широким частотным диапазоном, но на музыке с узкий частотный диапазон и широкий динамический диапазон SBC 328k иногда выигрывает.

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

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

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

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

Вот SBC 328k:

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

It видно, что SBC 328k периодически полностью отсекает диапазон выше 16 кГц и использует все доступные битрейты для диапазонов ниже этого значения. Однако aptX привнес больше искажений в частотный спектр, слышимый человеческим ухом, что можно увидеть на вычтенной исходной спектрограмме из спектрограммы aptX (чем ярче, тем больше искажений):

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

В то время как SBC 328k внес меньше искажений в сигнал в диапазоне от 0 до 10 кГц, а остальное было вырезано:

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

Битрейта 485k для SBC хватило, чтобы сохранить весь частотный диапазон, не обрезая полосы.

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

SBC 485k на этом аудиосэмпле намного лучше, чем aptX в диапазоне 0-15 кГц, и с меньшей, но все же заметной разницей – на 15-22 кГц ( чем темнее, тем меньше искажений):

Как изменить стеки Bluetooth на Android для значительного улучшения качества звука Bluetooth

Переключение на SBC с высокой скоростью передачи данных, большую часть времени вы будете получать звук, превосходящий aptX, на любые наушники.

  • original_and_aptx.zip
  • sbc.zip

Как изменить стеки Bluetooth на Android 5–7

Эти изменения следует применить к стандартным стекам Bluetooth для Android: Bluedroid (Android 5) и Fluoride (Android 6-7). Стек, модифицированный Qualcomm, не поддерживается.

Замена Joint Stereo на Dual Channel в стандартной конфигурации SBC

android/platform/external /блютуз/bluedroid/btif/co/bta_av_co. c: 99

Код:

 const tA2D_SBC_CIE btif_av_sbc_default_config = {BTIF_AV_SBC_DEFAULT_SAMP_FREQ, * * samp_freq */A2D_SBC_IE_CH_MD_DEFAULT_SAMP_FREQ, * * samp_freq */A2D_SBC_IE_CH_MD_JOINT_JO_MO_IN_JO_I_E_CH_CH_MD_JOIN  ,/* Num_subbands */A2D_SBC_IE_ALLOC_MD_L,/* alloc_mthd */BTA_AV_CO_SBC_MAX_BITPOOL,/* max_bitpool */A2D_SBC_IE_MIN_BITPOOL/* A2D_SBC_IE_MIN_BITPOOL/* A2D_SBC_IE_MIN_BITPOOL/* A2_SBC_MIN_BITPOOL>  >  Увеличить приоритет двухканального режима   

android/platform/external/bluetooth/bluedroid/btif/co/bta_av_co.c: 41

Код:

 if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT;  иначе, если (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO;  иначе, если (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL;  else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Переместить if с A2D_SBC_IE_CH_MD_DUAL наверх. 

Отключить или увеличить ограничение битрейта.

Стек Android Bluetooth имеет не только ограничение на битрейт, но и ограничение битрейта, 328 кбит/с. Если наушники поддерживают, например, битовый пул 53 для 48 кГц, Android уменьшит битовый пул до предела 328 кбит/с. Это произойдет ПОСЛЕ согласования кодеков, на этапе кодирования, не учитывайте значение битового пула в пакете Bluetooth SetCapabilities.

android/platform/external/bluetooth/bluedroid/btif/src/btif_media_task.c : 172

Код:

 #define DEFAULT_SBC_BITRATE 328 

Заменить на 512.

  1. (только для экспериментов) Отключить ограничение MTU.

Это требуется для битрейта выше ~ 580 кбит/с.

btif/src /btif_media_task.c:174

Code:

/* Размер полезной нагрузки 2DH5 составляет 679 байт - (4 байта заголовка L2CAP + 12 байтов заголовка AVDTP) */# определить  MAX_2MBPS_AVDTP_MTU 663 

Как изменить стеки Bluetooth на Android 8–9

Эти модификации не тестировались, но должны работать.

Добавить поддержку двух каналов в источник A2DP SBC

/platform/system/bt/stack/a2dp/a2dp_sbc. cc: 55

Код:

/* Возможности кодека SBC SRC */static const tA2DP_SBC_CIE a2dp_sbc_caps = {A2DP_SBC_IE_SAMP_FREQ_44,/* samp_freq */(A2DP_MBCD_IE  | A2DP_SBC_IE_CH_MD_JOINT),/* ch_mode */(A2DP_SBC_IE_BLOCKS_16 | A2DP_SBC_IE_BLOCKS_12 | A2DP_SBC_IE_BLOCKS_8 | A2DP_SBC_IE_BLOCKS_4),/* block_len */A2DP_SBC_IE_SUBBAND_8,/* num_subbands */A2DP_SBC_IE_ALLOC_MD_L,/* alloc_method */A2DP_SBC_IE_MIN_BITPOOL,/* min_bitpool */A2DP_SBC_MAX_BITPOOL,/* max_bitpool  */BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16/* bits_per_sample */}; 

добавить A2DP_SBC_IE_CH_MD_DUAL в ch_mode.

Заменить Joint Stereo на Dual Channel в конфигурации по умолчанию

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:82

Код:

/* Конфигурация кодека SBC по умолчанию */const tA2DP_SBC_CIE a2dp_sbc_default_config = {A2DP_SBC_IE_SAMP_FRE  Q_44,/* samp_freq */A2DP_SBC_IE_CH_MD_JOINT,/* ch_mode */A2DP_SBC_IE_BLOCKS_16,/* block_len */A2DP_SBC_IE_SUBBAND_8,/* num_subbands */A2DP_SBC_IE_ALLOC_MD_L,/* alloc_method */A2DP_SBC_IE_MIN_BITPOOL,/* min_bitpool */A2DP_SBC_MAX_BITPOOL,/* max_bitpool */BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 /* bits_per_sample */}; 

Заменить A2DP_SBC_IE_CH_MD_JOINT на A2DP_SBC_IE_CH_MD_DUAL.

Увеличить приоритет двухканального режима

/platform/system/bt/stack/a2dp/a2dp_sbc.cc:1155

Код:

 static bool select_best_channel_mode  (uint8_t ch_mode, tA2DP_SBC_CIE * p_result, btav_a2dp_codec_config_t * p_codec_config) {если (ch_mode & A2DP_SBC_IE_CH_MD_JOINT) {p_result-> ch_mode_ A2_JDP_INT_MODE = A2_DP_INT_S  p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;  вернуть истину;  } Если (ch_mode & A2DP_SBC_IE_CH_MD_STEREO) {p_result-> ch_mode = A2DP_SBC_IE_CH_MD_STEREO;  p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;  вернуть истину;  } Если (ch_mode & A2DP_SBC_IE_CH_MD_DUAL) {p_result-> ch_mode = A2DP_SBC_IE_CH_MD_DUAL;  p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;  вернуть истину;  } Если (ch_mode & A2DP_SBC_IE_CH_MD_MONO) {p_result-> ch_mode = A2DP_SBC_IE_CH_MD_MONO;  p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;  вернуть истину;  } Return false;} 

Переместить if с A2DP_SBC_IE_CH_MD_DUAL наверх.

Увеличить лимит битрейта

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:42

Код:

 #define A2DP_SBC_DEFAULT_BITRATE  328 

Заменить на 512.

  1. (только для экспериментов) Отключить ограничение MTU

Требуется для битрейта выше ~ 580 кбит/с.

/platform/system/bt/stack/a2dp/a2dp_sbc_encoder.cc:47

Код:

 #define MAX_2MBPS_AVDTP_MTU 663 

Исправленные стеки Bluetooth (с возможностью прошивки)

  • Le Max 2 Oreo Patched.zip
  • LeEco Cool Changer S1 EUI_5.8.19S.zip
  • Leeco LE2 (EUI 5.9.26s, Android 6) .zip
  • Xiaomi Mi Note (Miui 9 Miui.su usnkreal v8.4.12, Android 6.0.1) .zip
  • Xiaomi mi note 3 (MIUI 9, Android 7) .zip
  • Xiaomi Mi4c (Android 7.0 NRD90M, MIUI-9.5 9.5.1.0 (NXKCNFA)). zip
  • Xiaomi MI5s (MIUI Global 9.6.1.0, Android 7) .zip
  • Xiaomi Redmi 3s (android 6.01, mmb29m, miui global 9.6.1.0) .zip
  • Xiaomi Redmi 4 (MiuiPro 10 8.8.2, Android 6.0.1, MMB29M). zip
  • Xiaomi Redmi 4 Prime.zip
  • Xiaomi Redmi 4 pro (MIUI 9, miuipro 8.4.26) .zip
  • Xiaomi Redmi Note 3 (Resurrection Remix Android 7.1.2_r36) .zip
  • Redmi Note 4x (Masik Premium, android 7.0) .zip
  • Asus Zoom (Android 5, 2 .26.40.108_20160520) .zip
  • Le Max 2 Oreo Patched.zip
  • Huawei P9 (Android 7) .zip
  • Samsung Galaxy S4 LTE GT-I9505 (Android 7.1.2; LineageOS 14.1-20180615-NIGHTLY-jfltexx) .zip
  • zip
  • Le Max 2 Oreo Patched.zip

Источник