1 pontos por GN⁺ 2023-11-25 | 1 comentários | Compartilhar no WhatsApp
  • 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

 
GN⁺ 2023-11-25
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

    • No fim, imagino que seja porque é necessária baixa latência. Música e vídeo em modo “mídia” têm boa qualidade de som, mas alta latência; no vídeo dá para compensar atrasando a imagem na mesma medida, mas para chamadas telefônicas essa latência é grande demais
    • Não entendo por que HFP ainda é o padrão da indústria. Mesmo dispositivos dentro do mesmo ecossistema, como MacBook / iPhone / AirPods, parecem usar HFP pela qualidade do som
      Ou talvez seja AVRCP, mas, de qualquer forma, o som é horrível
    • Esse recurso está chegando lentamente ao mercado com LE Audio / Auracast. Mas parece que ainda vai levar algum tempo até haver bom suporte nos sistemas operacionais
  • 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

    • Como alguém que já desenvolveu ROMs customizadas e revisou/integrou as alterações do valdikSS, vejo que o que esse conjunto de patches faz não é corrigir um bug, mas permitir a negociação de SBC em canal duplo na conexão entre fonte e receptor
      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
    • Há um texto sobre Bluetooth em geral aqui: https://habr.com/en/articles/456182/
  • 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/

    • Não sei o que querem dizer com “Quality Loss” ao fazer downsampling de 48 kHz para 44,1 kHz. Se a reamostragem for feita corretamente, você só perde frequências muito altas, ou seja, acima de 22050 Hz
      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

    • Este texto é de 4 anos atrás, então é anterior a mudanças como o suporte a LE Audio que foi integrado ao Android depois disso
    • Fico curioso para saber como ativar isso no Linux
      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
    • Já estou sofrendo bastante só para fazer o Linux dar um suporte minimamente decente aos AirPods
  • 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

    • Parece improvável que algo assim aconteça. Duvido muito que a maioria dos fones tenha memória para esse tipo de buffer
      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
    • Isso só pareceria bom até o momento em que, ao receber uma ligação, você quisesse pular o conteúdo em buffer e atender a chamada recebida imediatamente, em vez de ouvir primeiro o próximo minuto de Led Zeppelin
    • Com memória embarcada suficiente, até seria possível, mas vira um problema quando você tenta sincronizar áudio e vídeo
      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
    • Infelizmente, isso é quase o oposto direto do que a maioria dos usuários quer em áudio
  • 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

    • Infelizmente, ele desapareceu nas versões mais recentes do Lineage. Hoje está praticamente esquecido
  • 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 -