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



Попробуйте наш инструмент устранения неполадок

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



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



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



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

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

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

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

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

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

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

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

*** Требуется для тестирования с использованием приведенных ниже руководств: Bluetooth-dualchannel-test-ubuntu-18.04.1-рабочий стол-amd64.iso.torrent

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

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

Запуск в виртуальной машине

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

Запуск на ПК

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

  • Запишите образ на USB-накопитель с помощью Etcher: https://etcher.io/. Эта операция удалит все существующие файлы на 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 (Отвечает, что не поддерживает двухканальный режим, но работает, если принудительно. Не соответствует спецификации A2DP. Принять микросхему Max 97220).
  • Marshall Major II Bluetooth
  • Овердрайв 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 кбит / с, двухканальный, 4 поддиапазона)

Устройства, которые не работают с более высоким битрейтом или Dual Channel

  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.

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


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

  • 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 / платформа / внешний / Bluetooth / 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_JOINT, / * ch_mode * / A2D_SBC_IE_BLOCKS_16, / * block_len * / A2D_SBC_IE_SUBBAND_8, / * num_subbands * / A2D_SBC_IE_ALLOC_MD_L, / * alloc_mthd * / BTA_AV_CO_SBC_MAX_BITPOOL, / * max_bitpool * / A2D_SBC_IE_MIN_BITPOOL / * min_bitpool * /};

Замените A2D_SBC_IE_CH_MD_JOINT на A2D_SBC_IE_CH_MD_DUAL.

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

Android / платформа / внешний / Bluetooth / bluedroid / btif / co / bta_av_co.c: 41

Код:

если (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; иначе, если (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Переместите, если с A2D_SBC_IE_CH_MD_DUAL наверх.
  1. Отключить или увеличить ограничение битрейта

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

Android / платформа / внешний / 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

Код:

/ * Размер полезной нагрузки 2DH5 составляет 679 байтов - (4 байта заголовка L2CAP + 12 байтов заголовка AVDTP) * / #define 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_BLOCKS_8;

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

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

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

Код:

/ * По умолчанию СБК кодек конфигурации * / Const tA2DP_SBC_CIE a2dp_sbc_default_config = {A2DP_SBC_IE_SAMP_FREQ_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 / * bit_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) {if (ch_mode & A2DP_SBC_IE_CH_MD_JO_INT_INT_CHO_MD_JO_INT_INT) {pINT_CH_MD_JO_INT_INT) 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; }

Переместите если с 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 (ремикс воскрешения 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
  • застегивать
  • Le Max 2 Oreo Patched.zip
10 минут на чтение