Como determinar quais codecs A2DP meu telefone suporta / está usando atualmente?

24

O Perfil de áudio A2DP do Bluetooth suporta vários codecs. Todos os dispositivos precisam oferecer suporte a SBC (codec de sub-banda), para que possam suportar "codecs opcionais" adicionais, como MP3 e AAC, ou codecs "não-A2DP", como o apt-X.

É claro que esses codecs não podem realmente ser usados ​​se o receptor também não os suportar; nesse caso, os dois dispositivos retornam à SBC.

  1. Como descubro quais codecs meu hardware / ROM suporta?
  2. Como descubro qual codec está atualmente em uso? (Talvez isso dependa também da faixa, se ela passar arquivos MP3 / AAC diretamente sem recodificar, por exemplo)
endólito
fonte
Este artigo diz "Os usuários do Android estão com sorte, pois os telefones Android modernos oferecem suporte ao AptX. Ao contrário do Windows, é até possível verificar se a conexão está usando o AptX!" Mas nenhuma explicação de como.
endolith

Respostas:

10

No meu telefone Cyanogen 10.1 (AOSP 4.2.2), é possível ativar a captura de tráfego bluetooth. Você pode carregar essa captura no Wireshark e examinar a fase de negociação para determinar quais codecs o dispositivo de saída de áudio emparelhado suporta. Não tenho certeza de quais sistemas operacionais suportam isso: quando eu deparei com esse método, ele alegava suporte apenas a partir do 4.4, mas claramente não era o caso do CM em um Doubleshot. :-)

Supondo que você tenha a configuração necessária (raiz ~ 4.2.2 ou posterior), estas são as etapas:

  1. emparelhe seu telefone com o dispositivo A2DP de seu interesse
  2. desativar o bluetooth no seu telefone
  3. edite este arquivo: /etc/bluetooth/bt_stack.conf, alterando a configuração BtSnoopLogOutput de seu valor padrão de false para true. Para isso, uso o ES Note Editor, iniciado no ES File Explorer após ativar a configuração "Root Browser".
  4. inicie o CatLog, com todos os tipos de log ativados
  5. ativar o bluetooth no seu telefone
  6. depois de emparelhar com o dispositivo de saída, reproduza um trecho de áudio com o seu player de sua escolha (eu uso o Apollo). Dez segundos ou mais devem ser suficientes.
  7. desativar o bluetooth novamente
  8. interrompa o registro do CatLog e salve seu arquivo de log no seu cartão SD
  9. [IMPORTANTE!] Edite bt_stack.conf, alterando BtSnoopLogOutput de volta para false.
  10. copie a captura BT do seu cartão SD (/sdcard/btsnoop_hci.log), juntamente com o arquivo CatLog salvo, em um computador com uma cópia atual do Wireshark instalada.
  11. carregue o arquivo de captura no Wireshark e defina um filtro de exibição do Wireshark "btavdtp" (sem aspas). Agora você verá apenas alguns pacotes, procure a resposta do dispositivo de saída para a consulta AVDTP GetCapabilities e terá sua resposta.

Você também pode alinhar os registros de data e hora da captura com os registros de data e hora do log do CatLog para procurar entradas de registro sugestivas. Encontrei um casal e esqueci inteligentemente de incluí-lo nas notas em que este post se baseia.

Quando tiver mais tempo, espero reduzir esse longo conjunto de etapas para um aplicativo, mas não tenho certeza se é possível e ainda não terá tempo por um tempo. Enquanto isso, sugestões para melhorar o processo acima são bem-vindas.

ewedel
fonte
11
Obrigado. Isso funcionou muito bem. Não encontrei nada relevante para os recursos nos logs do CatLog. Enfim, tentei no Moto G (2013) executando o CM 4.4.2 e com o fone de ouvido LG HBS-730. Não há apt-X nos logs, porque o CM não possui bibliotecas proprietárias para isso.
dvim
Obrigado, @ Martynas, bom saber. Incluiu suporte para mp3? Gostaria de saber o que pode ser um bom alvo para testar se o meu telefone suporta mp3. Infelizmente, o rádio do carro não encontrou nenhum produto (!) Que documenta seu suporte ao codec A2DP. Com relação ao CatLog, não estava pensando que a lista de codecs reais estaria lá tanto quanto algumas mensagens sugestivas que poderiam ser usadas para pesquisar o código-fonte. Outro dia ..
ewedel 25/11
11
Portanto, uma resposta Discoverretornou três coletores de áudio. Uma resposta GetCapabilitiespara ACP SEID [2 - Audio Sink]incluído Service: Media Codec - Audio MPEG-1,2 Audioque tinha MP3: True. Fiz upload do arquivo de log capturado no github .
dvim
Mais uma vez obrigado @Martynas. Embora o 730 tenha melhores críticas, pegou um LG HBS-750 para testes. O mesmo conjunto de codecs que o 730. Garfou seu repositório e adicionou outra captura aqui . Infelizmente, em ambas as capturas, o telefone está optando por usar o SBC em vez de mp3. Não sei ao certo qual tipo de arquivo de mídia você usou, mas meu teste do CM 4.2.2 usou mp3s VBR de 128kb / s (taxa de bits deliberadamente pequena para evitar sobrecarregar a largura de banda BT). Começando a pensar que ce4 pode estar certo sobre a questão do licenciamento .
ewedel
O apagamento do `/ etc / bluetooth / bt_stack.conf` não parecia funcionar, mas eu tinha exatamente a mesma configuração nas configurações do desenvolvedor e isso funcionou. Graças à sua resposta, consegui descobrir que o Parrot Zik 2 usa SBC na maioria das vezes.
Zero
8

Observando a fonte, há pelo menos 4 codecs: SBC (obrigatório), MP3 (MPEG12), AAC (MPEG24) e ATRAC da Sony.

./android/external/bluetooth/bluez/audio/a2dp.h:  
#define A2DP_CODEC_SBC          0x00
#define A2DP_CODEC_MPEG12       0x01
#define A2DP_CODEC_MPEG24       0x02
#define A2DP_CODEC_ATRAC        0x03

O software subjacente é a pilha "bluez" do linux. Ele suporta SBC e possui recursos limitados de MP3.

O changelog da v3.25 (2009?) Diz: "Adicione suporte limitado ao codec MPEG12 / MP3".

./android/external/bluetooth/bluez/ChangeLog:
ver 3.25:
    Add limited support for Handsfree profile.
    Add limited support for MPEG12/MP3 codec.

Veja também o anúncio da v3.25 . O suporte a MP3 parece depender do gstreamer, que não está disponível no Android, então acho que o SBC é a única opção para o A2DP inicializar.

PS: A maioria dos dispositivos A2DP parece não ter suporte para MP3 / AAC devido a problemas de patentes / licenciamento (incluindo Linux).

ce4
fonte
2
Esses são 3 codecs opcionais, sim, ou ele pode usar outros codecs como o Galaxy S III usando o apt-X . Eu pensei que a codificação era fornecida por hardware, embora? O Android pode tocar MP3, então eu duvido que haja alguma limitação de patente.
endolith 24/07/12
2
Não acho que a SBC tenha um codificador de hardware dedicado em dispositivos Android. É computacionalmente modesto, então acho que é feito em software. Pelo menos as fontes indicam isso. PS: Estou vendo a fonte da Cyanogenmod, não da HTC ou da Samsung. PS2: Eu quis dizer os dispositivos dissipador de áudio no outro lado com a falta de MP3 / AAC (fones de ouvido, etc.)
CE4
7

Com os dispositivos Nexus 4 (5.0.1) ou Nexus 7 (2012) (4.4.4), é possível usar o modo de desenvolvedor para obter o btsnoop_hci.log. "Ativar log snoop Bluetooth HCI". Não é necessário fazer root nos dispositivos. Parece que ambos os dispositivos não oferecem aptx. Eu testei isso com o Moto Stream (sem aptx) e a Philips AEA2500 (com aptx).

prittstift69
fonte
11
Estou no CM 12.1 e esta poção também está disponível para mim. Talvez esteja em todos os telefones recentes. Obrigado.
pedro_sland
4

[O crédito por essa resposta é principalmente do ewedel, que esclareceu que a resposta está no arquivo btsnoop_hci.log, usando o Wireshark; e prittstift69, por compartilhar a maneira fácil de criar esse arquivo de log.]

Este é um tutorial passo a passo para iniciantes, resumindo as respostas já fornecidas, com alguma interpretação dos meus resultados.

Como prittstift69 e outros mencionados, você pode "Ativar log snoop Bluetooth HCI" em Opções do desenvolvedor. Não é necessário seguir a abordagem mais complicada sugerida por ewedel.

  1. Comece desativando o bluetooth no dispositivo Android (vou chamá-lo de 'telefone').

  2. Ative o log do snoop Bluetooth HCI em Opções do desenvolvedor.

  3. Ligue o Bluetooth no telefone e conecte-o ao receptor Bluetooth (chamarei de 'receptor'). Esta etapa pressupõe que o receptor tenha sido anteriormente emparelhado com o telefone.

  4. Reproduza música no seu telefone (de preferência um arquivo WAV ou FLAC não compactado). Dez segundos é tudo que você precisa. (Provavelmente até menos)

  5. Desligue o Bluetooth no telefone.

  6. Desativar o log do snoop Bluetooth HCI

  7. Transfira o arquivo btsnoop_hci.log (eu o encontrei em / sdcard / Android / Data /) para o seu computador. Execute o wireshark no seu computador e abra o arquivo btsnoop_hci.log

  8. Filtrar "btavdtp" (sem aspas) Procure uma mensagem do telefone para o destinatário "Comando enviado - SetConfiguration ...." Esta é a mensagem enviada pelo telefone ao destinatário com a configuração final a ser usada para este áudio após a conclusão do aperto de mão. O texto no campo Informações informará qual era a configuração final.

[SBC] Se for SBC, convém saber qual é o bitpool. Para fazer isso, remova o filtro do btavdtp, procure uma mensagem com o protocolo SBC e clique nele. Abaixo, na seção de detalhes, expanda as informações do Bluetooth SBC Codec. Expanda qualquer um (ou todos) os dados do quadro. Lá, ele deve mostrar claramente o Bitpool usado por esse quadro. Se tiver 35 anos, há uma boa chance de que a taxa de amostragem seja 44,1 kHz, você esteja usando o Joint Stereo e o perfil de áudio SBC de qualidade média ( http://soundexpert.org/news/-/blogs/bluetooth-audio -quality-a2dp ). A taxa de bits para o áudio compactado é de 229 kbits / s SBC, que atinge 4,68 nos testes do Sound Expert ( http://soundexpert.org/encoders-224-kbps ), comparável ao mp3 em torno de 110-130 kbits / s.

[APT-X] Se for o APT-X, o telefone e o receptor suportam o APT-X, e é isso que está usando. Assumindo 16 bits, 44,1kHz, o codec está sendo executado a 352kbits / s.

klaberte
fonte
"idealmente, um arquivo WAV ou FLAC descompactado" Você não gostaria de reproduzir um MP3 para ver se o envia como MP3, etc?
endolith
2
Somente se seu objetivo é verificar se o A2DP suporta mp3 nos dois lados (uma pergunta válida). No entanto, minha experiência é que o suporte a mp3 em ambos os lados é raro (nunca o vi em nenhum dos meus dispositivos e já tive muitos). Portanto, pelo menos com dispositivos Android, suas opções de codec A2DP mais prováveis ​​são SBC e APTX. A reprodução de um arquivo de áudio não compactado força o telefone a recodificar.
klaberte
Eu não escrevi uma resposta
endolith