- A baixa qualidade de áudio do codec SBC padrão não vem apenas das limitações do codec, mas também de restrições conservadoras da pilha Bluetooth e das configurações dos fones; mesmo dispositivos existentes podem ser melhorados com modificações de software
- Pilhas Bluetooth comuns normalmente negociam áudio estéreo a 44,1 kHz em 328 kbps, mas forçar Dual Channel eleva isso para cerca de 617 kbps com o mesmo bitpool 53
- Patches para Android 8.1 e 9 adicionam SBC Dual Channel às configurações de dispositivos Bluetooth como uma opção de HD Audio, usando 551 kbps para dispositivos EDR 3 Mb/s e 452 kbps para dispositivos EDR 2 Mb/s
- 551 kbps e 452 kbps foram escolhidos considerando a eficiência de transmissão Bluetooth em 5 slots; aumentar mais o bitpool reduz o número de quadros agrupados e eleva a chance de cortes em ambientes sem fio ruins
- Usuários de LineageOS, Resurrection Remix e crDroid podem ativar SBC de alta taxa de bits por uma caixa de seleção nas configurações, e usuários de Linux podem obter taxas de bits SBC mais altas e suporte à família aptX com um patch do PulseAudio
Por que a qualidade do SBC soa baixa
- Alguns usuários de fones sem fio percebem queda de qualidade e falta de agudos no codec SBC, suportado por todos os dispositivos de áudio Bluetooth
- Uma alternativa é comprar dispositivos e fones com suporte a aptX ou LDAC, mas esses codecs exigem custos de licenciamento e podem aumentar o preço dos aparelhos
- A causa central da baixa qualidade do SBC são limitações artificiais nas pilhas Bluetooth atuais e nas configurações dos fones, que podem ser contornadas por software mesmo em dispositivos existentes
Parâmetros do SBC e taxa de bits
- O SBC negocia vários parâmetros durante a etapa de configuração da conexão
- Tipo e número de canais de áudio: Joint Stereo, Stereo, Dual Channel, Mono
- Número de bandas de frequência: 4 ou 8
- Número de blocos de áudio por pacote: 4, 8, 12, 16
- Método de alocação de bits de quantização: Loudness, SNR
- Bitpool mínimo e máximo usado na quantização: normalmente 2..53
- O decodificador precisa suportar todas essas combinações de parâmetros, mas o codificador pode implementar apenas algumas delas
- Pilhas Bluetooth existentes normalmente negociam a combinação Joint Stereo, 8 bands, 16 blocks, Loudness, bitpool 2..53; nesse caso, áudio estéreo a 44,1 kHz é codificado a 328 kbps
- bitpool é o valor que altera a taxa de bits de codificação; quanto maior o valor, maiores a taxa de bits e a qualidade
- A correspondência exata entre valor de bitpool e taxa de bits só vale dentro de um perfil específico
- Tipo de canal, número de bandas de frequência e número de blocos de áudio também afetam bastante a taxa de bits
- Diferentemente de Stereo ou Joint Stereo, Dual Channel codifica cada canal separadamente e usa um bitpool individual para cada canal
- Forçar Dual Channel em vez de Joint Stereo quase dobra a taxa de bits, chegando a cerca de 617 kbps mesmo com o mesmo bitpool 53
Especificação A2DP e limitações das pilhas atuais
- A especificação A2DP v1.2, válida de 2007 a 2015, exigia que o decodificador suportasse todos os valores de bitpool que não ultrapassassem a taxa de bits máxima
- Esse perfil limita a taxa de bits máxima a 320 kb/s em mono e a 512 kb/s em modos de 2 canais
- A nova especificação não declara limites de taxa de bits
- Assume-se que fones modernos com suporte a EDR lançados após 2015 possam suportar até 730 kbps
- As pilhas Bluetooth testadas — Linux PulseAudio, Android, Blackberry e macOS — todas impõem limitações artificiais ao parâmetro de bitpool máximo
- Quase todos os fones também limitam o valor máximo de bitpool a 53
- Com a pilha Bluetooth modificada, a maioria dos dispositivos funcionou a 551 kbps sem cortes nem ruído, mas a pilha Bluetooth padrão não negocia essa taxa de bits em condições normais
Patch da pilha Bluetooth do Android
- Toda pilha Bluetooth compatível com A2DP precisa suportar o modo Dual Channel, mas usuários comuns não têm como forçar esse modo
- Os patches para Android 8.1 e Android 9 adicionam Dual Channel à pilha e ao menu de desenvolvedor, tratando-o como uma opção de codec HD Audio nas configurações de dispositivos Bluetooth, assim como aptX, AAC e LDAC
- Links dos patches
- Essa caixa de seleção alterna o modo Dual Channel e usa as seguintes taxas de bits conforme o dispositivo
- Dispositivos EDR 3 Mb/s: 551 kbps
- Dispositivos EDR 2 Mb/s: 452 kbps
- O conjunto de patches foi integrado aos seguintes firmwares alternativos
- LineageOS 15.1: desde 31 de março de 2019
- LineageOS 16.0: desde 13 de maio de 2019
- Resurrection Remix: desde 14 de maio de 2019
- crDroid: desde 13 de maio de 2019
Por que 551 kbps e 452 kbps foram escolhidos
- A transmissão Bluetooth por divisão de tempo foi projetada para enviar pacotes grandes de tamanho fixo com eficiência
- O número máximo de slots que pode ser enviado em uma transmissão é 5; também existem modos de transmissão de 1 slot e 3 slots, mas não há modos de 2 ou 4 slots
- A quantidade de dados que pode ser enviada em uma transmissão de 5 slots é a seguinte
- Conexão de 2 Mbps: até 679 bytes
- Conexão de 3 Mbps: até 1021 bytes
- A quantidade máxima de dados em uma transmissão de 3 slots é a seguinte
- Conexão de 2 Mbps: 367 bytes
- Conexão de 3 Mbps: 552 bytes
- Se dados maiores que 367 ou 552 bytes e menores que 679 ou 1021 bytes forem enviados, ainda são necessários 5 slots, reduzindo a eficiência da transmissão
- Ao codificar áudio de 44,1 kHz em SBC Dual Channel, bitpool 38, 16 blocks e 8 frequency bands, obtém-se um quadro de áudio de 164 bytes e uma taxa de bits de 452 kbps
- O payload de áudio precisa ser encapsulado pelos protocolos de transporte L2CAP e AVDTP, e nesse processo são subtraídos 16 bytes de overhead do payload de áudio
- Em EDR 2 Mb/s DH5, uma transmissão de áudio de 5 slots pode conter 4 quadros de áudio
679 - 4(L2CAP) - 12(AVDTP/RTP) - 1(SBC header) - (164*4) = 6
- Restam 6 bytes no pacote
- Um único pacote contém até 11,7 ms de dados de áudio e é transmitido em 3,75 ms
- Aumentar o bitpool mesmo um pouco impede colocar 4 quadros de áudio em uma única transmissão, obrigando o envio de 3 por vez
- A eficiência da transmissão diminui
- A quantidade de áudio contida em um pacote cai
- A chance de cortes de áudio aumenta em ambientes sem fio ruins
- 551 kbps para EDR 3 Mb/s foi escolhido pelo mesmo princípio
- Com bitpool 47, 16 blocks per frame e 8 frequency bands, o tamanho do quadro é de 200 bytes
- Uma transmissão pode agrupar até 5 quadros, ou seja, 14,6 ms de música
- O cálculo de parâmetros SBC é complexo e sujeito a erros quando feito manualmente; uma ferramenta web de cálculo é fornecida
Diferenças de qualidade de áudio entre aptX e SBC
- Ao contrário da crença comum de que aptX é sempre melhor que SBC, em alguns casos aptX pode produzir qualidade inferior ao SBC 328 kbps padrão
- O SBC aloca dinamicamente bits de quantização às bandas de frequência, distribuindo os bits das frequências mais baixas para as mais altas
- Quando toda a taxa de bits é usada em frequências baixas e médias, as frequências altas são cortadas ou silenciadas
- aptX é um codec de taxa de bits fixa que quantiza as bandas de frequência sempre com o mesmo número de bits
- 352 kbps a 44,1 kHz
- 384 kbps a 48 kHz
- O aptX não consegue deslocar bits para as frequências que precisam deles e, embora não corte frequências, adiciona ruído de quantização, reduzindo a faixa dinâmica do áudio e às vezes gerando ruído audível
- Já o SBC descarta regiões silenciosas; comparado ao SBC 328 kbps, o aptX apresenta, em média, menos distorção em músicas com ampla faixa de frequências
- Em músicas com faixa de frequência estreita e ampla faixa dinâmica, o SBC 328 kbps às vezes pode ser melhor que o aptX
- No exemplo de uma gravação de piano, a maior parte da energia está entre 0 e 4 kHz e se estende até 10 kHz
- O SBC 328 kbps cortou periodicamente por completo a faixa acima de 16 kHz
- O aptX introduziu mais distorção no espectro de frequências audíveis por humanos
- O SBC 328 kbps gerou menos distorção na faixa de 0 a 10 kHz e cortou as demais frequências
- SBC 485 kbps foi suficiente para preservar toda a faixa de frequências sem cortes
- São fornecidos os arquivos do áudio original e das versões codificadas em SBC/aptX
- Usar SBC de alta taxa de bits permite obter som melhor que aptX na maioria dos casos; em fones com suporte a EDR 3 Mb/s, SBC 551 kbps produz um som muito próximo ao aptX HD
Opções de taxa de bits mais alta
- O conjunto de patches para Android tem uma opção adicional que aumenta a taxa de bits em dispositivos EDR 2 Mb/s
- Definir o valor
persist.bluetooth.sbc_hd_higher_bitrate como 1 eleva a taxa de bits de 452 kbps para 595 kbps
- Essa opção pode reduzir a estabilidade da transmissão em ambientes sem fio congestionados
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
- O patch de taxa de bits extrema está integrado atualmente apenas ao LineageOS 15.1, não ao LineageOS 16.0
Dispositivos compatíveis e ferramentas de comparação
- SBC Dual Channel é suportado por quase todos os fones, alto-falantes e unidades centrais automotivas
- Como o padrão exige suporte a esse modo em todos os dispositivos de decodificação, ele funciona na maioria dos aparelhos
- Existem poucos dispositivos que apresentam problemas nesse modo, mas são casos muito raros
- Informações sobre dispositivos compatíveis podem ser consultadas nas seguintes comunidades
- Também é oferecido um serviço web que codifica áudio em tempo real no navegador para SBC, aptX e aptX HD
- btcodecs.valdikss.org.ru/sbc-encoder
- É possível comparar o som de vários perfis SBC e outros codecs em fones ou alto-falantes com fio, sem transmissão real por Bluetooth
- Os parâmetros de codificação podem ser alterados diretamente mesmo durante a reprodução do áudio
Tentativa de inclusão no AOSP e como usar
- Os desenvolvedores da pilha Bluetooth do Google foram contatados para incluir o patch no AOSP, o branch principal do Android, mas não houve resposta
- O patch enviado ao Gerrit code review system for Android também não recebeu comentários de envolvidos no desenvolvimento do Android
- O conjunto de patches no Gerrit é uma das revisões iniciais antigas, e pode ser atualizado se os desenvolvedores demonstrarem interesse
- Usuários de LineageOS, Resurrection Remix e crDroid podem melhorar a qualidade do áudio Bluetooth ativando a caixa de seleção nas configurações do dispositivo Bluetooth
- Usuários de Linux podem instalar o patch do PulseAudio de Pali Rohár para usar taxas de bits SBC mais altas
- Esse patch também adiciona suporte aos codecs aptX, aptX HD e FastStream
1 comentários
Opiniões no Hacker News
Isto é excelente: SBC tem amplo suporte e parece uma extensão natural do padrão existente
Pessoalmente, acho que o problema não é SBC versus LDAC/AAC, mas sim o fato de HFP ser péssimo. No momento em que o microfone é ativado, parece que voltamos aos anos 90; se fosse possível fazer áudio Bluetooth bidirecional direito, seria muito bem-vindo
Ou talvez seja AVRCP, mas, de qualquer forma, o som é horrível
Este texto não é sobre Bluetooth em geral, mas um mergulho profundo em um bug escondido na pilha Bluetooth do Android
O que o autor não reconhece de forma alguma é que o hardware subjacente é extremamente variado. O Android roda sobre inúmeros chipsets Bluetooth, então o fato de um patch parecer funcionar no próprio hardware não garante que funcione em outros celulares Android
Além disso, o que o dispositivo está fazendo naquele momento também influencia. Em um chipset compartilhado BT+Wi‑Fi, se você estiver transmitindo vídeo por Wi‑Fi e enviando áudio para os fones, o aparelho precisa distribuir recursos entre o uso de Wi‑Fi e o Bluetooth. Por isso, áudio armazenado localmente e áudio via streaming não necessariamente recebem os mesmos parâmetros de codec
Há tantos elementos sutis nesse tema que o autor não considerou que é preciso ler com cautela
Isso permite usar bitrates mais altos sem ultrapassar o bitpool máximo imposto pelo Android e pelo receptor Bluetooth
A negociação entre fonte e receptor continua acontecendo e, se um dos dois não oferecer suporte a SBC em canal duplo, a conexão volta para um modo compatível. Todos os dispositivos que eu mantinha tinham suporte, e alguns alto-falantes baratos que testei na época não tinham, então a sessão era negociada como joint stereo
No Windows, o Alternative A2DP Driver oferece esse recurso. Ele permite ajustar os parâmetros do SBC e também usar AAC ou aptX
Na minha experiência, funcionou bem e também ajudou a usar LDAC no Sony XM4. Ele funciona em modelo de avaliação, mas o preço é baixo
Já vi o alcance do Bluetooth diminuir no modo de alta qualidade, o que parece um sinal de que o codec, ou pelo menos alguma coisa, está de fato mudando, e não é placebo
Não tenho nenhuma relação com https://www.bluetoothgoodies.com/a2dp/
A faixa audível humana normalmente é documentada como indo até 20 kHz, embora alguns jovens consigam ouvir frequências um pouco acima disso
Para referência, no Linux também é possível ativar áudio SBC com bitrate mais alto usando algo chamado SBC XQ. De forma parecida, também dá para usar mSBC para áudio de headset melhor
Claro que ainda não chega nem perto do nível de SBC ou aptX
Seria bom se o pessoal do Google já tivesse integrado isso. Codecs de áudio melhores são suportados por muitos fones etc., mas não são universais, e melhorias em áudio bidirecional ainda são especialmente insuficientes
Também gostaria de saber como verificar o que o headset está usando no momento
Lembro que antigamente usei um PulseAudio com patch que expunha as configurações adequadas e depois ouvi dizer que isso tinha sido “integrado ao mainstream”, mas nunca consegui encontrar as configurações nem informações sobre o uso real
Eu queria que alguém criasse um perfil de áudio Bluetooth que pudesse fazer buffer com bastante antecedência
Por exemplo, se você tocar uma música de 1 minuto, a música inteira deveria ser carregada no buffer. Claro, se você pausar ou mudar o volume, o buffer teria que ser descartado
Com um buffer longo, o celular poderia dormir com mais frequência, economizando energia, e também resistiria melhor a uma conexão sem fio ruim
Mesmo que fosse apenas algo como 1–2 MB de RAM, os fones teriam que gastar bateria preciosa para manter essa RAM ativa
Pelo pouco que já mexi com apps de áudio, o suporte nos aplicativos também provavelmente seria complicado
Por isso, parece mais uma funcionalidade que produtos individuais incluiriam no design e que o app permitiria ao usuário ligar e desligar, do que um problema de protocolo
Usei esse recurso no LineageOS e, sinceramente, era muito bom. Eu conseguia enviar áudio de qualidade mais alta para equipamentos como um som automotivo que não ofereciam suporte a codecs de terceiros, e também ajudava bastante com fones
A experiência de usuário precisava ser refinada, mas o recurso em si era excelente
Seria bom colocar 2019 no título. Há expressões como “todas as pilhas Bluetooth atuais”, mas essas coisas já estavam implementadas há algum tempo no PulseAudio e no PipeWire
Sou um pouco cético quanto a Dual Channel a 551 kbps produzir uma qualidade perceptivelmente melhor que Joint Stereo a 328 kbps. Talvez esteja apenas usando mais bits para codificar informação redundante
Pelo menos na maioria das músicas é assim, embora possa haver exceções, como faixas em que trilhas gravadas diferentes foram colocadas intencionalmente nos canais esquerdo e direito
Como pergunta relacionada, fico curioso se há algum jeito de melhorar o HFP no macOS
Uso o mesmo headset no Linux com mSBC em qualidade bastante boa, mas no macOS ele fica completamente horrível, com qualidade de linha telefônica/mono. Queria saber se já existe algum hack para fazer isso funcionar direito no Darwin
Até ver este texto, eu nem sabia que estava usando SBC. O Lineage 18.1 não mostra aquela caixa de seleção na UI mesmo ao conectar dispositivos compatíveis com SBC. Mágica -