Sådan ændres Bluetooth-stakke på Android for en fantastisk forbedret Bluetooth-lydkvalitet

Advarsel: Dette er en meget avanceret guide, der involverer at ændre dine Bluetooth-stacks på Android - læse 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ært, er det lidt af et problem for lydfiler, fordi Bluetooth har vist sig at reducere lydkvaliteten, da bit af lydinformation og frekvenser går tabt i luften ved Bluetooth-streaming.

Dette er grunden til, at nogle producenter lægger aptX- og LDAC-codecs for at forbedre lydkvaliteten i forhold til 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 licensgebyrer, som forbrugeren betaler på lang sigt.

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

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

Størstedelen af ​​denne vejledning vil fokusere på et par enkle justeringer og måder til at læse din Bluetooth-lydudgang for i høj grad at forbedre outputkvaliteten af ​​standard SBC Bluetooth-codecs - Læs denne hele vejledning omhyggeligt, da det er ret uddannelsesmæssigt, og der er mange forskellige ting at blinke eller justere, afhængigt af din enhedsmodel.

I slutningen af ​​denne vejledning er en liste over forudrettede Bluetooth-stakke til en masse populære Android-enheder - disse kan blinkes i gendannelse, som du ville gøre noget andet flashbart .zip - hvis ingen af ​​enhederne hører til dig, har du for at følge vejledningen til ændring af Bluetooth-stacks på Android.

Kort teknisk information om SBC-codec

SBC har masser af forskellige parametre, der forhandles i forbindelse med opsætningsfasen:

  • Audiokanaltype og -nummer: Joint stereo, stereo, dobbelt kanal, mono;
  • Antal frekvensbånd: 4 eller 8;
  • Antal lydblokke i en pakke: 4, 8, 12, 16;
  • Kvantificeringsbitallokeringsalgoritme: Højhed, SNR;
  • Maksimal og minimum bitpulje brugt i kvantiseringsprocessen: normalt 2-53.

Dekoderen kræves for at understøtte enhver kombination af disse parametre. Koderen kan kun implementere en del af dem.

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

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

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

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

For mig føles det, at bitpool bør være en intern variabel. Det er en A2DP-specifikationsdesignfejl, at bitpool-væ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 til 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-dekoderen skal understøtte alle mulige bitpool-værdier, der ikke resulterer i overskridelsen af ​​den maksimale bithastighed. Denne profil begrænser den tilgængelige maksimale bithastighed til 320 kb / s for mono og 512 kb / s for to-kanals tilstande.

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

Af en eller anden grund har alle de nuværende testede Bluetooth-stacks (Linux (PulseAudio), Android, Blackberry og macOS) kunstige begrænsninger af maksimal bitpool-parameter, som direkte påvirker den maksimale bitrate. Men dette er ikke det største problem, næsten alle hovedtelefoner begrænser også den maksimale bitpool-værdi til 53.

De fleste enheder fungerer fint på en modificeret Bluetooth-stak med en bitrate på 507 kbps uden afbrydelser og knitring. Men en sådan bitrate vil aldrig blive forhandlet under normale forhold med lager 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 testes du på en pc

Høj bitrate SBC-hovedtelefonkompatibilitetstest er den nemmeste at udføre på pc'en med en Bluetooth-adapter. Jeg har forberedt Ubuntu-billede med en ændret Bluetooth-stabel, der kan køres som i en virtuel maskine (ved at tilslutte Bluetooth-adapter som en USB-enhed inde i den virtuelle maskine, det fungerer også med adaptere, der er indbygget i laptops) eller ved at starte fra USB-flashdrevet. Dette billede bruger følgende profil: Dual Channel, 8 bånd, 16 blokke, Højhed, bitpool 2..41, 44.1 kHz, som giver 485 kbps bitrate.

Kører i en VM

  • Download Virtualbox og Virtualbox Extension Pack: //www.virtualbox.org/wiki/Downloads;
  • Installer Virtualbox, start det;
  • Installer udvidelsespakke vha. Fil → Præferencer → udvidelser;
  • Opret ny virtuel maskine: Linux, Ubuntu (64-bit), 1024 RAM. Opret ikke en HDD.
  • Naviger til indstillinger for virtuel maskine, vælg Controller i Opbevaring: 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 BIOS / CSM og UEFI-opstart.

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

Udførelse af testen

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

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

Der må ikke være nogen knitring, 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 testes på Android-enhed

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

Sådan fanges Bluetooth-datadump på Android

  1. Sluk for Bluetooth;
  2. I udviklerindstillinger skal du aktivere kontakten "Aktiver 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 "Aktiver Bluetooth HCI snoop log";
  6. Der skal /storage/emuleret/0/btsnoop_hci.log eller /data/misc/bluetooth/logs/btsnoop_hci.log oprettes. Hvis det mangler, skal du åbne /etc/bluetooth/bt_stack.conf med en teksteditor og se stien i indstillingen BtSnoopFileName.

Der må ikke være nogen knitring, lydafbrydelse eller anden lydforvrængning i hovedtelefonerne. Hvis du hører en god lyd i høj kvalitet med det lappede 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 kobler fra efter parring, er det vigtigt at oprette forbindelse til hovedtelefonerne manuelt fra Bluetooth-indstillingerne, må du ikke tillade 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 at understøtte Dual Channel, men arbejde hvis det bliver tvunget, 462 kbit / s. Overholder ikke A2DP-specifikationen.)
  • Bluedio T5 (Svar på ikke at understøtte Dual Channel, men arbejde, hvis den bliver tvunget. Er ikke i overensstemmelse med A2DP-specifikationen.)
  • Bluedio T6 (Svar på ikke at understøtte Dual Channel, men arbejde, hvis den bliver tvunget. Er ikke i overensstemmelse med A2DP-specifikationen. Vedtage Max 97220-chip.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname automobile head unit (CSR8645 chip)
  • Sony DSX-A400BT bilhovedenhed

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, dobbelt kanal, 4 underbånd)

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

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

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

I modsætning til hvad man tror på aptX-lydkvalitet, kan det i nogle tilfælde give dårligere lydkvalitet end SBC med en standardhastighed på 328k.

SBC tildeler dynamisk kvantiseringsbits til frekvensbånd, der fungerer på en "bund-til-top" -base. Hvis hele bitrate blev brugt til de nedre og midterste frekvenser, “afbrydes” de øverste frekvenser (lydløs).

aptX kvantificerer frekvensbånd med det samme antal bit 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 "skære" frekvenser, men tilføje kvantiseringsstøj til dem, hvilket reducerer det dynamiske lydområde og undertiden introducerer knæk. SBC, tværtimod, ”spiser detaljerne” - kaster de roligste områder.

I gennemsnit sammenlignet med SBC 328k gør aptX mindre forvrængning i musik med et bredt frekvensområde, men på musik med et smalt frekvensområde og et bredt dynamisk interval 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 ser sådan ud:

Her er SBC 328k:

Det kan ses, at SBC 328k periodisk fuldstændigt afskaffede området over 16 kHz og anvendte alle tilgængelige bitrates til intervaller under denne værdi. Imidlertid introducerede aptX flere forvrængninger i frekvensspektret, der kan høres af det menneskelige øre, hvilket kan ses på det subtraherede originale spektrogram fra aptX-spektrogrammet (jo lysere, desto 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:

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

SBC 485k på denne lydprøve 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, desto mindre forvrængning):

Skiftes til en SBC med høj bitrate, får du en lyd, der er overlegen til aptX det meste af tiden, på alle hovedtelefoner.

  • original_and_aptx.zip
  • sbc.zip

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

Disse ændringer skal anvendes til lagerførelse af Android bluetooth-stabler Bluedroid (Android 5) og Fluoride (Android 6-7). Qualcomm-modificeret stak understøttes ikke.

Udskift fælles stereo med dobbelt kanal 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-prioritering

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

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

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 påkrævet for bitrates højere end ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Kode:

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

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

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

Tilføj dobbeltkanalsupport i A2DP SBC Source

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

Kode:

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

tilføj A2DP_SBC_IE_CH_MD_DUAL i ch_mode.

Udskift fælles stereo med dobbelt kanal i standardkonfiguration

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

Kode:

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

Erstat A2DP_SBC_IE_CH_MD_JOINT med A2DP_SBC_IE_CH_MD_DUAL.

Forøg Dual Channel-prioritering

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

Kode:

 statisk bole 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 = CH_result_DP = p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; vende tilbage sandt; } 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; vende tilbage sandt; } 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; vende tilbage sandt; } 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; vende tilbage sandt; } returner falsk; } 

Flyt hvis med A2DP_SBC_IE_CH_MD_DUAL til toppen.

Forøg bitrate-grænsen

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

Kode:

 #definér A2DP_SBC_DEFAULT_BITRATE 328 

Udskift med 512.

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

Dette er påkrævet for bitrates højere end ~ 580 kbit / s.

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

Kode:

 #definer MAX_2MBPS_AVDTP_MTU 663 

Patched Bluetooth Stacks (Blitzbart)

  • 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
  • zip
  • Le Max 2 Oreo Patched.zip

Interessante Artikler