Як змінити стеки Bluetooth на Android для покращеної якості аудіо Bluetooth

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

Незважаючи на те, що гарнітура Bluetooth та аудіо Bluetooth стали досить популярними, для аудіофілів це проблематика, оскільки Bluetooth, як було доведено, знижує якість звуку, оскільки біти аудіоінформації та частоти губляться в повітрі через потокове передавання Bluetooth.

Ось чому деякі виробники випускають кодеки aptX та LDAC, щоб підвищити якість звуку в порівнянні зі стандартним кодеком SBC Bluetooth, який підтримується всіма навушниками та більшістю пристроїв Bluetooth - однак пристрої з кодеками aptX та LDAC набагато дорожчі, оскільки ці кодеки вимагають плати за ліцензування, яку споживач сплачує в перспективі.

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

Якщо ви зацікавлені в аудіо Bluetooth, ми покажемо вам в кінці цього посібника про те, як прийняти аудіозапис Bluetooth-аудіо та перевірити його, щоб побачити, яку якість та частоту звуку ви отримуєте від Bluetooth-приймача Android на вашому Android.

Більшість цього посібника зосередиться на кількох простих налаштуваннях та способах зчитування аудіовиходу Bluetooth, щоб значно покращити якість виходу стандартних кодеків Bluetooth SBC - будь ласка, прочитайте ретельно цей посібник уважно як його досить навчальний, і є багато різних речей для спалаху чи налаштування, залежно від моделі вашого пристрою.

У цьому кінці цього посібника наведено список попередньо закріплених стеків Bluetooth для багатьох популярних пристроїв Android - їх можна відновити, як і будь-який інший миттєвий .zip - якщо жоден з пристроїв не належить вам, у вас буде слідувати керівництву щодо зміни стеків Bluetooth на Android.

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

SBC має безліч різних параметрів, про які узгоджується на етапі налаштування з'єднання:

  • Тип та номер аудіоканалу: Спільна стерео, Стерео, Подвійний канал, Моно;
  • Кількість смуг частот: 4 або 8;
  • Кількість аудіоблоків в одному пакеті: 4, 8, 12, 16;
  • Алгоритм розподілу бітів квантування: Гучність, SNR;
  • Максимальний і мінімальний бітовий пул, що використовується в процесі квантування: зазвичай 2-53.

Декодер необхідний для підтримки будь-якої комбінації цих параметрів. Енкодер може реалізувати лише частину з них.

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

Параметр Bitpool безпосередньо впливає на бітрейт в межах одного профілю: чим він вище, тим більший бітрейт, а отже, і якість.

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

Наприклад, подвійний канал кодує канали окремо, використовуючи весь бітовий пул для кожного каналу. Примушуючи пристрій використовувати подвійний канал замість Joint Stereo, ми отримаємо майже подвоєний бітрейт при тому самому максимальному бітовому пулі, 617 кбіт / с.

Мені здається, що бітпул повинен бути внутрішньою змінною. Помилка дизайну специфікації A2DP полягає в тому, що значення бітпула не пов'язане з іншими параметрами кодека і визначається лише як глобальне значення.

Ці фіксовані значення Bitpool та Bit походять від рекомендованих значень для високоякісного звуку. Але рекомендація не є приводом для обмеження профілю цими значеннями.

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

Декодер SNK повинен підтримувати всі можливі значення бітпулу, які не призводять до перевищення максимальної бітової швидкості. Цей профіль обмежує доступну максимальну швидкість передачі бітів до 320 кбіт / с для моно та 512 кбіт / с для двоканальних режимів.

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

Чомусь у всіх тестованих на даний момент стеках Bluetooth (Linux (PulseAudio), Android, Blackberry та macOS) є штучні обмеження максимального параметра бітпула, що безпосередньо впливає на максимальний бітрейт. Але це не найбільша проблема, майже всі навушники також обмежують максимальне значення біт-пулу до 53.

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

*** Необхідно для тестування за допомогою посилань нижче: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Як перевірити на ПК

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

Запуск у ВМ

  • Завантажити пакет розширень Virtualbox та Virtualbox: //www.virtualbox.org/wiki/Завантажити;
  • Встановити Virtualbox, запустити його;
  • Встановіть пакет розширень за допомогою Файл → Налаштування → Розширення;
  • Створіть нову віртуальну машину: Linux, Ubuntu (64-розрядна), 1024 ОЗУ. Не створюйте жорсткий диск.
  • Перейдіть до налаштувань віртуальної машини, у Storage оберіть Controller: IDE, Empty, натисніть піктограму CD → Виберіть файл віртуального оптичного диска;
  • Виберіть завантажений Bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Зберегти та закрити вікно налаштувань, запустити віртуальну машину;
  • Клацніть правою кнопкою миші значок USB-кабелю в нижньому правому куті, виберіть Bluetooth адаптер;

Запуск на ПК

Зображення підтримує завантаження BIOS / CSM та UEFI.

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

Виконання тесту

  • (Необов’язково, але рекомендується) Двічі клацніть на сценарії “Btsnoop Dump” на робочому столі. Він почне збирання даних Bluetooth для подальшого аналізу. Не закривайте вікно терміналу.
  • Переключити навушники в режим сполучення;
  • Клацніть на стрілку у верхньому правому куті, виберіть значок Bluetooth → Налаштування Bluetooth;
  • Виберіть навушники, дочекайтеся завершення створення пари і закрийте вікно;
  • Встановіть гучність Ubuntu приблизно на 2/3. Також зменшіть гучність за допомогою кнопок гарнітури, оскільки це може бути дуже гучним після створення пари.
  • Відкрити папку «музика», відтворити «testrecord1.flac»;
  • (Не обов’язково, але рекомендується) Закрити програвач, закрити вікно терміналу. Це зупинить захоплення даних.
  • (Не обов’язково, але рекомендується) Відкрийте браузер Firefox, завантажте дамп даних (btsnoop_hci.btsnoop на робочий стіл) на //btcodecs.valdikss.org.ru/

Ви можете слухати іншу музику в музичній папці або завантажити власну;

У навушниках не повинно бути потріскувань, переривань звуку чи інших спотворень звуку. Якщо ви чуєте якісний звук високої якості, це означає, що ваші навушники підтримують звук зі швидкістю передачі даних 485 кбіт / с.

Як перевірити на пристрої Android

Для тестування на смартфоні чи планшеті Android потрібно використовувати модифікований стек Bluetooth, який вимагає root права.

Як захопити дамп даних Bluetooth на Android

  1. Вимкніть Bluetooth;
  2. У налаштуваннях розробника увімкніть перемикач «Увімкнути журнал затримок Bluetooth HCI»;
  3. Увімкніть Bluetooth, підключіться до гарнітури за допомогою меню Bluetooth (це важливо! Не допускайте автоматичного підключення!);
  4. Відтворити короткий зразок аудіо;
  5. Відкрийте налаштування розробника, відключіть перемикач «Увімкнути журнал snoop 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

  • 1MORE iBFree
  • JBL Everest 310
  • JBL Everest 700
  • Черепчастий HESH 3
  • Sony WI-C400
  • Sony MDR-1ABT
  • Sony MDR-ZX770BT
  • Sony MDR-XB650BT
  • Sony MDR-XB950B1
  • Sony SBH50
  • Bluedio T4s (Бітпул макс. 39. Відповідь на те, що не підтримує подвійний канал, але працює за умови примусового використання, 462 кбіт / с. Не відповідає специфікації A2DP.)
  • Bluedio T5 (Відповідайте, що не підтримує подвійний канал, але працюйте, якщо це примусово. Не відповідає специфікації A2DP.)
  • Bluedio T6 (Відповідайте, що не підтримує подвійний канал, але працюйте, якщо це примусово. Не відповідає специфікації A2DP. Прийміть чіп Max 97220.)
  • Маршалл Майор II Bluetooth
  • Overdrive RealForce D1
  • Едифікатор 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 кбіт / с)
  • Маршалл Майор II Bluetooth (617-660 кбіт / с)
  • Overdrive RealForce D1 (730 кбіт / с, двоканальний, 4 піддіапазони)

Пристрої, які не працюють з більш високими бітрейтами або двоканальним каналом

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

Чому це важливо: SBC 328k та 485k vs aptX

Всупереч поширеній думці про якість звуку 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 більшу частину часу, у будь-яких навушниках.

  • original_and_aptx.zip
  • sbc.zip

Як змінити стеки Bluetooth на Android 5 - 7

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

Замініть спільний стереосигнал на подвійний канал у стандартній конфігурації 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: 4

Код:

 якщо (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 SetCapability.

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

Ці модифікації не перевірені, але повинні працювати.

Додайте підтримку подвійних каналів у джерело SBC A2DP

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

Код:

 / * Можливості кодека SBC SRC * / статичний const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

додайте A2DP_SBC_IE_CH_MD_DUAL у ch_mode.

Замініть спільний стереосистему на подвійний канал у конфігурації за замовчуванням

/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 / * bits_per_sample * /}; 

Замініть A2DP_SBC_IE_CH_MD_JOINT на A2DP_SBC_IE_CH_MD_DUAL.

Збільшити пріоритет подвійного каналу

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

Код:

 статичний 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_JOINT_> p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; повернути правду; } if (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; повернути правду; } if (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; повернути правду; } if (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; повернути правду; } повернути помилкове; } 

Перемістіться, якщо з 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
  • блискавка
  • Le Max 2 Oreo Patched.zip

Цікаві Статті