Hoe Bluetooth-stapels op Android aan te passen voor een sterk verbeterde Bluetooth-audiokwaliteit

Waarschuwing: dit is een zeer geavanceerde gids die betrekking heeft op het aanpassen van uw Bluetooth-stacks op Android - lees deze handleiding in zijn geheel en volg alle instructies precies zoals 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 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-audio-log dump kunt nemen en inspecteren 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 concentreren op een paar eenvoudige aanpassingen en manieren om uw Bluetooth-audio-uitvoer te lezen om de uitvoerkwaliteit van standaard SBC Bluetooth-codecs aanzienlijk te verbeteren - lees deze hele handleiding zorgvuldig door, want het is vrij leerzaam en er zijn veel verschillende dingen flitsen of tweaken, afhankelijk van uw apparaatmodel.

Aan het einde van deze gids staat een lijst met vooraf gepatchte Bluetooth-stacks voor veel populaire Android-apparaten - deze kunnen in herstel worden geflitst zoals elke andere flashbare .zip - als geen van de apparaten van jou is, heb je om de gids te volgen voor het wijzigen van Bluetooth-stacks op Android.

Korte technische informatie over SBC-codec

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

  • Type en nummer van audiokanaal: Joint Stereo, Stereo, Dual Channel, Mono;
  • Aantal frequentiebanden: 4 of 8;
  • Aantal audioblokken in één pakket: 4, 8, 12, 16;
  • Quantisatie bitallocatie-algoritme: Loudness, SNR;
  • Maximale en minimale bitpool gebruikt in kwantisatieproces: meestal 2-53.

De decoder is vereist om elke combinatie van deze parameters te ondersteunen. Encoder mag 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 44, 1 kHz-audio met een bitrate van 328 kbps.

De parameter Bitpool heeft rechtstreeks invloed op de bitrate binnen hetzelfde profiel: hoe hoger deze is, hoe hoger de bitrate en dus de kwaliteit.

De parameter bitpool 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 bijvoorbeeld kanalen afzonderlijk, waarbij de volledige bitpool voor elk kanaal wordt gebruikt. Als we het apparaat dwingen om Dual Channel te gebruiken in plaats van Joint Stereo, krijgen we bijna een verdubbelde bitrate bij dezelfde maximale bitpool, 617 kbps.

Ik vind dat bitpool een interne variabele moet zijn. Het is een ontwerpfout van de A2DP-specificatie dat de bitpoolwaarde niet is gebonden aan andere codec-parameters en alleen wordt gedefinieerd 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 leiden tot 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 bitrate-beperking. Er wordt aangenomen dat moderne koptelefoons uitgebracht na 2015 bitrates tot 1000 kbps kunnen ondersteunen.

Om de een of andere reden hebben alle momenteel geteste Bluetooth-stacks (Linux (PulseAudio), Android, Blackberry en macOS) kunstmatige beperkingen van de maximale bitpool-parameter, die direct van invloed zijn op de maximale bitrate. Maar dit is niet het grootste probleem, bijna alle hoofdtelefoons beperken ook de maximale bitpool-waarde tot 53.

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

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

Hoe te testen op een pc

Compatibiliteitstest met SBC-hoofdtelefoon met hoge bitsnelheid is het eenvoudigst uit te voeren op de pc met een Bluetooth-adapter. Ik heb 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 de USB-stick. Deze afbeelding gebruikt het volgende profiel: Dual Channel, 8 banden, 16 blokken, Loudness, bitpool 2..41, 44.1 kHz, wat een bitrate van 485 kbps biedt.

Draait in een VM

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

Draait op een pc

De afbeelding ondersteunt BIOS / CSM en UEFI-opstarten.

  • Brand de afbeelding op een USB-stick met behulp van Etcher: //etcher.io/. Met deze bewerking worden alle bestaande bestanden op een USB-schijf verwijderd.
  • Schakel de pc uit;
  • Plaats een USB-stick, zet de pc aan en druk op de opstartknop (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 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 uw 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, omdat het na het koppelen erg luid kan zijn.
  • Open de map "muziek", speel "testrecord1.flac";
  • (optioneel maar aanbevolen) Speler sluiten, terminalvenster sluiten. Hiermee wordt het vastleggen van gegevens gestopt.
  • (optioneel maar aanbevolen) Open Firefox-browser, upload gegevensdump (btsnoop_hci.btsnoop op het bureaublad) naar //btcodecs.valdikss.org.ru/

Je kunt naar andere muziek luisteren in de muziekmap of je eigen muziek uploaden;

Er mogen geen gekraak, audio-onderbreking of andere geluidsvervorming in de hoofdtelefoon optreden. Als u een goed geluid van hoge kwaliteit hoort, betekent dit dat uw hoofdtelefoon audio ondersteunt met een bitsnelheid van 485 kbps.

Hoe te testen op Android-apparaat

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

Hoe Bluetooth-gegevensdump op Android vast te leggen

  1. Schakel Bluetooth uit;
  2. Schakel in de ontwikkelaarsinstellingen de schakelaar 'Bluetooth HCI snoop log inschakelen' in;
  3. Schakel Bluetooth in, maak verbinding met uw headset via het Bluetooth-menu (dit is belangrijk! Sta geen automatische verbinding toe!);
  4. Speel een korte audio-sample;
  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 worden gemaakt. Als het ontbreekt, opent u /etc/bluetooth/bt_stack.conf met een teksteditor en ziet u het pad in de optie BtSnoopFileName.

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

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

Apparaten die ten minste 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. Reageren om Dual Channel niet te ondersteunen, maar werken indien geforceerd, 462 kbit / s. Komt niet overeen met de A2DP-specificatie.)
  • Bluedio T5 (reageren op Dual Channel niet ondersteunen, maar werken indien geforceerd. Komt niet overeen met de A2DP-specificatie.)
  • Bluedio T6 (reageren op geen ondersteuning voor Dual Channel, maar werken indien geforceerd. Komt niet overeen met A2DP-specificatie. Neem Max 97220-chip aan.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Logitech BT-adapter
  • Noname automotive head unit (CSR8645-chip)
  • Sony DSX-A400BT automotive head-unit

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

Apparaten die niet werken met hogere bitrates of Dual Channel

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

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

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

SBC wijst dynamisch kwantisatiebits toe voor frequentiebanden, handelend op een "bottom-to-top" -basis. Als de hele bitrate werd gebruikt voor de lagere en middelste frequenties, worden de bovenste frequenties "afgekapt" (uitgeschakeld).

aptX kwantiseert frequentiebanden constant met hetzelfde aantal bits, waardoor het een constante bitrate codec is: 352 kbps voor 44, 1 kHz, 384 kbps voor 48 kHz. Het kan geen "bits" overbrengen naar frequenties die daar het meest in nodig zijn. In tegenstelling tot SBC zal aptX de frequenties niet “afsnijden”, maar er kwantisatieruis aan toevoegen, waardoor het dynamische bereik van audio wordt verminderd en soms gekraak wordt geïntroduceerd. SBC daarentegen, "eet de details op" - 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 een speciaal geval overwegen, een piano-opname. Hier is een spectrogram:

De meeste energie ligt in de 0-4 kHz-frequenties en gaat tot 10 kHz mee.

Het spectrogram van het bestand aptX-bestand ziet er zo 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 gebruikte voor bereiken onder deze waarde. AptX introduceerde echter meer vervormingen in het frequentiespectrum hoorbaar door het menselijk oor, wat te zien is op het afgetrokken oorspronkelijke spectrogram van het aptX spectrogram (hoe helderder, hoe meer vervorming):

Terwijl de SBC 328k minder signaalvervorming heeft geïntroduceerd in het bereik van 0 tot 10 kHz, en de rest is ingesteld:

Bitrate 485k voor SBC was genoeg om het hele frequentiebereik te besparen, 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 hoge bitsnelheid, krijgt u meestal een geluid dat superieur is aan aptX, op elke hoofdtelefoon.

  • original_and_aptx.zip
  • sbc.zip

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

Deze wijzigingen moeten worden toegepast op Android-Bluetooth-stacks Bluedroid (Android 5) en Fluoride (Android 6-7). Qualcomm-gemodificeerde stapel wordt niet ondersteund.

Vervang Joint Stereo door Dual Channel in 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: 4

Code:

 if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; anders als (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; anders als (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; anders als (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Verplaats als met A2D_SBC_IE_CH_MD_DUAL naar boven. 
  1. Beperking bitrate uitschakelen of verhogen

Android Bluetooth-stack heeft niet alleen bitpool-limiet, maar ook bitrate-limiet, 328 kbit / s. Als de hoofdtelefoon bijvoorbeeld bitpool 53 voor 48 kHz ondersteunt, verlaagt Android de bitpool tot een limiet van 328 kbit / s. Dit zal gebeuren NA codeconderhandeling, in het coderingsstadium, geen rekening houden met bitpoolwaarde in Bluetooth SetCapabilities-pakket.

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

Code:

 #define DEFAULT_SBC_BITRATE 328 

Vervangen 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 payloadgrootte 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 wijzigingen 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_SAMP_FREQ_44, / * samp_freq * / (A2DP_SBC_IE_CH_MD_MONO; 

voeg A2DP_SBC_IE_CH_MD_DUAL toe in ch_mode.

Vervang Joint Stereo door Dual Channel in 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_CH_MD_JOINT) {p_result-> CH_____JP_JP_JM_J_INT_J_INT_JS_JOINT) p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; waar terugkomen; } 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; waar terugkomen; } 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; waar terugkomen; } 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; waar terugkomen; } return false; } 

Verplaats als met A2DP_SBC_IE_CH_MD_DUAL naar boven.

Verhoog de bitrate limiet

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

Code:

 #define A2DP_SBC_DEFAULT_BITRATE 328 

Vervangen 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:

 #define MAX_2MBPS_AVDTP_MTU 663 

Patched Bluetooth Stacks (flashbaar)

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

Interessante Artikelen