Cum se modifică stivele Bluetooth pe Android pentru o calitate audio foarte îmbunătățită Bluetooth



Încercați Instrumentul Nostru Pentru Eliminarea Problemelor

Avertisment: Acesta este un ghid extrem de avansat care implică modificarea stivelor Bluetooth pe Android - citiți acest ghid în întregime și urmați toate instrucțiunile exact așa cum sunt date.



În ciuda faptului că căștile Bluetooth și sunetul Bluetooth au devenit destul de populare, este un pic o problemă pentru audiofili, deoarece Bluetooth s-a dovedit că reduce calitatea audio, întrucât bucăți de informații audio și frecvențe se pierd în aer prin streaming Bluetooth.



Acesta este motivul pentru care unii producători lansează codecuri aptX și LDAC, pentru a îmbunătăți calitatea sunetului peste codecul standard SBC Bluetooth, care este acceptat de toate căștile și de majoritatea dispozitivelor Bluetooth - cu toate acestea, dispozitivele cu codecuri aptX și LDAC sunt mult mai scumpe, deoarece aceste codecuri necesită taxe de licențiere, pe care consumatorul le plătește pe termen lung.



Calitatea redusă a sunetului codecului SBC Bluetooth este cauzată de limitări artificiale ale tuturor configurărilor actuale ale stivelor Bluetooth și ale căștilor, iar această limitare poate fi ocolită pe orice dispozitive existente.

Dacă sunteți interesat de sunetul Bluetooth, vă vom arăta la sfârșitul acestui ghid cum să preluați un jurnal audio Bluetooth și să îl inspectați pentru a vedea ce fel de calitate audio și frecvență obțineți de pe receptorul Bluetooth al Android.

Majoritatea acestui ghid se va concentra pe câteva modificări simple și modalități de a citi ieșirea audio Bluetooth pentru a îmbunătăți calitatea ieșirii codecurilor standard SBC Bluetooth - vă rugăm să citiți cu atenție acest ghid întrucât este destul de educativ și există o mulțime de lucruri diferite pentru a clipi sau a modifica, în funcție de modelul dispozitivului.



La acest sfârșit al acestui ghid este o listă de stive Bluetooth pre-patch-uri pentru o mulțime de dispozitive Android populare - acestea pot fi clipite în recuperare, așa cum ați face cu orice alt .zip flashable - dacă niciunul dintre dispozitive nu vă aparține, veți avea pentru a urma ghidul pentru modificarea stivelor Bluetooth pe Android.

Scurte informații tehnice despre codecul SBC

SBC are o mulțime de parametri diferiți care sunt negociați în timpul fazei de configurare a conexiunii:

  • Tipul și numărul canalului audio: Joint Stereo, Stereo, Dual Channel, Mono;
  • Număr de benzi de frecvență: 4 sau 8;
  • Numărul de blocuri audio dintr-un pachet: 4, 8, 12, 16;
  • Algoritm de alocare a bitului de cuantizare: Loudness, SNR;
  • Rezerva maximă și minimă de biți utilizată în procesul de cuantificare: de obicei 2-53.

Decodorul este necesar pentru a suporta orice combinație a acestor parametri. Codificatorul poate implementa doar o parte din ele.

Stivele Bluetooth existente negociază de obicei următorul profil: Joint Stereo, 8 benzi, 16 blocuri, Loudness, bitpool 2..53. Acest profil codifică sunetul de 44,1 kHz cu o rată de biți de 328 kbps.

Parametrul Bitpool afectează în mod direct rata de biți din același profil: cu cât este mai mare, cu atât este mai mare rata de biți și, prin urmare, calitatea.

Cu toate acestea, parametrul pool-ului de biți nu este legat de un profil specific. Rata de biți este, de asemenea, afectată semnificativ de alți parametri: tipul canalului audio, numărul benzilor de frecvență, numărul de blocuri audio. Puteți crește rata de biți indirect prin negocierea profilurilor nestandardizate, fără a schimba grupul de biți.

De exemplu, Dual Channel codifică canalele separat, folosind întregul pool de biți pentru fiecare canal. Forțarea dispozitivului să utilizeze Dual Channel în loc de Joint Stereo ne va duce la o rată de biți aproape dublată la același pool de biți maxim, 617 kbps.

Pentru mine, simt că Bitpool ar trebui să fie o variabilă internă. Este o defecțiune de proiectare a specificațiilor A2DP că valoarea pool-ului de biți nu este legată de alți parametri de codec și este definită doar ca valoare globală.

Aceste valori fixe Bitpool și Bitrate provin din valorile recomandate pentru audio de înaltă calitate. Dar recomandarea nu este o scuză pentru a limita profilul la aceste valori.

Specificația A2DP v1.2, care a fost activă din 2007 până în 2015, necesită ca toate decodoarele să funcționeze corect cu rate de biți de până la 512 kbps:

Decodificatorul SNK trebuie să accepte toate valorile posibile ale grupului de biți care nu au ca rezultat depășirea ratei de biți maxime. Acest profil limitează rata de biți maximă disponibilă la 320kb / s pentru mono și la 512kb / s pentru modurile cu două canale.

În noua versiune a specificației nu există limitări ale bitrate-ului. Se presupune că căștile moderne lansate după 2015 pot suporta rate de biți până la 1000 kbps .

Din anumite motive, toate stivele Bluetooth testate în prezent (Linux (PulseAudio), Android, Blackberry și macOS) au restricții artificiale ale parametrului maxim bitpool, care afectează în mod direct rata de biți maximă. Dar aceasta nu este cea mai mare problemă, aproape toate căștile limitează, de asemenea, valoarea maximă a bitpool-ului la 53.

Majoritatea dispozitivelor funcționează bine pe o stivă Bluetooth modificată cu o rată de biți de 507 kbps, fără întreruperi și crăpături. Dar un asemenea bitrate nu va fi negociat niciodată în condiții normale, cu stive Bluetooth stoc.

*** Necesar pentru testarea folosind ghidurile de mai jos: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Cum se testează pe un PC

Testul de compatibilitate a căștilor SBC cu rată de biți ridicată este cel mai ușor de realizat pe computer cu un adaptor Bluetooth. Am pregătit imaginea Ubuntu cu un teanc Bluetooth modificat, care poate fi rulat ca într-o mașină virtuală (conectând adaptorul Bluetooth ca dispozitiv USB în mașina virtuală, funcționează și cu adaptoarele încorporate în laptopuri) sau pornind de la unitatea flash USB. Această imagine folosește următorul profil: Dual Channel, 8 benzi, 16 blocuri, Loudness, bitpool 2..41, 44,1 kHz, care oferă o rată de biți de 485 kbps.

Rularea într-o mașină virtuală

  • Descărcați Virtualbox și Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Instalați Virtualbox, porniți-l;
  • Instalați Extension Pack folosind Fișier → Preferințe → Extensii;
  • Creați o mașină virtuală nouă: Linux, Ubuntu (64 de biți), 1024 RAM. Nu creați un HDD.
  • Navigați la setările mașinii virtuale, în Stocare alegeți Controler: IDE, Gol, apăsați pictograma CD → Alegeți fișierul discului optic virtual;
  • Selectați descărcat bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Salvați și închideți fereastra de setări, porniți mașina virtuală;
  • Faceți clic dreapta pe pictograma cablului USB din dreapta jos, selectați adaptorul Bluetooth;

Rulează pe un computer

Imaginea acceptă boot-ul BIOS / CSM și UEFI.

  • Înregistrați imaginea pe o unitate flash USB folosind Etcher: https://etcher.io/. Această operațiune va șterge toate fișierele existente pe o unitate USB.
  • Opriți computerul;
  • Introduceți unitatea flash USB, porniți PC-ul și apăsați butonul de comandă de pornire (de obicei Esc sau F12);
  • Selectați unitatea flash USB.

Efectuarea testului

  • (opțional, dar recomandat) Faceți dublu clic pe scriptul „Btsnoop Dump” de pe desktop. Va începe capturarea datelor Bluetooth pentru o analiză ulterioară. Nu închideți fereastra terminalului.
  • Comutați căștile în modul de asociere;
  • Faceți clic pe săgeata din colțul din dreapta sus, selectați pictograma Bluetooth → Setări Bluetooth;
  • Alegeți-vă căștile, așteptați până la finalizarea asocierii și închideți fereastra;
  • Setați volumul Ubuntu la aproximativ 2/3. De asemenea, reduceți volumul folosind butoanele căștilor, deoarece ar putea fi foarte puternic după asociere.
  • Deschideți folderul „muzică”, redați „testrecord1.flac”;
  • (opțional, dar recomandat) Închideți playerul, închideți fereastra terminalului. Aceasta va opri captura de date.
  • (opțional, dar recomandat) Deschideți browserul Firefox, încărcați stocarea datelor (btsnoop_hci.btsnoop pe desktop) pe https://btcodecs.valdikss.org.ru/

Puteți asculta alte muzică în folderul de muzică sau le puteți încărca;

În căști nu ar trebui să existe scârțâituri, întreruperi audio sau alte distorsiuni ale sunetului. Dacă auziți un sunet bun de înaltă calitate, asta înseamnă că căștile dvs. acceptă sunet cu o rată de biți de 485 kbps.

Cum se testează pe dispozitivul Android

Pentru a testa de pe un smartphone sau tabletă Android, trebuie să utilizați stiva Bluetooth modificată, care necesită privilegii de root.

Cum se captează stocarea de date Bluetooth pe Android

  1. Dezactivați Bluetooth;
  2. În Setările dezvoltatorului, activați comutatorul „Activare jurnal snoop Bluetooth HCI”;
  3. Porniți Bluetooth, conectați-vă la căști folosind meniul Bluetooth (acest lucru este important! Nu permiteți conexiunea automată!);
  4. Redați un eșantion audio scurt;
  5. Deschideți setările dezvoltatorului, dezactivați comutatorul „Activați Bluetooth HCI snoop log”;
  6. Ar trebui să fie creat /storage/emulated/0/btsnoop_hci.log sau /data/misc/bluetooth/logs/btsnoop_hci.log. Dacă lipsește, deschideți /etc/bluetooth/bt_stack.conf cu un editor de text și vedeți calea în opțiunea BtSnoopFileName.

În căști nu ar trebui să existe scârțâituri, întreruperi audio sau alte distorsiuni ale sunetului. Dacă auziți un sunet bun de înaltă calitate cu biblioteca patch-uri, asta înseamnă că căștile dvs. acceptă sunet cu o rată de biți de 512 kbps.

Vă rugăm să urmați cu atenție algoritmul de mai sus. Mai ales, dacă opriți căștile sau vă deconectați după asociere, este important să vă conectați manual la căști din setările Bluetooth, nu permiteți conexiunea automată!

Dispozitive care acceptă cel puțin 512 kbit / s SBC

  • 1MORE 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. Răspundeți pentru a nu suporta Dual Channel, dar funcționează dacă este forțat, 462 kbit / s. Nu este conform cu specificațiile A2DP.)
  • Bluedio T5 (Răspundeți pentru a nu suporta Dual Channel, dar funcționează dacă este forțat. Nu este conform cu specificațiile A2DP.)
  • Bluedio T6 (Răspundeți la faptul că nu acceptă Dual Channel, dar funcționează dacă este forțat. Nu este conform cu specificațiile A2DP. Adoptați cipul Max 97220.)
  • Bluetooth Marshall Major II
  • Overdrive RealForce D1
  • Edificator W830BT
  • DEXP BT-250
  • Adaptor Logitech BT
  • Unitate auto noname (cip CSR8645)
  • Unitate principală Sony DSX-A400BT

Dispozitive care acceptă SBC mai mare de 512 kbit / s

  • JBL Everest 310 (617-660 kbit / s)
  • Sony WI-C400 (576 kbit / s)
  • Sony MDR-ZX770BT (617-660 kbit / s)
  • Bluetooth Marshall Major II (617-660 kbit / s)
  • Overdrive RealForce D1 (730 kbit / s, dual channel, 4 sub-benzi)

Dispozitive care nu funcționează cu rate de biți mai mari sau Dual Channel

  1. Harper HB-202 (crăpături; chip Beken BK3256)
  2. Sony Ericsson MW600 (distorsiune de înaltă frecvență, crăpături; dispozitiv din 2009)

De ce este important acest lucru: SBC 328k și 485k vs aptX

Contrar credinței populare a calității sunetului aptX, în unele cazuri poate produce o calitate audio mai slabă decât SBC cu un bitrate standard de 328k.

SBC alocă dinamic biți de cuantificare pentru benzile de frecvență, acționând pe o bază „de jos în sus”. Dacă întregul bitrate a fost utilizat pentru frecvențele inferioare și medii, frecvențele superioare sunt „tăiate” (reduse la tăcere).

aptX cuantifică benzile de frecvență cu același număr de biți în mod constant, ceea ce îl face un codec de bitrate constant: 352 kbps pentru 44,1 kHz, 384 kbps pentru 48 kHz. Nu poate „transfera biți” la frecvențe care sunt în mare parte necesare în ele. Spre deosebire de SBC, aptX nu va „tăia” frecvențele, ci le va adăuga zgomot de cuantificare, reducând gama dinamică a sunetului și, uneori, introducând crackle. SBC, dimpotrivă, „mănâncă detaliile” - aruncă cele mai liniștite zone.

În medie, în comparație cu SBC 328k, aptX produce mai puține distorsiuni în muzică cu o gamă largă de frecvențe, dar în muzica cu o gamă de frecvență îngustă și cu o gamă dinamică largă câștigă uneori SBC 328k.

Să luăm în considerare un caz special, o înregistrare la pian. Iată o spectrogramă:


Cea mai mare energie constă în frecvențele de 0-4 kHz și durează până la 10 kHz.
Spectrograma fișierului fișier aptX arată astfel:

Iată SBC 328k:

Se poate observa că SBC 328k a tăiat periodic intervalul de peste 16 kHz și a folosit toate bitrate-urile disponibile pentru intervale sub această valoare. Cu toate acestea, aptX a introdus mai multe distorsiuni în spectrul de frecvență audibil de urechea umană, care poate fi văzut pe spectrograma originală scăzută din spectrograma aptX (cu cât este mai strălucitoare, cu atât mai multă distorsiune):


În timp ce SBC 328k a introdus mai puține distorsiuni, semnalul în intervalul 0-10 kHz, iar restul a fost tăiat:

Bitrate 485k pentru SBC a fost suficient pentru a salva întreaga gamă de frecvențe, fără a tăia benzile.

SBC 485k pe acest eșantion audio este mult mai bun decât aptX în intervalul 0-15 kHz și cu o diferență mai mică, dar încă vizibilă - la 15-22 kHz (cu cât este mai întunecată, cu atât mai puțină distorsiune):

Trecând la un SBC cu bitrate ridicat, veți obține un sunet superior aptX de cele mai multe ori, pe orice căști.

  • original_and_aptx.zip
  • sbc.zip

Cum se modifică stivele Bluetooth pe Android 5 - 7

Aceste modificări trebuie aplicate stocurilor stive bluetooth Android Bluedroid (Android 5) și Fluoride (Android 6-7). Stiva modificată de Qualcomm nu este acceptată.

Înlocuiți stereo comun cu canal dual în configurație standard SBC

android / platformă / extern / bluetooth / bluedroid / btif / co / bta_av_co.c: 99

Cod:

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

Înlocuiți A2D_SBC_IE_CH_MD_JOINT cu A2D_SBC_IE_CH_MD_DUAL.

Creșteți prioritatea Dual Channel

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

Cod:

if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; altfel dacă (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; altfel dacă (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; altfel dacă (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Mutați-vă dacă cu A2D_SBC_IE_CH_MD_DUAL în partea de sus.
  1. Dezactivați sau măriți restricția de bitrate

Stiva Bluetooth pentru Android are nu numai o limită de bit-bit, ci și o limită de bitrate, de 328 kbit / s. Dacă căștile acceptă, de exemplu, bitpool 53 pentru 48 kHz, Android va reduce bitpool-ul în jos pentru a se încadra în limita de 328 kbit / s. Acest lucru se va întâmpla DUPĂ negocierea codecului, în etapa de codificare, nu se ia în considerare valoarea bitpool-ului din pachetul Bluetooth SetCapabilities.

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

Cod:

#define DEFAULT_SBC_BITRATE 328

Înlocuiți cu 512.

  1. (numai pentru experimente) Dezactivați limita MTU.

Acest lucru este necesar pentru rate de biți mai mari de ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Cod:

/ * Dimensiune utilă 2DH5 de 679 octeți - (4 octeți L2CAP Header + 12 octeți AVDTP Header) * / #define MAX_2MBPS_AVDTP_MTU 663

Cum se modifică stivele Bluetooth pe Android 8-9

Aceste modificări nu au fost testate, dar ar trebui să funcționeze.

Adăugați suport Dual Channel în Sursa A2DP SBC

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

Cod:

/ * Capabilități codec SBC SRC * / static const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_BLOCKS_8;

adăugați A2DP_SBC_IE_CH_MD_DUAL în ch_mode.

Înlocuiți Joint Stereo cu Dual Channel în configurarea implicită

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

Cod:

/ * Implicit SBC Codec configurare * / 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 * /}

Înlocuiți A2DP_SBC_IE_CH_MD_JOINT cu A2DP_SBC_IE_CH_MD_DUAL.

Creșteți prioritatea Dual Channel

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

Cod:

select_best_channel_mode bool static (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_result-> ch_mode = A2DP_SBC_IE_CH_MD_JOINT; p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; întoarcere adevărată; } 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; întoarcere adevărată; } 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; întoarcere adevărată; } 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; întoarcere adevărată; } returnează fals; }

Mutați-vă dacă cu A2DP_SBC_IE_CH_MD_DUAL în partea de sus.

Măriți limita ratei de biți

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

Cod:

#define A2DP_SBC_DEFAULT_BITRATE 328

Înlocuiți cu 512.

  1. (numai pentru experimente) Dezactivați limita MTU

Acest lucru este necesar pentru rate de biți mai mari de ~ 580 kbit / s.

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

Cod:

#define MAX_2MBPS_AVDTP_MTU 663

Stive Bluetooth patch-uri (Flashable)

  • 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
  • fermoar
  • Le Max 2 Oreo Patched.zip
Citește 10 minute