Hur man ändrar Bluetooth-stackar på Android för mycket förbättrad Bluetooth-ljudkvalitet

Varning: Det här ä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 som anges.

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

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

Den låga ljudkvaliteten på SBC Bluetooth-codec orsakas av konstgjorda begränsningar av alla aktuella Bluetooth-staplar och hörlurarnas konfiguration, och denna begränsning kan kringgås på 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 förbättra utskriftskvaliteten för standard SBC Bluetooth-kodekar - läs hela denna guide noggrant 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 med förpappade Bluetooth-stackar för många populära Android-enheter - dessa kan blixtade i å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 minimal bitpool som används i kvantiseringsprocessen: vanligtvis 2-53.

Avkodaren krävs för att stödja alla kombinationer av dessa parametrar. Kodaren kan implementera endast en del av dem.

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

Bitpool-parametern påverkar direkt bitraten inom samma profil: ju högre den är, desto högre bitrate 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 bitraten indirekt genom att förhandla om icke-standardprofiler utan att ändra bitpoolen.

Exempelvis 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 får oss nästan fördubblat bitrate på samma maximala bitpool, 617 kbps.

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

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

A2DP-specifikationen v1.2, som var aktiv från 2007 till 2015, kräver att alla avkodare ska fungera korrekt med bitrater upp till 512 kbps:

Avkodaren för SNK ska stödja alla möjliga bitpoolvärden som inte resulterar i överskottet av den maximala bithastigheten. Denna profil begränsar den tillgängliga maximala bithastigheten till 320 kb / s för mono och 512 kb / s för två-kanals lägen.

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

Av någon anledning har alla för närvarande testade Bluetooth-staplar (Linux (PulseAudio), Android, Blackberry och macOS) konstgjorda begränsningar för maximal bitpool-parameter, vilket direkt påverkar den maximala bithastigheten. 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 sprickbildning. Men en sådan bitrate kommer aldrig att förhandlas under normala förhållanden, med lager Bluetooth-stackar.

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

Hur man testar på en dator

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

Kör i en VM

  • Ladda ner Virtualbox och Virtualbox Extension Pack: //www.virtualbox.org/wiki/Downloads;
  • Installera Virtualbox, starta den;
  • Installera Extensions 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 virtuella maskiner, i Lagring väljer du Controller: IDE, Tom, tryck på CD-ikonen → Välj virtual virtual disk file;
  • Välj nedladdad Bluetooth-dual-channel-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 ner till höger, välj din Bluetooth-adapter;

Kör på en PC

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

  • Bränn bilden till en USB-flashenhet med Etcher: //etcher.io/. Den här åtgärden tar bort alla befintliga filer på en USB-enhet.
  • Stäng av datorn.
  • Sätt i USB-flashenhet, slå på datorn och tryck på startordningsknappen (vanligtvis Esc eller F12);
  • Välj din USB-flashenhet.

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.
  • Växla hörlurarna till 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 Ubuntu-volym på cirka 2/3. Minska också volymen med hjälp av headsetknappar eftersom det kan vara mycket högt efter parning.
  • Öppna mappen "musik", spela "testrecord1.flac";
  • (valfritt men rekommenderas) Stäng spelare, stäng terminalfönstret. Detta kommer att stoppa datafångst.
  • (valfritt men rekommenderas) Öppna Firefox-webbläsaren, ladda upp data dump (btsnoop_hci.btsnoop på skrivbordet) till //btcodecs.valdikss.org.ru/

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

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

Hur man testar på Android-enheten

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

Hur man fångar Bluetooth-datadump på Android

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

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

Följ noggrant algoritmen ovan. 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 på att inte stödja Dual Channel, men fungera om det är tvingat, 462 kbit / s. Anpassar inte A2DP-specifikationen.)
  • Bluedio T5 (Svara på att inte stödja Dual Channel, men fungera om det är tvingat. Inte överensstämmer med A2DP-specifikationen.)
  • Bluedio T6 (Svara på att inte stödja Dual Channel, men fungera om det är tvingat. Inte överensstämmer med A2DP-specifikationen. Anta 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 bilhuvudenhet

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, dual channel, 4 subbands)

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

  1. Harper HB-202 (crackling; Beken BK3256 chip)
  2. Sony Ericsson MW600 (högfrekvent snedvridning, sprickbildning; enhet från 2009)

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

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

SBC fördelar dynamiskt kvantiseringsbitar för frekvensband, och verkar på en "botten-till-topp" -basis. Om hela bitraten användes för de nedre och mittenfrekvenserna, är de övre frekvenserna "avstängda" (tyst).

aptX kvantiserar frekvensband med samma antal bitar konstant, vilket gör det till en konstant bitrate-kodek: 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 lägga till kvantiseringsbuller till dem, vilket minskar det dynamiska ljudområdet och ibland introducerar sprickor. SBC, tvärtom, "äter detaljerna" - kastar bort de tystaste områdena.

Jämfört med SBC 328k gör aptX i snitt mindre snedvridning 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 speciellt fall, en pianoinspelning. Här är ett spektrogram:

Den mest energin ligger i 0-4 kHz-frekvenserna och varar upp till 10 kHz.

Spektrogrammet för filen aptX ser så här ut:

Här är SBC 328k:

Det kan ses att SBC 328k periodvis helt avbröt området över 16 kHz och använde alla tillgängliga bitrater för områden under detta värde. Emellertid introducerade aptX fler distorsioner i frekvensspektrumet som hörs av det mänskliga örat, vilket kan ses på det subtraherade ursprungliga spektrogrammet från aptX-spektrogrammet (desto ljusare, desto mer distorsion):

Medan SBC 328k har introducerat mindre distorsion har signalen i området från 0 till 10 kHz, och resten har varit:

Bitrate 485k för SBC var tillräckligt för att spara hela frekvensområdet utan att skära av bandet.

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 (desto mörkare, desto mindre distorsion):

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

  • original_and_aptx.zip
  • sbc.zip

Hur man ändrar Bluetooth-stackarna på Android 5 - 7

Dessa ändringar bör tillämpas på lager med 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 prioriteringen för Dual Channel

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

Koda:

 if (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 begränsningen av bitrate

Android bluetooth-stack har inte bara bitpoolgräns, utan också bitrate-begränsning, 328 kbit / s. Om hörlurarna till exempel stöder bitpool 53 för 48 kHz, kommer Android att minska bitpoolen ner för att passa in på 328 kbit / s-gränsen. Detta kommer att ske EFTER codec-förhandlingar, på kodningsstadiet, tar inte hänsyn till bitpoolvärdet i paketet Bluetooth SetCapabilities.

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

Koda:

 #definer DEFAULT_SBC_BITRATE 328 

Byt ut med 512.

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

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

btif / src / btif_media_task.c: 174

Koda:

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

Hur man ändrar 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

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

Koda:

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

lägg till A2DP_SBC_IE_CH_MD_DUAL i ch_mode.

Ersätt Joint Stereo med Dual Channel i standardkonfiguration

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

Byt ut A2DP_SBC_IE_CH_MD_JOINT med A2DP_SBC_IE_CH_MD_DUAL.

Öka prioriteringen för Dual Channel

/platform/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_DP = DP_CH = M p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; tillbaka sant; } 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; tillbaka sant; } 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; tillbaka sant; } 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; tillbaka sant; } returnera falskt; } 

Flytta om med A2DP_SBC_IE_CH_MD_DUAL till toppen.

Öka bithastighetsgränsen

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

Koda:

 #definiera A2DP_SBC_DEFAULT_BITRATE 328 

Byt ut med 512.

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

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

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

Koda:

 #definiera MAX_2MBPS_AVDTP_MTU 663 

Lappade 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 Obs (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

Intressanta Artiklar