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

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 este dat.

În ciuda faptului că căștile Bluetooth și sunetul Bluetooth au devenit destul de populare, este o problemă pentru audiofili, deoarece Bluetooth s-a dovedit că reduce calitatea audio, deoarece informațiile și frecvențele audio se pierd în aer prin streamingul Bluetooth.

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

Calitatea audio scăzută a codecului Bluetooth SBC este cauzată de limitările artificiale ale tuturor stivelor Bluetooth actuale și de configurarea căștilor, iar această limitare poate fi evitată pe orice dispozitive existente.

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

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 considerabil calitatea de ieșire a codecurilor Bluetooth SBC standard - vă rugăm să citiți cu atenție acest întreg ghid, deoarece este destul de educativ și există o mulțime de lucruri diferite să clipească sau să regleze, în funcție de modelul dispozitivului.

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

Informații tehnice scurte despre codecul SBC

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

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

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

Stivele Bluetooth existente, de obicei, negociază următorul profil: Joint Stereo, 8 benzi, 16 blocuri, Loudness, bitpool 2..53. Acest profil codează audio de 44, 1 kHz cu un bitrate de 328 kbps.

Parametrul Bitpool afectează direct bitratul din același profil: cu cât este mai mare, cu atât este mai mare bitrate și, prin urmare, calitatea.

Cu toate acestea, parametrul bitpool nu este legat de un profil specific. De asemenea, bitratul este afectat în mod semnificativ de alți parametri: tipul canalului audio, numărul benzilor de frecvență, numărul blocurilor audio. Puteți crește bitrate indirect prin negocierea de profiluri non-standard, fără a schimba bitpool.

De exemplu, Dual Channel codifică canalele separat, utilizând întreg bitpool pentru fiecare canal. Forțarea dispozitivului să folosească Dual Channel în loc de Joint Stereo ne va obține un bitrate aproape dublat la același bitpool maxim, 617 kbps.

Pentru mine consider că bitpool ar trebui să fie o variabilă internă. Este o eroare de proiectare a specificației A2DP, că valoarea bitpool nu este legată de alți parametri codec și definită doar ca valoare globală.

Aceste valori Bitpool și Bitrate fixe provin din valorile recomandate pentru sunetul 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 decodificatoarele să funcționeze corect cu bitrate de până la 512 kbps:

Decodorul SNK acceptă toate valorile bitpool posibile care nu conduc la excesul ratei maxime de biți. Acest profil limitează rata de biți maximă disponibilă la 320kb / s pentru mono și 512kb / s pentru modurile cu două canale.

În noua versiune a specificației nu există nicio limitare de biți. Se presupune că căștile moderne lansate după 2015 pot suporta bitrate de 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 bitpool maxim, care afectează în mod direct bitratul maxim. Dar aceasta nu este cea mai mare problemă, aproape toate căștile limitează și valoarea maximă a bitpool-ului la 53.

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

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

Cum se testează pe un computer

Testul de compatibilitate cu căști SBC de biți mare este cel mai ușor de efectuat pe PC cu un adaptor Bluetooth. Am pregătit imaginea Ubuntu cu o stivă Bluetooth modificată, care poate fi rulată ca într-o mașină virtuală (prin conectarea adaptorului Bluetooth ca dispozitiv USB în interiorul mașinii virtuale, funcționează și cu adaptoarele încorporate în laptopuri) sau prin pornirea de la unitatea flash USB. Această imagine utilizează următorul profil: Dual Channel, 8 benzi, 16 blocuri, Loudness, bitpool 2..41, 44, 1 kHz, care oferă 485 kbps bitrate.

Se rulează într-un VM

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

Rulează pe un computer

Imaginea acceptă bootarea BIOS / CSM și UEFI.

  • Înregistrează imaginea pe o unitate flash USB folosind Etcher: //etcher.io/. Această operație va șterge toate fișierele existente pe o unitate USB.
  • Opriți calculatorul;
  • Introduceți unitatea flash USB, porniți computerul ș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 captarea datelor Bluetooth pentru analize ulterioare. 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 căștile, așteptați până când împerecherea este completă și închideți fereastra;
  • Setați volumul Ubuntu la aproximativ 2/3. De asemenea, reduceți volumul folosind butoanele căștilor, deoarece poate fi foarte tare după împerechere.
  • Deschideți folderul „muzică”, redați „testrecord1.flac”;
  • (opțional, dar recomandat) Închide player, închide fereastra terminalului. Acest lucru va opri captarea datelor.
  • (opțional, dar recomandat) Deschideți browserul Firefox, încărcați dump-ul de date (btsnoop_hci.btsnoop pe desktop) pe //btcodecs.valdikss.org.ru/

Puteți asculta altă muzică în folderul muzical sau puteți încărca propria dvs.;

Căștile nu trebuie să apară crăpături, întreruperi audio sau alte distorsiuni ale sunetului. Dacă auziți un sunet de înaltă calitate, asta înseamnă că căștile dvs. acceptă sunetul audio cu o rată de biți de 485 kbps.

Cum se testează pe dispozitivul Android

Pentru a testa de pe smartphone-ul sau tableta Android, trebuie să utilizați stivă Bluetooth modificată, care necesită privilegii root.

Cum să capturați descărcarea de date Bluetooth pe Android

  1. Dezactivați Bluetooth;
  2. În Setări pentru dezvoltatori, activați comutatorul „Activați jurnalul de sunet Bluetooth HCI”;
  3. Porniți Bluetooth, conectați-vă la setul cu cască folosind meniul Bluetooth (acest lucru este important! Nu permiteți conexiunea automată!);
  4. Redați o probă audio scurtă;
  5. Deschideți setările dezvoltatorului, dezactivați comutatorul „Enable 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 din opțiunea BtSnoopFileName.

Căștile nu trebuie să apară crăpături, întreruperi audio sau alte distorsiuni ale sunetului. Dacă auziți un sunet de înaltă calitate cu biblioteca corecată, asta înseamnă că căștile dvs. acceptă sunetul audio cu un ritm 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 la căști manual din setările Bluetooth, nu permiteți conexiunea automată!

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

  • 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 corespunde specificației A2DP.)
  • Bluedio T5 (Răspunde la faptul că nu acceptă Dual Channel, dar funcționează dacă este forțat. Nu respectă specificațiile A2DP.)
  • Bluedio T6 (Răspunde că nu acceptă Dual Channel, dar funcționează dacă este forțat. Nu corespunde specificațiilor A2DP. Adoptați cip Max 97220.)
  • Bluetooth Marshall Major II
  • Overdrive RealForce D1
  • Edificator W830BT
  • DEXP BT-250
  • Adaptor Logitech BT
  • Unitate de cap non-auto (cip CSR8645)
  • Sony DSX-A400BT unitate auto

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, canal dual, 4 sub-benzi)

Dispozitive care nu funcționează cu biți mai mari sau cu canal dual

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

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

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

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

aptX cuantizează benzile de frecvență cu același număr de biți constant, ceea ce îl face un codec bitrate constant: 352 kbps pentru 44, 1 kHz, 384 kbps pentru 48 kHz. Nu poate „transfera biți” la frecvențele care sunt cel mai mult 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 fisuri. SBC, dimpotrivă, „mănâncă detaliile” - renunță la cele mai liniștite zone.

În medie, în comparație cu SBC 328k, aptX face mai puțină denaturare în muzică cu un interval de frecvență larg, dar pe muzică cu un interval de frecvență restrâns și un interval dinamic larg SBC 328k câștigă uneori.

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

Cea mai mare energie se află în frecvențele 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 întrerupt periodic intervalul de peste 16 kHz și a utilizat toți bitrații disponibili 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 observată pe spectrograma originală scăzută din spectrograma aptX (mai luminos, cu atât mai mult distorsionează):

În timp ce SBC 328k a introdus mai puțin denaturarea semnalului în intervalul de la 0 la 10 kHz, iar restul a fost selectat:

Bitrate 485k pentru SBC a fost suficient pentru a salva întregul interval de frecvență, 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 totuși vizibilă - la 15-22 kHz (mai întunecată, cu atât mai puțin denaturarea):

Trecând la un SBC cu biți mari, veți obține un sunet superior celui 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 ar trebui să fie aplicate stivelor bluetooth Android stoc Bluedroid (Android 5) și Fluoride (Android 6-7). Stiva modificată de Qualcomm nu este acceptată.

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

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.

Măriți prioritatea canalului dual

Android / platformă / extern / Bluetooth / bluedroid / btif / co / bta_av_co.c: 4

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; Deplasați-vă dacă cu A2D_SBC_IE_CH_MD_DUAL în partea de sus. 
  1. Dezactivează sau mărește restricția bitrate

Stiva bluetooth Android are nu numai limita bitpool, ci și limita bitrate, 328 kbit / s. Dacă căștile acceptă, de exemplu, bitpool 53 pentru 48 kHz, Android va scădea bitpool în jos pentru a se încadra în 328 kbit / s. Acest lucru se va întâmpla DUPĂ negocierea codecului, în stadiul de codificare, nu ține cont de valoarea bitpool în pachetul SetCapilities Bluetooth.

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 bitrate mai mari de ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Cod:

 / * Dimensiune utilă 2DH5 de 679 bytes - (4 biți L2CAP Header + 12 bytes 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 suportul canalului dual în sursa SBC A2DP

/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_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

adăugați A2DP_SBC_IE_CH_MD_DUAL în ch_mode.

Înlocuiți stereo comun cu canalul dual în configurația implicită

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

Cod:

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

Măriți prioritatea canalului dual

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

Cod:

 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_JOINT) {p_DD_P_D__P_ = = p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; întoarce-te 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; întoarce-te 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; întoarce-te 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; întoarce-te adevărat; } returnare falsă; } 

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

Măriți limita 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 bitrate mai mari de ~ 580 kbit / s.

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

Cod:

 #define MAX_2MBPS_AVDTP_MTU 663 

Stack-uri cu patch-uri Bluetooth (intermitent)

  • 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)).
  • 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

Articole Interesante