Så här ändrar du Bluetooth-stackar på Android för mycket förbättrad Bluetooth-ljudkvalitet



Prova Vårt Instrument För Att Eliminera Problem

Varning: Detta är en mycket avancerad guide som innebär att du ändrar dina Bluetooth-stackar på Android - läs den här guiden i sin helhet och följ alla instruktioner exakt enligt vad som ges.



Trots att Bluetooth-headset och Bluetooth-ljud har blivit ganska populära är det lite av ett problem för audiofiler eftersom Bluetooth har visat sig minska ljudkvaliteten, eftersom bitar av ljudinformation och frekvenser går vilse i luften genom Bluetooth-streaming.



Det är därför som vissa tillverkare lägger ut aptX- och LDAC-codecs för att förbättra ljudkvaliteten över standard SBC Bluetooth-codec som stöds av alla hörlurar och de flesta Bluetooth-enheter - enheter med aptX- och LDAC-codecs är dock mycket dyrare eftersom dessa codecs kräver licensavgifter, som konsumenten betalar på lång sikt.



Den låga ljudkvaliteten på SBC Bluetooth-codec orsakas av konstgjorda begränsningar av alla nuvarande Bluetooth-stackar och hörlurars konfiguration, och denna begränsning kan kringgås på alla befintliga enheter.

Om du är intresserad av Bluetooth-ljud, visar vi dig i slutet av den här guiden hur du tar en Bluetooth-ljudloggdump och inspekterar den för att se vilken typ av ljudkvalitet och frekvens du får från din Android-Bluetooth-mottagare.

Majoriteten av den här guiden kommer att fokusera på några enkla justeringar och sätt att läsa din Bluetooth-ljudutgång för att avsevärt förbättra utgångskvaliteten för vanliga SBC Bluetooth-codecs - läs hela den här guiden noga eftersom den är ganska lärorik och det finns många olika saker för att blinka eller justera, beroende på din enhetsmodell.



I slutet av den här guiden finns en lista över förplockade Bluetooth-stackar för många populära Android-enheter - dessa kan blinkas vid återhämtning som du skulle göra med någon annan flashbar .zip - om ingen av enheterna tillhör dig kommer du att ha för att följa guiden för att ändra Bluetooth-stackar på Android.

Kort teknisk information om SBC-codec

SBC har många olika parametrar som förhandlas fram under anslutningsinställningsfasen:

  • Ljudkanaltyp och nummer: Joint Stereo, Stereo, Dual Channel, Mono;
  • Antal frekvensband: 4 eller 8;
  • Antal ljudblock i ett paket: 4, 8, 12, 16;
  • Kvantiseringsbitallokeringsalgoritm: Loudness, SNR;
  • Maximal och minsta bitpool som används i kvantiseringsprocessen: vanligtvis 2-53.

Avkodaren krävs för att stödja alla kombinationer av dessa parametrar. Encoder får bara implementera en del av dem.

Befintliga Bluetooth-stackar förhandlar vanligtvis om följande profil: Joint Stereo, 8 band, 16 block, Loudness, bitpool 2..53. Denna profil kodar för 44,1 kHz ljud med en bithastighet på 328 kbps.

Bitpool-parametern påverkar direkt bithastigheten inom samma profil: ju högre den är, desto högre bithastighet och därmed kvaliteten.

Bitpool-parametern är dock inte bunden till en specifik profil. Bithastigheten påverkas också avsevärt av andra parametrar: ljudkanaltyp, antal frekvensband, antal ljudblock. Du kan öka bithastigheten indirekt genom att förhandla om icke-standardprofiler utan att ändra bitpoolen.

Till exempel kodar Dual Channel kanaler separat, med hela bitpoolen för varje kanal. Att tvinga enheten att använda Dual Channel istället för Joint Stereo ger oss nästan fördubblad bithastighet vid samma maximala bitpool, 617 kbps.

För mig känns det som bitpool bör vara en intern variabel. Det är ett A2DP-specifikationsdesignfel att bitpoolvärde inte är bundet till andra codec-parametrar och endast definieras som ett globalt värde.

Dessa fasta Bitpool- och Bitrate-värden kommer från rekommenderade värden för högkvalitativt ljud. Men rekommendationen är inte en ursäkt för att begränsa profilen till dessa värden.

A2DP-specifikation v1.2, som var aktiv från 2007 till 2015, kräver att alla avkodare fungerar korrekt med bithastigheter upp till 512 kbps:

SNK: s avkodare ska stödja alla möjliga bitpoolvärden som inte resulterar i överskott av maximal bithastighet. Denna profil begränsar den tillgängliga maximala bithastigheten till 320 kb / s för mono och 512 kb / s för tvåkanalslägen.

I den nya versionen av specifikationen finns det ingen begränsning av bithastigheten. Det antas att moderna hörlurar som släpptes efter 2015 kan stödja bithastigheter upp till 1000 kbps .

Av någon anledning har alla för närvarande testade Bluetooth-stackar (Linux (PulseAudio), Android, Blackberry och macOS) konstgjorda begränsningar för maximal bitpool-parameter, vilket direkt påverkar maximal bithastighet. Men detta är inte det största problemet, nästan alla hörlurar begränsar också det maximala bitpoolvärdet till 53.

De flesta enheter fungerar bra på en modifierad Bluetooth-stack med en bithastighet på 507 kbps, utan avbrott och sprak. Men en sådan bitrate kommer aldrig att förhandlas fram under normala förhållanden, med Bluetooth-stackar.

*** Krävs för testning med hjälp av guider nedan: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Hur man testar på en PC

SBC-hörlurs kompatibilitetstest med hög bithastighet är det enklaste att utföra på datorn med en Bluetooth-adapter. Jag har förberett Ubuntu-bilden med en modifierad Bluetooth-stack, som kan köras som i en virtuell maskin (genom att ansluta Bluetooth-adapter som en USB-enhet inuti den virtuella maskinen, fungerar den också med adaptrarna inbyggda i bärbara datorer) eller genom att starta från USB-minnet. Denna bild använder följande profil: Dual Channel, 8 band, 16 block, Loudness, bitpool 2..41, 44,1 kHz, vilket ger 485 kbps bitrate.

Kör i en virtuell dator

  • Ladda ner Virtualbox och Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Installera Virtualbox, starta den;
  • Installera Extension Pack med File → Inställningar → Extensions;
  • Skapa ny virtuell maskin: Linux, Ubuntu (64-bitars), 1024 RAM. Skapa inte en hårddisk.
  • Navigera till inställningar för virtuell maskin, i Lagring välj Styrenhet: IDE, Tom, tryck på CD-ikonen → Välj virtuell optisk diskfil;
  • Välj nedladdad bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Spara och stäng inställningsfönstret, starta virtuell maskin;
  • Högerklicka på USB-kabelikonen längst ned till höger, välj din Bluetooth-adapter;

Kör på en PC

Bilden stöder BIOS / CSM och UEFI-uppstart.

  • Bränn bilden till ett USB-minne med Etcher: https://etcher.io/. Denna åtgärd tar bort alla befintliga filer på en USB-enhet.
  • Stäng av datorn;
  • Sätt i USB-minne, slå på datorn och tryck på startordningsknappen (vanligtvis Esc eller F12);
  • Välj ditt USB-minne.

Utför testet

  • (valfritt men rekommenderas) Dubbelklicka på “Btsnoop Dump” -skriptet på skrivbordet. Det kommer att starta Bluetooth-datafångst för senare analys. Stäng inte terminalfönstret.
  • Sätt hörlurarna i parningsläge;
  • Klicka på pilen i det övre högra hörnet, välj Bluetooth-ikon → Bluetooth-inställningar;
  • Välj dina hörlurar, vänta tills parningen är klar och stäng fönstret;
  • Ställ in Ubuntu-volymen till cirka 2/3. Sänk också volymen med headsetknappar eftersom det kan vara väldigt högt efter parning.
  • Öppna 'musik' -mappen, spela 'testrecord1.flac';
  • (valfritt men rekommenderat) Stäng spelaren, stäng terminalfönstret. Detta stoppar datafångst.
  • (valfritt men rekommenderat) Öppna Firefox-webbläsaren, ladda upp datadump (btsnoop_hci.btsnoop på skrivbordet) till https://btcodecs.valdikss.org.ru/

Du kan lyssna på annan musik i musikmappen eller ladda upp din egen;

Det bör inte finnas några knakningar, ljudavbrott eller annan ljudförvrängning i hörlurarna. Om du hör ett bra högkvalitativt ljud betyder det att dina hörlurar stöder ljud med en bithastighet på 485 kbps.

Hur man testar på Android-enhet

För att testa från Android-smarttelefon eller surfplatta måste du använda modifierad Bluetooth-stack, vilket kräver root-privilegium.

Hur man fångar Bluetooth-datadump på Android

  1. Stäng av Bluetooth;
  2. I utvecklarinställningarna aktiverar du omkopplaren 'Aktivera Bluetooth HCI snoop log';
  3. Slå på Bluetooth, anslut till ditt headset via Bluetooth-menyn (detta är viktigt! Tillåt inte automatisk anslutning!);
  4. Spela kort ljudprov;
  5. Öppna utvecklarinställningar, inaktivera omkopplaren 'Aktivera Bluetooth HCI snoop log';
  6. Det bör /storage/emulated/0/btsnoop_hci.log eller /data/misc/bluetooth/logs/btsnoop_hci.log skapas. Om det saknas, öppna /etc/bluetooth/bt_stack.conf med en textredigerare och se sökvägen i alternativet BtSnoopFileName.

Det bör inte finnas några knakningar, ljudavbrott eller annan ljudförvrängning i hörlurarna. Om du hör ett bra högkvalitativt ljud med det lappade biblioteket betyder det att dina hörlurar stöder ljud med en bithastighet på 512 kbps.

Följ algoritmen ovan noga. Speciellt om du stänger av hörlurarna eller kopplar bort efter parning är det viktigt att ansluta till hörlurarna manuellt från Bluetooth-inställningarna, tillåt inte automatisk anslutning!

Enheter som stöder 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 max 39. Svara för att inte stödja Dual Channel, men arbeta om det tvingas, 462 kbit / s. Uppfyller inte A2DP-specifikationen.)
  • Bluedio T5 (Svara på att inte stödja Dual Channel, men arbeta om den tvingas. Uppfyller inte A2DP-specifikationen.)
  • Bluedio T6 (Svara för att inte stödja Dual Channel, men fungera om den tvingas. Uppfyller inte A2DP-specifikationen. Anta Max 97220-chip.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname bilhuvudenhet (CSR8645-chip)
  • Sony DSX-A400BT huvudenhet

Enheter som stöder SBC högre än 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, dubbel kanal, 4 delband)

Enheter som inte fungerar med högre bithastigheter eller Dual Channel

  1. Harper HB-202 (knäckningar; Beken BK3256-chip)
  2. Sony Ericsson MW600 (högfrekvent förvrängning, knäckningar; enhet från 2009)

Varför detta är viktigt: SBC 328k och 485k vs aptX

I motsats till vad många tror om aptX-ljudkvalitet kan det i vissa fall producera sämre ljudkvalitet än SBC med en standardhastighet på 328 k.

SBC tilldelar dynamiskt kvantiseringsbitar för frekvensband som verkar på 'botten-till-topp' -basis. Om hela bithastigheten användes för de lägre och mellersta frekvenserna, är de övre frekvenserna 'avskurna' (tystade).

aptX kvantifierar frekvensband med samma antal bitar konstant, vilket gör det till en konstant bithastighetskod: 352 kbps för 44,1 kHz, 384 kbps för 48 kHz. Det kan inte 'överföra bitar' till frekvenser som mest behövs i dem. Till skillnad från SBC kommer 'aptX' inte att 'klippa' frekvenser utan kommer att lägga till kvantiseringsbrus till dem, vilket minskar det dynamiska ljudområdet och ibland introducerar sprak. SBC, tvärtom, 'äter detaljerna' - kasserar de tystaste områdena.

I genomsnitt jämfört med SBC 328k gör aptX mindre distorsion i musik med ett brett frekvensområde, men på musik med ett smalt frekvensområde och ett brett dynamiskt intervall vinner SBC 328k ibland.

Låt oss överväga ett specialfall, en pianoinspelning. Här är ett spektrogram:


Mest energi ligger i frekvenserna 0-4 kHz och varar upp till 10 kHz.
Spektrogrammet för filen aptX-fil ser ut så här:

Här är SBC 328k:

Det kan ses att SBC 328k regelbundet helt avbröt intervallet över 16 kHz och använde alla tillgängliga bithastigheter för områden under detta värde. Men aptX införde mer snedvridningar i det frekvensspektrum som hörs av det mänskliga örat, vilket kan ses på det subtraherade originalspektrogrammet från aptX-spektrogrammet (desto ljusare desto mer förvrängning):


Medan SBC 328k har infört mindre förvrängning har signalen i området från 0 till 10 kHz, och resten har slutits:

Bitrate 485k för SBC räckte för att spara hela frekvensområdet utan att klippa av banden.

SBC 485k på detta ljudprov är mycket bättre än aptX i intervallet 0-15 kHz, och med en mindre men ändå märkbar skillnad - vid 15-22 kHz (ju mörkare desto mindre distorsion):

Om du byter till en SBC med hög bithastighet får du ett ljud som är överlägset aptX för det mesta på alla hörlurar.

  • original_och_aptx.zip
  • sbc.zip

Så här ändrar du Bluetooth-stackarna på Android 5-7

Dessa modifieringar bör tillämpas på lager Android-Bluetooth-stackar Bluedroid (Android 5) och Fluoride (Android 6-7). Qualcomm-modifierad stack stöds inte.

Ersätt Joint Stereo med Dual Channel i standard SBC-konfiguration

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

Koda:

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

Byt ut A2D_SBC_IE_CH_MD_JOINT med A2D_SBC_IE_CH_MD_DUAL.

Öka Dual Channel-prioriteten

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

Koda:

om (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; annars om (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; annars om (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; annars om (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Flytta om med A2D_SBC_IE_CH_MD_DUAL till toppen.
  1. Inaktivera eller öka bithastighetsbegränsningen

Android Bluetooth-stack har inte bara bitpoolgräns utan också bitrate-gräns, 328 kbit / s. Om hörlurarna stöder till exempel bitpool 53 för 48 kHz kommer Android att minska bitpoolen för att passa in i 328 kbit / s gräns. Detta händer EFTER kodförhandlingar, på kodningssteget, ta inte hänsyn till bitpoolvärde i Bluetooth SetCapabilities-paketet.

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

Koda:

#define DEFAULT_SBC_BITRATE 328

Byt ut med 512.

  1. (endast för experiment) Inaktivera MTU-gräns.

Detta krävs för bithastigheter högre än ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Koda:

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

Så här ändrar du Bluetooth-stackar på Android 8-9

Dessa ändringar har inte testats, men borde fungera.

Lägg till Dual Channel-stöd i A2DP SBC-källa

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

Koda:

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

lägg till A2DP_SBC_IE_CH_MD_DUAL i ch_mode.

Ersätt Joint Stereo med Dual Channel i standardkonfiguration

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

Koda:

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

Ersätt A2DP_SBC_IE_CH_MD_JOINT med A2DP_SBC_IE_CH_MD_DUAL.

Öka Dual Channel-prioriteten

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

Koda:

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_result_DE_CH_MOD_CH_M_JD p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; återvänd sant; } om (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; återvänd sant; } om (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; återvänd sant; } om (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; återvänd sant; } returnera falskt; }

Flytta om med A2DP_SBC_IE_CH_MD_DUAL till toppen.

Öka bithastighetsgränsen

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

Koda:

#define A2DP_SBC_DEFAULT_BITRATE 328

Byt ut med 512.

  1. (endast för experiment) Inaktivera MTU-gräns

Detta krävs för bithastigheter högre än ~ 580 kbit / s.

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

Koda:

#define MAX_2MBPS_AVDTP_MTU 663

Patchade Bluetooth-stackar (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
  • blixtlås
  • Le Max 2 Oreo Patched.zip
10 minuter läst