Hoe u Bluetooth-stapels op Android kunt wijzigen voor een sterk verbeterde Bluetooth-audiokwaliteit



Probeer Ons Instrument Voor Het Oplossen Van Problemen

Waarschuwing: dit is een zeer geavanceerde handleiding waarbij u uw Bluetooth-stacks op Android moet aanpassen - lees deze handleiding in zijn geheel en volg alle instructies precies zoals ze worden gegeven.



Ondanks het feit dat Bluetooth-headsets en Bluetooth-audio behoorlijk populair zijn geworden, is het een beetje een probleem voor audiofielen, omdat bewezen is dat Bluetooth de audiokwaliteit vermindert, omdat stukjes van de audio-informatie en frequenties verloren gaan in de lucht via Bluetooth-streaming.



Dit is de reden waarom sommige fabrikanten aptX- en LDAC-codecs uitbrengen om de geluidskwaliteit te verbeteren ten opzichte van de standaard SBC Bluetooth-codec die wordt ondersteund door alle hoofdtelefoons en de meeste Bluetooth-apparaten - apparaten met aptX- en LDAC-codecs zijn echter veel duurder omdat deze codecs licentiekosten vereisen, die de consument op de lange termijn betaalt.



De lage audiokwaliteit van de SBC Bluetooth-codec wordt veroorzaakt door kunstmatige beperkingen van alle huidige Bluetooth-stacks en hoofdtelefoonconfiguraties, en deze beperking kan op alle bestaande apparaten worden omzeild.

Als u geïnteresseerd bent in Bluetooth-audio, laten we u aan het einde van deze handleiding zien hoe u een Bluetooth-audiologboekdump maakt en deze inspecteert om te zien wat voor soort audiokwaliteit en frequentie u krijgt van de Bluetooth-ontvanger van uw Android.

Het grootste deel van deze gids zal zich richten op een paar eenvoudige aanpassingen en manieren om je Bluetooth-audio-output te lezen om de outputkwaliteit van standaard SBC Bluetooth-codecs aanzienlijk te verbeteren - lees deze hele gids aandachtig, want het is behoorlijk leerzaam en er zijn veel verschillende dingen om te flitsen of te tweaken, afhankelijk van uw apparaatmodel.



Aan dit einde van deze handleiding vindt u een lijst met vooraf gepatchte Bluetooth-stacks voor veel populaire Android-apparaten - deze kunnen tijdens het herstel worden geflitst zoals elke andere flashbare .zip - als geen van de apparaten van u is, heeft u om de handleiding voor het aanpassen van Bluetooth-stapels op Android te volgen.

Korte technische informatie over SBC-codec

SBC heeft veel verschillende parameters waarover wordt onderhandeld tijdens de verbindingsinstellingsfase:

  • Audiokanaaltype en nummer: Joint Stereo, Stereo, Dual Channel, Mono;
  • Aantal frequentiebanden: 4 of 8;
  • Aantal audioblokken in één pakket: 4, 8, 12, 16;
  • Algoritme voor kwantisering van bits: luidheid, SNR;
  • Maximale en minimale bitpool gebruikt in het kwantiseringsproces: meestal 2-53.

De decoder is vereist om elke combinatie van deze parameters te ondersteunen. Encoder kan slechts een deel ervan implementeren.

Bestaande Bluetooth-stacks onderhandelen meestal over het volgende profiel: Joint Stereo, 8 banden, 16 blokken, Loudness, bitpool 2..53. Dit profiel codeert voor 44,1 kHz audio met een bitsnelheid van 328 kbps.

De bitpoolparameter heeft rechtstreeks invloed op de bitsnelheid binnen hetzelfde profiel: hoe hoger deze is, hoe hoger de bitsnelheid en dus ook op de kwaliteit.

De bitpool-parameter is echter niet gebonden aan een specifiek profiel. De bitsnelheid wordt ook aanzienlijk beïnvloed door andere parameters: type audiokanaal, aantal frequentiebanden, aantal audioblokken. U kunt de bitrate indirect verhogen door te onderhandelen over niet-standaard profielen, zonder de bitpool te wijzigen.

Dual Channel codeert kanalen bijvoorbeeld afzonderlijk, waarbij de volledige bitpool voor elk kanaal wordt gebruikt. Als je het apparaat dwingt om Dual Channel te gebruiken in plaats van Joint Stereo, krijgen we een bijna verdubbelde bitrate bij dezelfde maximale bitpool, 617 kbps.

Voor mij voelt het dat bitpool een interne variabele moet zijn. Het is een A2DP-specificatieontwerpfout dat de bitpoolwaarde niet gebonden is aan andere codecparameters en alleen gedefinieerd is als een globale waarde.

Deze vaste bitpool- en bitrate-waarden zijn afkomstig van aanbevolen waarden voor audio van hoge kwaliteit. Maar de aanbeveling is geen excuus om het profiel tot deze waarden te beperken.

A2DP-specificatie v1.2, die actief was van 2007 tot 2015, vereist dat alle decoders correct werken met bitrates tot 512 kbps:

De decoder van de SNK ondersteunt alle mogelijke bitpoolwaarden die niet resulteren in een overschrijding van de maximale bitsnelheid. Dit profiel beperkt de beschikbare maximale bitsnelheid tot 320 kb / s voor mono en 512 kb / s voor tweekanaalsmodi.

In de nieuwe versie van de specificatie is er geen beperking van de bitsnelheid. Aangenomen wordt dat moderne hoofdtelefoons die na 2015 zijn uitgebracht, bitrates kunnen ondersteunen tot 1000 kbps .

Om de een of andere reden hebben alle momenteel geteste Bluetooth-stacks (Linux (PulseAudio), Android, Blackberry en macOS) kunstmatige beperkingen van de maximale bitpoolparameter, die rechtstreeks van invloed zijn op de maximale bitsnelheid. Maar dit is niet het grootste probleem, bijna alle koptelefoons beperken ook de maximale bitpoolwaarde tot 53.

De meeste apparaten werken prima op een gemodificeerde Bluetooth-stack met een bitrate van 507 kbps, zonder onderbrekingen en gekraak. Maar over een dergelijke bitrate zal onder normale omstandigheden nooit worden onderhandeld, met standaard Bluetooth-stapels.

*** Vereist voor testen met onderstaande gidsen: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Hoe te testen op een pc

De compatibiliteitstest voor SBC-hoofdtelefoons met hoge bitsnelheid is het gemakkelijkst uit te voeren op de pc met een Bluetooth-adapter. Ik heb een Ubuntu-image voorbereid met een aangepaste Bluetooth-stack, die kan worden uitgevoerd als in een virtuele machine (door de Bluetooth-adapter als een USB-apparaat in de virtuele machine aan te sluiten, het werkt ook met de adapters die in de laptops zijn ingebouwd) of door op te starten vanaf het USB-flashstation. Deze afbeelding gebruikt het volgende profiel: Dual Channel, 8 banden, 16 blokken, Loudness, bitpool 2..41, 44,1 kHz, wat een bitsnelheid van 485 kbps oplevert.

Draait in een VM

  • Download Virtualbox en Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Installeer Virtualbox, start het;
  • Installeer Extension Pack met Bestand → Voorkeuren → Extensies;
  • Maak een nieuwe virtuele machine: Linux, Ubuntu (64-bit), 1024 RAM. Maak geen harde schijf.
  • Navigeer naar de instellingen van de virtuele machine, kies in Opslag Controller: IDE, Leeg, druk op het cd-pictogram → Kies een virtueel optische-schijfbestand;
  • Selecteer gedownloade bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso;
  • Instellingenvenster opslaan en sluiten, virtuele machine starten;
  • Klik met de rechtermuisknop op het USB-kabelpictogram rechtsonder, selecteer uw Bluetooth-adapter;

Draait op een pc

De afbeelding ondersteunt BIOS / CSM- en UEFI-opstarten.

  • Brand de afbeelding naar een USB-stick met Etcher: https://etcher.io/. Met deze bewerking worden alle bestaande bestanden op een USB-station verwijderd.
  • Schakel de pc uit;
  • Plaats een USB-stick, zet de pc aan en druk op de opstartvolgordeknop (meestal Esc of F12);
  • Selecteer uw USB-stick.

De test uitvoeren

  • (optioneel maar aanbevolen) Dubbelklik op het 'Btsnoop Dump' -script op het bureaublad. Het start de Bluetooth-gegevensverzameling voor latere analyse. Sluit het terminalvenster niet.
  • Schakel de hoofdtelefoon naar de koppelingsmodus;
  • Klik op de pijl in de rechterbovenhoek, selecteer Bluetooth-pictogram → Bluetooth-instellingen;
  • Kies je hoofdtelefoon, wacht tot het koppelen is voltooid en sluit het venster;
  • Stel het Ubuntu-volume in op ongeveer 2/3. Verlaag ook het volume met behulp van de headsetknoppen, aangezien dit erg luid kan zijn na het koppelen.
  • Open de map 'muziek', speel 'testrecord1.flac';
  • (optioneel maar aanbevolen) Sluit speler, sluit terminalvenster. Dit zal het vastleggen van gegevens stoppen.
  • (optioneel maar aanbevolen) Open Firefox-browser, upload gegevensdump (btsnoop_hci.btsnoop op het bureaublad) naar https://btcodecs.valdikss.org.ru/

U kunt naar andere muziek in de muziekmap luisteren of uw eigen muziek uploaden;

Er mag geen gekraak, audio-onderbreking of andere geluidsvervorming in de hoofdtelefoon zijn. Als je een goed geluid van hoge kwaliteit hoort, betekent dat dat je hoofdtelefoon audio ondersteunt met een bitsnelheid van 485 kbps.

Hoe te testen op een Android-apparaat

Om vanaf een Android-smartphone of -tablet te testen, moet u een aangepaste Bluetooth-stack gebruiken, waarvoor root-rechten vereist zijn.

Hoe Bluetooth-gegevensdump op Android vast te leggen

  1. Schakel Bluetooth uit;
  2. Schakel in Developer Settings de schakelaar 'Enable Bluetooth HCI snoop log' in;
  3. Schakel Bluetooth in, maak verbinding met uw headset via het Bluetooth-menu (dit is belangrijk! Sta automatische verbinding niet toe!);
  4. Speel een kort audiovoorbeeld;
  5. Open de ontwikkelaarinstellingen, schakel de schakelaar 'Enable Bluetooth HCI snoop log' uit;
  6. Er moet /storage/emulated/0/btsnoop_hci.log of /data/misc/bluetooth/logs/btsnoop_hci.log zijn gemaakt. Als het ontbreekt, open dan /etc/bluetooth/bt_stack.conf met een teksteditor en bekijk het pad in de optie BtSnoopFileName.

Er mag geen gekraak, audio-onderbreking of andere geluidsvervorming in de hoofdtelefoon zijn. Als je een goed geluid van hoge kwaliteit hoort met de gepatchte bibliotheek, betekent dit dat je hoofdtelefoon audio ondersteunt met een bitsnelheid van 512 kbps.

Volg zorgvuldig het bovenstaande algoritme. Vooral als u de hoofdtelefoon uitschakelt of de verbinding verbreekt na het koppelen, is het belangrijk om handmatig verbinding te maken met de hoofdtelefoon via de Bluetooth-instellingen. Sta automatische verbinding niet toe!

Apparaten die minimaal 512 kbit / s SBC ondersteunen

  • 1 MEER 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. Reageer om Dual Channel niet te ondersteunen, maar werk indien geforceerd, 462 kbit / s. Voldoet niet aan A2DP-specificatie.)
  • Bluedio T5 (Reageer om Dual Channel niet te ondersteunen, maar werk indien geforceerd. Voldoet niet aan de A2DP-specificatie.)
  • Bluedio T6 (Reageer om Dual Channel niet te ondersteunen, maar werk indien geforceerd. Voldoet niet aan A2DP-specificatie. Gebruik Max 97220-chip.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname automotive head-unit (CSR8645-chip)
  • Sony DSX-A400BT auto-hoofdeenheid

Apparaten die SBC hoger dan 512 kbit / s ondersteunen

  • 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, tweekanaals, 4 subbanden)

Apparaten die niet werken met hogere bitrates of Dual Channel

  1. Harper HB-202 (geknetter; Beken BK3256 chip)
  2. Sony Ericsson MW600 (hoogfrequente vervorming, geknetter; toestel uit 2009)

Waarom dit belangrijk is: SBC 328k en 485k versus aptX

In tegenstelling tot wat vaak wordt gedacht van de aptX-geluidskwaliteit, kan het in sommige gevallen een slechtere audiokwaliteit produceren dan SBC met een standaard 328k-bitsnelheid.

SBC wijst dynamisch kwantiseringsbits toe voor frequentiebanden, waarbij wordt gewerkt op een 'bottom-to-top' -basis. Als de hele bitsnelheid werd gebruikt voor de lage en middenfrequenties, worden de bovenste frequenties “afgesneden” (gedempt).

aptX kwantificeert frequentiebanden met hetzelfde aantal bits constant, waardoor het een constante bitrate-codec wordt: 352 kbps voor 44,1 kHz, 384 kbps voor 48 kHz. Het kan geen bits 'overbrengen' naar frequenties die er meestal in nodig zijn. In tegenstelling tot SBC zal aptX frequenties niet 'afsnijden', maar er kwantiseringsruis aan toevoegen, waardoor het dynamische bereik van audio wordt verminderd en soms gekraak wordt geïntroduceerd. SBC daarentegen 'eet de details' - gooit de stilste gebieden weg.

Gemiddeld maakt aptX in vergelijking met SBC 328k minder vervorming in muziek met een breed frequentiebereik, maar op muziek met een smal frequentiebereik en een breed dynamisch bereik wint SBC 328k soms.

Laten we eens kijken naar een speciaal geval, een piano-opname. Hier is een spectrogram:


De meeste energie zit in de 0-4 kHz frequenties, en duurt tot 10 kHz.
Het spectrogram van het bestand aptX-bestand ziet er als volgt uit:

Hier is SBC 328k:

Het is te zien dat de SBC 328k periodiek het bereik boven 16 kHz volledig afsneed en alle beschikbare bitrates voor bereiken onder deze waarde gebruikte. AptX introduceerde echter meer vervormingen in het frequentiespectrum die hoorbaar zijn voor het menselijk oor, wat kan worden gezien op het afgetrokken originele spectrogram van het aptX-spectrogram (hoe helderder, hoe meer vervorming):


Hoewel de SBC 328k minder vervorming heeft geïntroduceerd, is het signaal in het bereik van 0 tot 10 kHz, en de rest is:

Bitrate 485k voor SBC was voldoende om het volledige frequentiebereik op te slaan, zonder de banden af ​​te snijden.

SBC 485k op dit audiomonster is veel beter dan aptX in het bereik van 0-15 kHz, en met een kleiner maar nog steeds merkbaar verschil - bij 15-22 kHz (hoe donkerder, hoe minder vervorming):

Als u overschakelt naar een SBC met een hoge bitsnelheid, krijgt u meestal een geluid dat superieur is aan aptX op elke hoofdtelefoon.

  • original_and_aptx.zip
  • sbc.zip

Hoe de Bluetooth-stapels op Android 5-7 te wijzigen

Deze wijzigingen moeten worden toegepast op de voorraad Android bluetooth-stapels Bluedroid (Android 5) en Fluoride (Android 6-7). Door Qualcomm gemodificeerde stack wordt niet ondersteund.

Vervang Joint Stereo door Dual Channel in de standaard SBC-configuratie

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

Code:

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

Vervang A2D_SBC_IE_CH_MD_JOINT door A2D_SBC_IE_CH_MD_DUAL.

Verhoog de Dual Channel-prioriteit

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

Code:

if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; anders if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; anders if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; anders if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Verplaats if met A2D_SBC_IE_CH_MD_DUAL naar boven.
  1. Schakel de bitrate-beperking uit of verhoog deze

Android bluetooth-stack heeft niet alleen een bitpoollimiet, maar ook een bitrate-limiet, 328 kbit / s. Als de koptelefoon bijvoorbeeld bitpool 53 voor 48 kHz ondersteunt, zal Android de bitpool verlagen tot een limiet van 328 kbit / s. Dit zal gebeuren NADAT de codec-onderhandeling, in de coderingsfase, geen rekening houdt met de bitpoolwaarde in het Bluetooth SetCapabilities-pakket.

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

Code:

# definiëren DEFAULT_SBC_BITRATE 328

Vervang door 512.

  1. (alleen voor experimenten) MTU-limiet uitschakelen.

Dit is vereist voor bitrates hoger dan ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Code:

/ * 2DH5 payload-grootte van 679 bytes - (4 bytes L2CAP-header + 12 bytes AVDTP-header) * / #define MAX_2MBPS_AVDTP_MTU 663

Hoe Bluetooth-stapels op Android 8-9 te wijzigen

Deze aanpassingen zijn niet getest, maar zouden moeten werken.

Voeg Dual Channel-ondersteuning toe aan A2DP SBC Source

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

Code:

/ * SBC SRC codec-mogelijkheden * / statische const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_BLOCKS_8;

voeg A2DP_SBC_IE_CH_MD_DUAL toe in ch_mode.

Vervang Joint Stereo door Dual Channel in de standaardconfiguratie

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

Code:

/ * Standaard SBC codec configuratie * / 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 * /};

Vervang A2DP_SBC_IE_CH_MD_JOINT door A2DP_SBC_IE_CH_MD_DUAL.

Verhoog de Dual Channel-prioriteit

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

Code:

statische 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_Mode_CH_MD_JOD_JINT) {p_BCMresult-> ch; p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; terugkeer waar; } 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; terugkeer waar; } 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; terugkeer waar; } 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; terugkeer waar; } return false; }

Verplaats if met A2DP_SBC_IE_CH_MD_DUAL naar boven.

Verhoog de bitrate-limiet

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

Code:

# definiëren A2DP_SBC_DEFAULT_BITRATE 328

Vervang door 512.

  1. (alleen voor experimenten) MTU-limiet uitschakelen

Dit is vereist voor bitrates hoger dan ~ 580 kbit / s.

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

Code:

# definiëren MAX_2MBPS_AVDTP_MTU 663

Gepatchte Bluetooth-stapels (flitsbaar)

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