Slik endrer du Bluetooth Stacks på Android for fantastisk forbedret Bluetooth-lydkvalitet

Advarsel: Dette er en svært avansert guide som innebærer å endre Bluetooth-stablene dine på Android - les denne guiden i sin helhet og følg alle instruksjonene nøyaktig som gitt.

Til tross for at Bluetooth-hodesett og Bluetooth-lyd har blitt ganske populært, er det litt av et problem for lydfiler fordi Bluetooth har vist seg å redusere lydkvaliteten, da biter av lydinformasjon og frekvenser går seg vill i luften ved Bluetooth-streaming.

Dette er grunnen til at noen produsenter legger ut aptX- og LDAC-kodeker for å forbedre lydkvaliteten over standard SBC Bluetooth-kodek som støttes av alle hodetelefoner og de fleste Bluetooth-enheter - imidlertid er enheter med aptX og LDAC-kodeker mye dyrere fordi disse kodekene krever lisensavgift, som forbrukeren betaler på lang sikt.

Den lave lydkvaliteten på SBC Bluetooth-kodeken er forårsaket av kunstige begrensninger av alle gjeldende Bluetooth-stabler og hodetelefonkonfigurasjon, og denne begrensningen kan omgås på eksisterende enheter.

Hvis du er interessert i Bluetooth-lyd, viser vi deg på slutten av denne guiden hvordan du tar en Bluetooth-lydlogg-dump og inspiser den for å se hva slags lydkvalitet og -frekvens du får fra Android-enheten sin Bluetooth-mottaker.

Flertallet av denne guiden vil fokusere på noen få enkle justeringer og måter å lese Bluetooth-lydutgangen for å forbedre utskriftskvaliteten til standard SBC Bluetooth-kodeker - vennligst les hele denne guiden nøye, fordi den er ganske lærerik og det er mange forskjellige ting å blinke eller justere, avhengig av enhetsmodell.

På slutten av denne guiden er en liste over forhåndslappede Bluetooth-stabler for mange populære Android-enheter - disse kan bli blinket i gjenoppretting som du ville gjort for andre flashable .zip - hvis ingen av enhetene tilhører deg, vil du ha å følge guiden for å endre Bluetooth-stabler på Android.

Kort teknisk informasjon om SBC-kodek

SBC har mange forskjellige parametere som blir forhandlet i løpet av tilkoblingsoppsettingsfasen:

  • Lydkanal type og nummer: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antall frekvensbånd: 4 eller 8;
  • Antall lydblokker i en pakke: 4, 8, 12, 16;
  • Kvantisering av bitallokeringsalgoritme: Høytthet, SNR;
  • Maksimum og minimum bitbasseng brukt i kvantiseringsprosess: vanligvis 2-53.

Dekoderen er pålagt å støtte enhver kombinasjon av disse parametrene. Koderen kan bare implementere en del av dem.

Eksisterende Bluetooth-stabler forhandler vanligvis om følgende profil: Joint Stereo, 8 band, 16 blocks, Loudness, bitpool 2..53. Denne profilen koder for 44, 1 kHz lyd med en bitrate på 328 kbps.

Bitpool-parameter påvirker direkte bitrate i samme profil: jo høyere den er, desto høyere bitrate, og derav kvalitet.

Bitpool-parameteren er imidlertid ikke bundet til en spesifikk profil. Bithastigheten påvirkes også betydelig av andre parametere: lydkanaltype, antall frekvensbånd, antall lydblokker. Du kan øke bitraten indirekte ved å forhandle om ikke-standardprofiler, uten å endre bitpoolen.

For eksempel koder Dual Channel kanaler separat, og bruker hele bitpoolen for hver kanal. Å tvinge enheten til å bruke Dual Channel i stedet for Joint Stereo vil få oss nesten doblet bitrate med samme maksimale bitpool, 617 kbps.

For meg føles det at bitpool bør være en intern variabel. Det er en A2DP-spesifikasjonsdesignfeil at bitpoolverdien ikke er bundet til andre kodekparametere og bare definert som en global verdi.

Disse faste Bitpool- og Bitrate-verdiene stammer fra anbefalte verdier for lyd av høy kvalitet. Men anbefalingen er ikke en unnskyldning for å begrense profilen til disse verdiene.

A2DP-spesifikasjonen v1.2, som var aktiv fra 2007 til 2015, krever at alle dekodere skal fungere korrekt med bitrates opp til 512 kbps:

Dekoderen til SNK skal støtte alle mulige bitpoolverdier som ikke resulterer i overskridelse av maksimal bithastighet. Denne profilen begrenser den tilgjengelige maksimale bithastigheten til 320 kb / s for mono, og 512 kb / s for to-kanals modus.

I den nye versjonen av spesifikasjonen er det ingen begrensning av bitrate. Det antas at moderne hodetelefoner utgitt etter 2015 kan støtte bitrates opp til 1000 kbps .

Av en eller annen grunn har alle testede Bluetooth-stabler (Linux (PulseAudio), Android, Blackberry og macOS) kunstige begrensninger av maksimal bitpool-parameter, noe som direkte påvirker maksimal bitrate. Men dette er ikke det største problemet, nesten alle hodetelefoner begrenser også den maksimale bitpoolverdien til 53.

De fleste enheter fungerer fint på en modifisert Bluetooth-stabel med en bithastighet på 507 kbps, uten avbrudd og knitring. Men en slik bitrate vil aldri bli forhandlet under normale forhold, med aksjer av Bluetooth-stabler.

*** Nødvendig for testing med hjelp av guider nedenfor: bluetooth-dual-channel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Hvordan teste på en PC

SBC-kompatibilitetstest for SBC-hodetelefoner er den enkleste å utføre på PC-en med en Bluetooth-adapter. Jeg har forberedt Ubuntu-bilde med en modifisert Bluetooth-stabel, som kan kjøres som i en virtuell maskin (ved å koble Bluetooth-adapter som en USB-enhet i den virtuelle maskinen, den fungerer også med adapterne som er innebygd i bærbare datamaskiner) eller ved å starte USB-flash-stasjonen. Dette bildet bruker følgende profil: Dual Channel, 8 band, 16 blocks, Loudness, bitpool 2..41, 44.1 kHz, som gir 485 kbps bitrate.

Kjører i en VM

  • Last ned utvidelsespakke Virtualbox og Virtualbox: //www.virtualbox.org/wiki/Downloads;
  • Installer Virtualbox, start den;
  • Installer utvidelsespakke ved å bruke File → Preferences → Extensions;
  • Lag ny virtuell maskin: Linux, Ubuntu (64-bit), 1024 RAM. Ikke lag en harddisk.
  • Gå til innstillinger for virtuell maskin, i Lagring velger du Kontroller: IDE, Tom, trykk på CD-ikonet → Velg virtuell optisk diskfil;
  • Velg nedlastet bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Lagre og lukk innstillingsvinduet, start virtuell maskin;
  • Høyreklikk USB-kabelikonet nede til høyre, velg Bluetooth-adapteren;

Kjører på en PC

Bildet støtter BIOS / CSM og UEFI-oppstart.

  • Brenn bildet til en USB-flash-enhet ved hjelp av Etcher: //etcher.io/. Denne operasjonen vil slette alle eksisterende filer på en USB-stasjon.
  • Slå av PCen;
  • Sett inn USB-flash-stasjon, slå på PC-en og trykk på startordre-knappen (vanligvis Esc eller F12);
  • Velg USB-flash-stasjon.

Utføre testen

  • (valgfritt, men anbefalt) Dobbeltklikk på “Btsnoop Dump” -skriptet på skrivebordet. Det vil starte Bluetooth-datafangst for senere analyse. Ikke lukk terminalvinduet.
  • Sett hodetelefonene i sammenkoblingsmodus;
  • Klikk på pilen i øverste høyre hjørne, velg Bluetooth-ikon → Bluetooth-innstillinger;
  • Velg hodetelefoner, vent til sammenkoblingen er fullført, og lukk vinduet.
  • Sett Ubuntu-volumet til omtrent 2/3. Senk også volumet med hodetelefonknappene, da det kan være veldig høyt etter sammenkoblingen.
  • Åpne "musikk" -mappen, spill "testrecord1.flac";
  • (valgfritt, men anbefalt) Lukk spilleren, lukk terminalvinduet. Dette vil stoppe datafangst.
  • (valgfritt, men anbefalt) Åpne Firefox-nettleser, last opp data dump (btsnoop_hci.btsnoop på skrivebordet) til //btcodecs.valdikss.org.ru/

Du kan lytte til annen musikk i musikkmappen, eller laste opp din egen;

Det skal ikke være knitring, lydavbrudd eller annen lydforvrengning i hodetelefonene. Hvis du hører en god lyd av høy kvalitet, betyr det at hodetelefonene dine støtter lyd med en bithastighet på 485 kbps.

Slik tester du på Android-enhet

For å teste fra Android-smarttelefon eller nettbrett må du bruke modifisert Bluetooth-stabel, som krever root-rettighet.

Hvordan fange Bluetooth data dump på Android

  1. Slå av Bluetooth;
  2. I utviklerinnstillinger aktiverer du "Aktiver Bluetooth HCI snoop log" -bryteren;
  3. Slå på Bluetooth, koble til headsettet ditt ved hjelp av Bluetooth-menyen (dette er viktig! Ikke tillat automatisk tilkobling!);
  4. Spill av kort lydeksempel;
  5. Åpne utviklerinnstillinger, deaktiver bryteren “Aktiver Bluetooth HCI snoop log”;
  6. Det skal opprettes /storage/emulert/0/btsnoop_hci.log eller /data/misc/bluetooth/logs/btsnoop_hci.log. Hvis det mangler, åpner du /etc/bluetooth/bt_stack.conf med en tekstredigerer og ser banen i alternativet BtSnoopFileName.

Det skal ikke være knitring, lydavbrudd eller annen lydforvrengning i hodetelefonene. Hvis du hører en god lydkvalitet av høy kvalitet med det oppdaterte biblioteket, betyr det at hodetelefonene dine støtter lyd med en bithastighet på 512 kbps.

Følg nøye algoritmen ovenfor. Spesielt, hvis du slår av hodetelefonene eller kobler fra etter parring, er det viktig å koble til hodetelefonene manuelt fra Bluetooth-innstillingene, ikke tillat automatisk tilkobling!

Enheter som støtter minst 512 kbit / s SBC

  • 1 MER 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 maks. 39. Svar på å ikke støtte Dual Channel, men arbeid hvis tvunget, 462 kbit / s. Oppfyller ikke A2DP-spesifikasjonen.)
  • Bluedio T5 (Svar på å ikke støtte Dual Channel, men fungerer hvis den blir tvunget. Ikke i samsvar med A2DP-spesifikasjonen.)
  • Bluedio T6 (Svar på å ikke støtte Dual Channel, men fungerer hvis den blir tvunget. Ikke i samsvar med A2DP-spesifikasjonen. Vedta Max 97220-brikke.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname bilhodeenhet (CSR8645-brikke)
  • Sony DSX-A400BT bilhodeenhet

Enheter som støtter SBC høyere enn 512 kbit / s

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

Enheter som ikke fungerer med høyere bitrates eller Dual Channel

  1. Harper HB-202 (crackling; Beken BK3256-brikke)
  2. Sony Ericsson MW600 (høyfrekvent forvrengning, knitring; enhet fra 2009)

Hvorfor dette er viktig: SBC 328k og 485k vs aptX

I motsetning til den vanlige troen på aptX lydkvalitet, kan det i noen tilfeller gi dårligere lydkvalitet enn SBC med en standardhastighet på 328k.

SBC tildeler dynamisk kvantiseringsbiter for frekvensbånd, og virker på en "bunn-til-topp" -base. Hvis hele bitraten ble brukt for den nedre og midtre frekvensen, blir de øvre frekvensene "avskåret" (taus).

aptX kvantifiserer frekvensbånd med samme antall biter konstant, noe som gjør det til en konstant bitrate-kodek: 352 kbps for 44, 1 kHz, 384 kbps for 48 kHz. Det kan ikke "overføre biter" til frekvenser som det meste trengs i dem. I motsetning til SBC vil aptX ikke “kutte” frekvenser, men legge til kvantiseringsstøy til dem, redusere det dynamiske lydområdet og noen ganger introdusere sprekker. SBC, tvert imot, "spiser detaljene" - kaster bort de roligste områdene.

I gjennomsnitt sammenlignet med SBC 328k, gjør aptX mindre forvrengning i musikk med et bredt frekvensområde, men på musikk med et smalt frekvensområde og et bredt dynamisk område vinner SBC 328k noen ganger.

La oss vurdere et spesielt tilfelle, et pianoopptak. Her er et spektrogram:

Den mest energien ligger i 0-4 kHz frekvensene, og varer opptil 10 kHz.

Spektrogrammet til filen aptX ser slik ut:

Her er SBC 328k:

Det kan sees at SBC 328k periodisk fullstendig avskåret rekkevidden over 16 kHz, og brukte alle tilgjengelige bitrates for områder under denne verdien. Imidlertid introduserte aptX flere forvrengninger i frekvensspekteret som høres av det menneskelige øret, som kan sees på det subtraherte originale spektrogrammet fra aptX-spektrogrammet (jo lysere, desto mer forvrengning):

Mens SBC 328k har introdusert mindre forvrengning av signalet i området fra 0 til 10 kHz, og resten er blitt:

Bitrate 485k for SBC var nok til å spare hele frekvensområdet, uten å kutte av båndene.

SBC 485k på denne lydprøven er mye bedre enn aptX i området 0-15 kHz, og med en mindre, men fortsatt merkbar forskjell - ved 15-22 kHz (jo mørkere, desto mindre forvrengning):

Når du bytter til en høy bitrate SBC, vil du få en lyd som er overlegen aptX mesteparten av tiden, på alle hodetelefoner.

  • original_and_aptx.zip
  • sbc.zip

Slik endrer du Bluetooth Stacks på Android 5 - 7

Disse modifikasjonene bør brukes på lager Android bluetooth stabler Bluedroid (Android 5) og Fluoride (Android 6-7). Qualcomm-modifisert stabel støttes ikke.

Erstatt Joint Stereo med Dual Channel i standard SBC-konfigurasjon

android / plattform / ytre / bluetooth / bluedroid / btif / co / bta_av_co.c: 99

Kode:

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

Bytt ut A2D_SBC_IE_CH_MD_JOINT med A2D_SBC_IE_CH_MD_DUAL.

Øk Dual Channel-prioriteten

android / plattform / ytre / bluetooth / bluedroid / btif / co / bta_av_co.c: 4

Kode:

 if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; ellers hvis (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; ellers hvis (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; ellers hvis (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Flytt hvis med A2D_SBC_IE_CH_MD_DUAL til toppen. 
  1. Deaktiver eller øke bitrate-begrensningen

Android bluetooth-stack har ikke bare bitpool-grense, men også bitrate-grense, 328 kbit / s. Hvis hodetelefonene for eksempel støtter bitpool 53 for 48 kHz, vil Android redusere bitpoolen ned for å passe inn i grensen på 328 kbit / s. Dette vil skje ETTER kodekforhandling, på kodetrinnet, ikke ta hensyn til bitpoolverdi i Bluetooth SetCapabilities-pakken.

android / plattform / ytre / bluetooth / bluedroid / btif / src / btif_media_task.c: 172

Kode:

 #definer DEFAULT_SBC_BITRATE 328 

Bytt ut med 512.

  1. (bare for eksperimenter) Deaktiver MTU-grense.

Dette er nødvendig for bitrates høyere enn ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Kode:

 / * 2DH5 nyttelaststørrelse på 679 byte - (4 byte L2CAP Header + 12 bytes AVDTP Header) * / #define MAX_2MBPS_AVDTP_MTU 663 

Slik endrer du Bluetooth Stacks på Android 8 - 9

Disse endringene er ikke testet, men skal fungere.

Legg til Dual Channel-støtte i A2DP SBC Source

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

Kode:

 / * SBC SRC kodekfunksjoner * / statisk const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

legg til A2DP_SBC_IE_CH_MD_DUAL i ch_mode.

Erstatt Joint Stereo med Dual Channel i standardkonfigurasjonen

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

Kode:

 / * Standard SBC kodek konfigurasjon * / 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 * /}; 

Bytt ut A2DP_SBC_IE_CH_MD_JOINT med A2DP_SBC_IE_CH_MD_DUAL.

Øk Dual Channel-prioriteten

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

Kode:

 statisk 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_DP = DP_Mode = p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; return true; } 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; return true; } 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; return true; } 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; return true; } returner falsk; } 

Flytt hvis med A2DP_SBC_IE_CH_MD_DUAL til toppen.

Øk bithastighetsgrensen

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

Kode:

 #definere A2DP_SBC_DEFAULT_BITRATE 328 

Bytt ut med 512.

  1. (bare for eksperimenter) Deaktiver MTU-grense

Dette er nødvendig for bitrates høyere enn ~ 580 kbit / s.

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

Kode:

 #definere MAX_2MBPS_AVDTP_MTU 663 

Patched Bluetooth Stacks (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-NATTLIG-jfltexx) .zip
  • glidelås
  • Le Max 2 Oreo Patched.zip

Interessante Artikler