Como modificar pilhas de Bluetooth no Android para qualidade de áudio Bluetooth bastante aprimorada



Experimente Nosso Instrumento Para Eliminar Problemas

Aviso: este é um guia altamente avançado que envolve a modificação de suas pilhas de Bluetooth no Android - leia este guia na íntegra e siga todas as instruções exatamente como fornecidas.



Apesar do fato de que os fones de ouvido e o áudio Bluetooth tornaram-se bastante populares, é um pouco problemático para os audiófilos porque o Bluetooth comprovadamente reduz a qualidade do áudio, já que pedaços das informações de áudio e frequências se perdem no ar por meio do streaming do Bluetooth.



É por isso que alguns fabricantes estão lançando codecs aptX e LDAC, para melhorar a qualidade do som em relação ao codec Bluetooth SBC padrão, que é compatível com todos os fones de ouvido e a maioria dos dispositivos Bluetooth - no entanto, dispositivos com codecs aptX e LDAC são muito mais caros porque esses codecs exigem taxas de licenciamento, que o consumidor paga no longo prazo.



A baixa qualidade de áudio do codec SBC Bluetooth é causada por limitações artificiais de todas as pilhas Bluetooth atuais e configuração de fones de ouvido, e essa limitação pode ser contornada em qualquer dispositivo existente.

Se você estiver interessado em áudio Bluetooth, mostraremos no final deste guia como fazer um despejo de registro de áudio Bluetooth e inspecioná-lo para ver que tipo de qualidade de áudio e frequência você está obtendo do receptor Bluetooth do Android.

A maior parte deste guia se concentrará em alguns ajustes simples e maneiras de ler sua saída de áudio Bluetooth para melhorar muito a qualidade de saída dos codecs Bluetooth SBC padrão - por favor, leia este guia inteiro com atenção, pois é bastante educacional e há muitas coisas diferentes para piscar ou ajustar, dependendo do modelo do seu dispositivo.



Neste final deste guia está uma lista de pilhas Bluetooth pré-corrigidas para muitos dispositivos Android populares - eles podem ser atualizados na recuperação como você faria com qualquer outro .zip flash - se nenhum dos dispositivos pertencer a você, você terá para seguir o guia para modificar pilhas de Bluetooth no Android.

Breves informações técnicas sobre o codec SBC

O SBC tem muitos parâmetros diferentes que são negociados durante a fase de configuração da conexão:

  • Tipo e número do canal de áudio: Joint Stereo, Stereo, Dual Channel, Mono;
  • Número de bandas de frequência: 4 ou 8;
  • Número de blocos de áudio em um pacote: 4, 8, 12, 16;
  • Algoritmo de alocação de bits de quantização: Loudness, SNR;
  • Pool de bits máximo e mínimo usado no processo de quantização: geralmente 2-53.

O decodificador é necessário para suportar qualquer combinação desses parâmetros. O codificador pode implementar apenas uma parte deles.

As pilhas de Bluetooth existentes geralmente negociam o seguinte perfil: Joint Stereo, 8 bandas, 16 blocos, Loudness, bitpool 2..53. Este perfil codifica áudio de 44,1 kHz com uma taxa de bits de 328 kbps.

O parâmetro Bitpool afeta diretamente a taxa de bits no mesmo perfil: quanto maior, maior a taxa de bits e, portanto, a qualidade.

No entanto, o parâmetro bitpool não está vinculado a um perfil específico. A taxa de bits também é significativamente afetada por outros parâmetros: tipo de canal de áudio, número de bandas de frequência, número de blocos de áudio. Você pode aumentar a taxa de bits indiretamente negociando perfis não padrão, sem alterar o conjunto de bits.

Por exemplo, Dual Channel codifica canais separadamente, usando todo o conjunto de bits para cada canal. Forçar o dispositivo a usar Dual Channel em vez de Joint Stereo nos trará uma taxa de bits quase dobrada no mesmo bitpool máximo, 617 kbps.

Para mim, parece que o bitpool deve ser uma variável interna. É uma falha de design de especificação A2DP que o valor do conjunto de bits não seja vinculado a outros parâmetros do codec e seja definido apenas como um valor global.

Esses valores fixos de Bitpool e Bitrate se originam de valores recomendados para áudio de alta qualidade. Mas a recomendação não é desculpa para limitar o perfil a esses valores.

A especificação A2DP v1.2, que estava ativa de 2007 a 2015, requer que todos os decodificadores funcionem corretamente com taxas de bits de até 512 kbps:

O decodificador do SNK deve suportar todos os valores de bitpool possíveis que não resultem em excesso da taxa de bits máxima. Este perfil limita a taxa de bits máxima disponível a 320kb / s para mono e 512kb / s para modos de dois canais.

Na nova versão da especificação, não há limitação de taxa de bits. Presume-se que os fones de ouvido modernos lançados após 2015 podem suportar taxas de bits até 1000 kbps .

Por alguma razão, todas as pilhas Bluetooth testadas atualmente (Linux (PulseAudio), Android, Blackberry e macOS) têm restrições artificiais de parâmetro de bitpool máximo, que afeta diretamente a taxa de bits máxima. Mas este não é o maior problema, quase todos os fones de ouvido também limitam o valor máximo de bitpool a 53.

A maioria dos dispositivos funciona bem em uma pilha Bluetooth modificada com uma taxa de bits de 507 kbps, sem interrupções e estalos. Mas essa taxa de bits nunca será negociada em condições normais, com pilhas Bluetooth de estoque.

*** Obrigatório para teste usando os guias abaixo: bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso.torrent

Como testar em um PC

O teste de compatibilidade de fone de ouvido com alta taxa de bits é o mais fácil de ser executado no PC com um adaptador Bluetooth. Eu preparei a imagem do Ubuntu com uma pilha Bluetooth modificada, que pode ser executada como em uma máquina virtual (conectando o adaptador Bluetooth como um dispositivo USB dentro da máquina virtual, também funciona com os adaptadores embutidos nos laptops) ou inicializando a partir de a unidade flash USB. Esta imagem usa o seguinte perfil: Dual Channel, 8 bandas, 16 blocos, Loudness, bitpool 2..41, 44,1 kHz, que fornece taxa de bits de 485 kbps.

Executando em uma VM

  • Baixe o Virtualbox e o Virtualbox Extension Pack: https://www.virtualbox.org/wiki/Downloads;
  • Instale o Virtualbox, inicie-o;
  • Instale o pacote de extensão usando Arquivo → Preferências → Extensões;
  • Crie uma nova máquina virtual: Linux, Ubuntu (64 bits), 1024 RAM. Não crie um HDD.
  • Navegue até as configurações da máquina virtual, em Armazenamento, escolha Controlador: IDE, Vazio, pressione o ícone do CD → Escolha o arquivo do disco óptico virtual;
  • Selecione bluetooth-dualchannel-test-ubuntu-18.04.1-desktop-amd64.iso baixado;
  • Salve e feche a janela de configurações, inicie a máquina virtual;
  • Clique com o botão direito no ícone do cabo USB no canto inferior direito e selecione o adaptador Bluetooth;

Executando em um PC

A imagem suporta inicialização BIOS / CSM e UEFI.

  • Grave a imagem em uma unidade flash USB usando Etcher: https://etcher.io/. Esta operação excluirá todos os arquivos existentes em uma unidade USB.
  • Desligue o PC;
  • Insira a unidade flash USB, ligue o PC e pressione o botão de ordem de inicialização (geralmente Esc ou F12);
  • Selecione sua unidade flash USB.

Realizando o teste

  • (opcional, mas recomendado) Clique duas vezes no script “Btsnoop Dump” na área de trabalho. Ele iniciará a captura de dados Bluetooth para análise posterior. Não feche a janela do terminal.
  • Mude os fones de ouvido para o modo de emparelhamento;
  • Clique na seta no canto superior direito, selecione o ícone Bluetooth → Configurações de Bluetooth;
  • Escolha seus fones de ouvido, espere até que o emparelhamento seja concluído e feche a janela;
  • Defina o volume do Ubuntu para cerca de 2/3. Também diminua o volume usando os botões do fone de ouvido, pois pode ficar muito alto após o emparelhamento.
  • Abra a pasta “music”, reproduza “testrecord1.flac”;
  • (opcional, mas recomendado) Feche o player, feche a janela do terminal. Isso interromperá a captura de dados.
  • (opcional, mas recomendado) Abra o navegador Firefox, carregue o despejo de dados (btsnoop_hci.btsnoop na área de trabalho) para https://btcodecs.valdikss.org.ru/

Você pode ouvir outras músicas na pasta de músicas ou fazer upload da sua própria;

Não deve haver estalos, interrupção de áudio ou outra distorção de som nos fones de ouvido. Se você ouvir um som de boa qualidade, significa que seus fones de ouvido suportam áudio com uma taxa de bits de 485 kbps.

Como testar em um dispositivo Android

Para testar a partir de um smartphone ou tablet Android, você precisa usar a pilha Bluetooth modificada, que requer privilégio de root.

Como capturar o dump de dados Bluetooth no Android

  1. Desligue o Bluetooth;
  2. Em Configurações do desenvolvedor, habilite a opção “Habilitar log de snoop Bluetooth HCI”;
  3. Ligue o Bluetooth, conecte-se ao fone de ouvido usando o menu Bluetooth (isso é importante! Não permita a conexão automática!);
  4. Jogue uma amostra curta de áudio;
  5. Abra as configurações do desenvolvedor, desative a opção “Habilitar log de rastreamento Bluetooth HCI”;
  6. Deve haver /storage/emulated/0/btsnoop_hci.log ou /data/misc/bluetooth/logs/btsnoop_hci.log criado. Se estiver faltando, abra /etc/bluetooth/bt_stack.conf com um editor de texto e veja o caminho na opção BtSnoopFileName.

Não deve haver estalos, interrupção de áudio ou outra distorção de som nos fones de ouvido. Se você ouvir um som de boa qualidade com a biblioteca corrigida, significa que seus fones de ouvido suportam áudio com uma taxa de bits de 512 kbps.

Siga cuidadosamente o algoritmo acima. Especialmente, se você desligar os fones de ouvido ou desconectar após o emparelhamento, é importante conectar os fones de ouvido manualmente nas configurações de Bluetooth, não permita a conexão automática!

Dispositivos que suportam pelo menos 512 kbit / s SBC

  • 1MORE 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 máx. 39. Responde para não suportar Dual Channel, mas funciona se forçado, 462 kbit / s. Não está em conformidade com a especificação A2DP.)
  • Bluedio T5 (responde para não suportar Dual Channel, mas funciona se forçado. Não está em conformidade com a especificação A2DP.)
  • Bluedio T6 (responde para não suportar Dual Channel, mas funciona se forçado. Não está em conformidade com a especificação A2DP. Adote o chip Max 97220.)
  • Marshall Major II Bluetooth
  • Overdrive RealForce D1
  • Edifier W830BT
  • DEXP BT-250
  • Adaptador Logitech BT
  • Unidade principal automotiva Noname (chip CSR8645)
  • Unidade principal automotiva Sony DSX-A400BT

Dispositivos que suportam SBC superior a 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, canal duplo, 4 sub-bandas)

Dispositivos que não funcionam com taxas de bits mais altas ou canal duplo

  1. Harper HB-202 (torresmo; chip Beken BK3256)
  2. Sony Ericsson MW600 (distorção de alta frequência, estalos; dispositivo de 2009)

Por que isso é importante: SBC 328k e 485k vs aptX

Ao contrário da crença popular da qualidade de som do aptX, em alguns casos ele pode produzir pior qualidade de áudio do que o SBC com uma taxa de bits padrão de 328k.

O SBC aloca dinamicamente bits de quantização para bandas de frequência, agindo de “baixo para cima”. Se toda a taxa de bits foi usada para as frequências baixas e médias, as frequências superiores são “cortadas” (silenciadas).

aptX quantiza bandas de frequência com o mesmo número de bits constantemente, o que o torna um codec de taxa de bits constante: 352 kbps para 44,1 kHz, 384 kbps para 48 kHz. Ele não pode “transferir bits” para as frequências que são mais necessárias neles. Ao contrário do SBC, o aptX não “corta” frequências, mas adiciona ruído de quantização a elas, reduzindo a faixa dinâmica do áudio e, às vezes, introduzindo estalos. A SBC, ao contrário, “come os detalhes” - descarta as áreas mais tranquilas.

Em média, em comparação com o SBC 328k, o aptX causa menos distorção na música com uma ampla faixa de frequência, mas na música com uma faixa estreita de frequência e uma ampla faixa dinâmica, o SBC 328k às vezes vence.

Consideremos um caso especial, uma gravação de piano. Aqui está um espectrograma:


A maior parte da energia encontra-se nas frequências de 0-4 kHz e dura até 10 kHz.
O espectrograma do arquivo aptX arquivo se parece com este:

Aqui está o SBC 328k:

Pode ser visto que o SBC 328k periodicamente cortou completamente a faixa acima de 16 kHz, e usou todas as taxas de bits disponíveis para faixas abaixo desse valor. No entanto, aptX introduziu mais distorções no espectro de frequência audível pelo ouvido humano, o que pode ser visto no espectrograma original subtraído do espectrograma aptX (quanto mais brilhante, mais distorção):


Enquanto o SBC 328k introduziu menos distorção, o sinal está na faixa de 0 a 10 kHz, e o resto foi cortado:

A taxa de bits 485k para SBC foi suficiente para salvar toda a faixa de frequência, sem cortar as bandas.

SBC 485k nesta amostra de áudio é muito melhor do que aptX na faixa de 0-15 kHz, e com uma diferença menor, mas ainda perceptível - em 15-22 kHz (quanto mais escuro, menos distorção):

Mudando para um SBC de alta taxa de bits, você obterá um som superior ao aptX na maioria das vezes, em qualquer fone de ouvido.

  • original_and_aptx.zip
  • sbc.zip

Como modificar as pilhas de Bluetooth no Android 5 - 7

Essas modificações devem ser aplicadas às pilhas bluetooth Android padrão Bluedroid (Android 5) e Fluoride (Android 6-7). A pilha modificada pela Qualcomm não é compatível.

Substitua Joint Stereo por Dual Channel na configuração SBC padrão

android / plataforma / externo / bluetooth / bluedroid / btif / co / bta_av_co.c: 99

Código:

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

Substitua A2D_SBC_IE_CH_MD_JOINT por A2D_SBC_IE_CH_MD_DUAL.

Aumentar a prioridade do canal duplo

android / plataforma / externo / bluetooth / bluedroid / btif / co / bta_av_co.c: 41

Código:

if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; Mova se com A2D_SBC_IE_CH_MD_DUAL para o topo.
  1. Desative ou aumente a restrição da taxa de bits

A pilha de bluetooth do Android não tem apenas limite de bitpool, mas também limite de taxa de bits, 328 kbit / s. Se os fones de ouvido suportarem, por exemplo, bitpool 53 para 48 kHz, o Android diminuirá o bitpool para caber no limite de 328 kbit / s. Isso acontecerá APÓS a negociação do codec, no estágio de codificação, não leve em consideração o valor do bitpool no pacote Bluetooth SetCapabilities.

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

Código:

#define DEFAULT_SBC_BITRATE 328

Substitua por 512.

  1. (apenas para experiências) Desative o limite de MTU.

Isso é necessário para taxas de bits superiores a ~ 580 kbit / s.

btif / src / btif_media_task.c: 174

Código:

/ * Tamanho de carga útil 2DH5 de 679 bytes - (cabeçalho L2CAP de 4 bytes + cabeçalho AVDTP de 12 bytes) * / #define MAX_2MBPS_AVDTP_MTU 663

Como modificar pilhas de Bluetooth no Android 8-9

Essas modificações não foram testadas, mas devem funcionar.

Adicionar suporte de canal duplo à fonte SBC A2DP

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

Código:

/ * Capacidades de codec SBC SRC * / static const tA2DP_SBC_CIE a2dp_sbc_caps = A2DP_SBC_IE_BLOCKS_8;

adicione A2DP_SBC_IE_CH_MD_DUAL em ch_mode.

Substitua Joint Stereo por Dual Channel na configuração padrão

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

Código:

/ * Padrão SBC codec configuração * / 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 * /};

Substitua A2DP_SBC_IE_CH_MD_JOINT por A2DP_SBC_IE_CH_MD_DUAL.

Aumentar a prioridade do canal duplo

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

Código:

bool select_best_channel_mode estático (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_MD_JOINT_2_SBC_CH_MD_JOINT = p_codec_config-> channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO; return true; } 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; return true; } 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; return true; } 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; return true; } retorna falso; }

Mova se com A2DP_SBC_IE_CH_MD_DUAL para o topo.

Aumentar o limite da taxa de bits

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

Código:

#define A2DP_SBC_DEFAULT_BITRATE 328

Substitua por 512.

  1. (apenas para experiências) Desativar limite de MTU

Isso é necessário para taxas de bits superiores a ~ 580 kbit / s.

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

Código:

#define MAX_2MBPS_AVDTP_MTU 663

Pilhas de Bluetooth corrigidas (Flash)

  • 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
  • fecho eclair
  • Le Max 2 Oreo Patched.zip
10 minutos lidos