Sådan ændres Bluetooth-stakke på Android til meget forbedret Bluetooth-lydkvalitet



Prøv Vores Instrument Til At Fjerne Problemer

Advarsel: Dette er en meget avanceret guide, der involverer ændring af dine Bluetooth-stakke på Android - læs denne vejledning i sin helhed og følg alle instruktioner nøjagtigt som givet.



På trods af at Bluetooth-headset og Bluetooth-lyd er blevet meget populære, er det lidt af et problem for audiofiler, fordi Bluetooth har vist sig at reducere lydkvaliteten, da bit af lydinformationen og frekvenserne går tabt i luften gennem Bluetooth-streaming.



Dette er grunden til, at nogle producenter lægger aptX- og LDAC-codecs for at forbedre lydkvaliteten over standard SBC Bluetooth-codec, som understøttes af alle hovedtelefoner og de fleste Bluetooth-enheder - enheder med aptX- og LDAC-codecs er dog meget dyrere, fordi disse codecs kræve licensafgifter, som forbrugeren betaler i det lange løb.



Den lave lydkvalitet af SBC Bluetooth-codec er forårsaget af kunstige begrænsninger af alle nuværende Bluetooth-stakke og hovedtelefoners konfiguration, og denne begrænsning kan omgås på eksisterende enheder.

Hvis du er interesseret i Bluetooth-lyd, viser vi dig i slutningen af ​​denne guide, hvordan du tager en Bluetooth-lydlogdump og inspicerer den for at se, hvilken slags lydkvalitet og frekvens du får fra din Android's Bluetooth-modtager.

Størstedelen af ​​denne guide vil fokusere på et par enkle tilpasninger og måder at læse din Bluetooth-lydoutput for i høj grad at forbedre outputkvaliteten af ​​standard SBC Bluetooth-codecs - læs hele denne vejledning grundigt, da den er ret lærerig, og der er mange forskellige ting for at blinke eller tilpasse, afhængigt af din enhedsmodel.



I slutningen af ​​denne vejledning er der en liste over forudrettede Bluetooth-stakke til mange populære Android-enheder - disse kan blinkes ved gendannelse, som du ville have andre flashbare .zip - hvis ingen af ​​enhederne tilhører dig, har du at følge vejledningen til ændring af Bluetooth-stakke på Android.

Kort teknisk information om SBC-codec

SBC har mange forskellige parametre, der forhandles under opsætningsfasen for forbindelsen:

  • Audiokanaltype og -nummer: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antal frekvensbånd: 4 eller 8;
  • Antal lydblokke i en pakke: 4, 8, 12, 16;
  • Kvantiseringsbitallokeringsalgoritme: Loudness, SNR;
  • Maksimal og minimal bitpulje, der bruges i kvantiseringsprocessen: normalt 2-53.

Dekoderen er påkrævet for at understøtte enhver kombination af disse parametre. Encoder kan kun implementere en del af dem.

Eksisterende Bluetooth-stakke forhandler normalt følgende profil: Joint Stereo, 8 bånd, 16 blokke, Loudness, bitpool 2..53. Denne profil koder for 44,1 kHz lyd med en bithastighed på 328 kbps.

Bitpool-parameter påvirker direkte bithastigheden inden for den samme profil: jo højere den er, jo højere er bithastigheden og dermed kvaliteten.

Bitpool-parameteren er dog ikke bundet til en bestemt profil. Bithastigheden påvirkes også væsentligt af andre parametre: lydkanaltype, antal frekvensbånd, antal lydblokke. Du kan øge bithastigheden indirekte ved at forhandle ikke-standardprofiler uden at ændre bitpoolen.

For eksempel koder Dual Channel kanaler separat ved hjælp af hele bitpool for hver kanal. At tvinge enheden til at bruge Dual Channel i stedet for Joint Stereo får os næsten fordoblet bithastighed ved den samme maksimale bitpool, 617 kbps.

For mig føles det, at bitpool skal være en intern variabel. Det er en A2DP-specifikationsdesignfejl, at bitpoolværdien ikke er bundet til andre codec-parametre og kun defineret som en global værdi.

Disse faste Bitpool- og Bitrate-værdier stammer fra anbefalede værdier for lyd i høj kvalitet. Men anbefalingen er ikke en undskyldning for at begrænse profilen til disse værdier.

A2DP-specifikation v1.2, som var aktiv fra 2007 til 2015, kræver, at alle dekodere fungerer korrekt med bitrates op til 512 kbps:

SNK's dekoder skal understøtte alle mulige bitpoolværdier, der ikke resulterer i overskridelse af den maksimale bithastighed. Denne profil begrænser den tilgængelige maksimale bithastighed til 320 kb / s for mono og 512 kb / s for tokanalstilstande.

I den nye version af specifikationen er der ingen begrænsning af bitrate. Det antages, at moderne hovedtelefoner frigivet efter 2015 kan understøtte bitrate op til 1000 kbps .

Af en eller anden grund har alle i øjeblikket testede Bluetooth-stakke (Linux (PulseAudio), Android, Blackberry og macOS) kunstige begrænsninger for maksimal bitpool-parameter, som direkte påvirker den maksimale bithastighed. Men dette er ikke det største problem, næsten alle hovedtelefoner begrænser også den maksimale bitpoolværdi til 53.

De fleste enheder fungerer fint på en modificeret Bluetooth-stak med en bithastighed på 507 kbps uden afbrydelser og knitrende. Men sådan en bitrate vil aldrig blive forhandlet under normale forhold med lagrede Bluetooth-stakke.

*** Nødvendigt til test ved hjælp af vejledninger nedenfor: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Sådan tester du på en pc

SBC-kompatibilitetstest med høj bitrate er den nemmeste at udføre på pc'en med en Bluetooth-adapter. Jeg har forberedt Ubuntu-billede med en modificeret Bluetooth-stak, som kan køres som i en virtuel maskine (ved at tilslutte Bluetooth-adapter som en USB-enhed inde i den virtuelle maskine, fungerer den også med adaptere indbygget i bærbare computere) eller ved at starte fra USB-flashdrevet. Dette billede bruger følgende profil: Dual Channel, 8 bånd, 16 blokke, Loudness, bitpool 2..41, 44,1 kHz, hvilket giver 485 kbps bitrate.

Kører i en VM

  • Download Virtualbox og Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Installer Virtualbox, start det;
  • Installer Extension Pack ved hjælp af File → Preferences → Extensions;
  • Opret ny virtuel maskine: Linux, Ubuntu (64-bit), 1024 RAM. Opret ikke en harddisk.
  • Naviger til indstillinger for virtuel maskine, i Storage skal du vælge Controller: IDE, Tom, tryk på CD-ikon → Vælg virtuel optisk diskfil;
  • Vælg downloadet bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Gem og luk indstillingsvinduet, start virtuel maskine;
  • Højreklik på USB-kabelikonet nederst til højre, vælg din Bluetooth-adapter;

Kører på en pc

Billedet understøtter opstart af BIOS / CSM og UEFI.

  • Brænd billedet til et USB-flashdrev ved hjælp af Etcher: https://etcher.io/. Denne handling sletter alle eksisterende filer på et USB-drev.
  • Sluk for pc'en;
  • Indsæt USB-flashdrev, tænd pc'en, og tryk på startordreknappen (normalt Esc eller F12);
  • Vælg dit USB-flashdrev.

Udfører testen

  • (valgfrit men anbefalet) Dobbeltklik på scriptet 'Btsnoop Dump' på skrivebordet. Det starter Bluetooth-datafangst til senere analyse. Luk ikke terminalvinduet.
  • Skift hovedtelefonerne til parringstilstand;
  • Klik på pilen i øverste højre hjørne, vælg Bluetooth-ikon → Bluetooth-indstillinger;
  • Vælg dine hovedtelefoner, vent, indtil parringen er afsluttet, og luk vinduet;
  • Indstil Ubuntu-lydstyrken til ca. 2/3. Sænk også lydstyrken ved hjælp af headsetknapper, da det kan være meget højt efter parring.
  • Åbn mappen 'musik', afspil 'testrecord1.flac';
  • (valgfri men anbefalet) Luk afspiller, luk terminalvinduet. Dette stopper datafangst.
  • (valgfri men anbefalet) Åbn Firefox-browseren, upload datadump (btsnoop_hci.btsnoop på skrivebordet) til https://btcodecs.valdikss.org.ru/

Du kan lytte til anden musik i musikmappen eller uploade din egen;

Der bør ikke være knitrende, lydafbrydelse eller anden lydforvrængning i hovedtelefonerne. Hvis du hører en god lyd i høj kvalitet, betyder det, at dine hovedtelefoner understøtter lyd med en bithastighed på 485 kbps.

Sådan tester du på Android-enhed

For at teste fra Android-smartphone eller -tablet skal du bruge en modificeret Bluetooth-stak, som kræver root-privilegium.

Sådan registreres Bluetooth-datadump på Android

  1. Sluk for Bluetooth;
  2. I Developer Settings skal du aktivere kontakten 'Enable Bluetooth HCI snoop log';
  3. Tænd for Bluetooth, tilslut til dit headset ved hjælp af Bluetooth-menuen (dette er vigtigt! Tillad ikke automatisk forbindelse!);
  4. Afspil kort lydeksempel;
  5. Åbn udviklerindstillinger, deaktiver kontakten 'Aktivér Bluetooth HCI snoop log';
  6. Der skal være /storage/emulated/0/btsnoop_hci.log eller /data/misc/bluetooth/logs/btsnoop_hci.log oprettet. Hvis det mangler, skal du åbne /etc/bluetooth/bt_stack.conf med en teksteditor og se stien i indstillingen BtSnoopFileName.

Der bør ikke være knitrende, lydafbrydelse eller anden lydforvrængning i hovedtelefonerne. Hvis du hører en god lyd i høj kvalitet med det patchede bibliotek, betyder det, at dine hovedtelefoner understøtter lyd med en bithastighed på 512 kbps.

Følg nøje algoritmen ovenfor. Især hvis du slukker for hovedtelefonerne eller afbryder forbindelsen efter parring, er det vigtigt at oprette forbindelse til hovedtelefonerne manuelt fra Bluetooth-indstillingerne, og tillad ikke automatisk forbindelse!

Enheder, der understøtter mindst 512 kbit / s SBC

  • 1MERE 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. Svar på ikke understøtter Dual Channel, men arbejd hvis tvunget, 462 kbit / s. Overholder ikke A2DP-specifikationen.)
  • Bluedio T5 (Svar på ikke understøtter Dual Channel, men arbejde, hvis den er tvunget. Overholder ikke A2DP-specifikationen.)
  • Bluedio T6 (Svar på ikke understøtter Dual Channel, men arbejder, hvis den er tvunget. Overholder ikke A2DP-specifikationen. Vedtag Max 97220-chip.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname bil hovedenhed (CSR8645 chip)
  • Sony DSX-A400BT hovedenhed til biler

Enheder, der understøtter SBC højere end 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, dobbeltkanal, 4 underbånd)

Enheder, der ikke fungerer med højere bitrates eller Dual Channel

  1. Harper HB-202 (knitrende; Beken BK3256 chip)
  2. Sony Ericsson MW600 (højfrekvent forvrængning, knitrende; enhed fra 2009)

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

I modsætning til almindelig opfattelse af aptX-lydkvalitet kan det i nogle tilfælde producere dårligere lydkvalitet end SBC med en standard 328k bithastighed.

SBC tildeler dynamisk kvantiseringsbits til frekvensbånd, der fungerer på 'bund-til-top' -basis. Hvis hele bithastigheden blev brugt til de nedre og midterste frekvenser, 'afskæres' de øvre frekvenser (tavs).

aptX kvantiserer frekvensbånd med det samme antal bits konstant, hvilket gør det til en konstant bitrate-codec: 352 kbps for 44,1 kHz, 384 kbps for 48 kHz. Det kan ikke 'overføre bits' til frekvenser, der mest er nødvendige i dem. I modsætning til SBC vil aptX ikke 'klippe' frekvenser, men tilføje kvantiseringsstøj til dem, hvilket reducerer det dynamiske område for lyd og undertiden introducerer knitrer. SBC tværtimod 'spiser detaljerne' - kasserer de mest støjsvage områder.

I gennemsnit sammenlignet med SBC 328k giver aptX mindre forvrængning i musik med et bredt frekvensområde, men på musik med et snævert frekvensområde og et bredt dynamisk område vinder SBC 328k undertiden.

Lad os overveje et specielt tilfælde, en klaveroptagelse. Her er et spektrogram:


Den mest energi ligger i 0-4 kHz frekvenserne og varer op til 10 kHz.
Spektrogrammet for filen aptX-fil ser sådan ud:

Her er SBC 328k:

Det kan ses, at SBC 328k periodisk afskærede området over 16 kHz og brugte alle tilgængelige bitrates til områder under denne værdi. Imidlertid introducerede aptX flere forvrængninger i frekvensspektret, der kunne høres af det menneskelige øre, hvilket kan ses på det subtraherede originale spektrogram fra aptX-spektrogrammet (jo lysere, jo mere forvrængning):


Mens SBC 328k har introduceret mindre forvrængning, er signalet i området fra 0 til 10 kHz, og resten er blevet udskrevet:

Bitrate 485k til SBC var nok til at gemme hele frekvensområdet uden at afskære båndene.

SBC 485k på denne lydeksempel er meget bedre end aptX i området 0-15 kHz og med en mindre, men stadig mærkbar forskel - ved 15-22 kHz (jo mørkere, mindre forvrængning):

Ved at skifte til en SBC med høj bitrate får du en lyd bedre end aptX det meste af tiden på alle hovedtelefoner.

  • original_and_aptx.zip
  • sbc.zip

Sådan ændres Bluetooth-stakkene på Android 5-7

Disse ændringer skal anvendes på lager Android bluetooth stakke Bluedroid (Android 5) og Fluoride (Android 6-7). Qualcomm-modificeret stak understøttes ikke.

Udskift Joint Stereo med Dual Channel i standard SBC-konfiguration

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

Udskift A2D_SBC_IE_CH_MD_JOINT med A2D_SBC_IE_CH_MD_DUAL.

Forøg Dual Channel-prioritet

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

Kode:

hvis (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; Flyt hvis med A2D_SBC_IE_CH_MD_DUAL til toppen.
  1. Deaktiver eller øg begrænsningen af ​​bitrate

Android Bluetooth-stack har ikke kun bitpool-grænse, men også bitrate-grænse, 328 kbit / s. Hvis hovedtelefonerne f.eks. Understøtter bitpool 53 til 48 kHz, reducerer Android bitpoolen ned for at passe ind i en grænse på 328 kbit / s. Dette vil ske EFTER codec-forhandling, på kodningsstadiet skal du ikke tage bitpoolværdien i Bluetooth SetCapabilities-pakken i betragtning.

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

Kode:

#definer DEFAULT_SBC_BITRATE 328

Udskift med 512.

  1. (kun til eksperimenter) Deaktiver MTU-grænse.

Dette er nødvendigt for bitrate højere end ~ 580 kbit / s.

174. btif / src / btif_media_task.c: 174

Kode:

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

Sådan ændres Bluetooth-stakke på Android 8-9

Disse ændringer er ikke blevet testet, men skal fungere.

Tilføj Dual Channel support til A2DP SBC Source

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

Kode:

/ * SBC SRC codec-funktioner * / statisk konst tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_BLOCKS_8;

tilføj A2DP_SBC_IE_CH_MD_DUAL i ch_mode.

Udskift Joint Stereo med Dual Channel i standardkonfiguration

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

Kode:

/ * Standard SBC codec konfiguration * / konst 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 * /};

Udskift A2DP_SBC_IE_CH_MD_JOINT med A2DP_SBC_IE_CH_MD_DUAL.

Forøg Dual Channel-prioritet

/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) {p_ode_IE = p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; returner sandt } hvis (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; returner sandt } hvis (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; returner sandt } hvis (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; returner sandt } returner falsk; }

Flyt hvis med A2DP_SBC_IE_CH_MD_DUAL til toppen.

Forøg bithastighedsgrænsen

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

Kode:

#definer A2DP_SBC_DEFAULT_BITRATE 328

Udskift med 512.

  1. (kun til eksperimenter) Deaktiver MTU-grænse

Dette er nødvendigt for bitrate højere end ~ 580 kbit / s.

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

Kode:

#definer MAX_2MBPS_AVDTP_MTU 663

Patchede Bluetooth-stakke (flashbar)

  • Le Max 2 Oreo Patch.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 Patch.zip
  • Huawei P9 (Android 7) .zip
  • Samsung Galaxy S4 LTE GT-I9505 (Android 7.1.2; LineageOS 14.1-20180615-NIGHTLY-jfltexx) .zip
  • lynlås
  • Le Max 2 Oreo Patch.zip
10 minutter læst