
Sou novo no Linux e também em scripts Bluetooth. O que descobri até agora é o seguinte:
- Bluez é a pilha BT padrão.
- BluezTools é um conjunto de utilitários que você pode usar para interagir mais facilmente com o Bluez
- DBus é a interface à qual o Bluez se conecta enquanto interage diretamente com o hardware.
- PulseAudio é o subsistema responsável pela produção de áudio no sistema.
Isso faz sentido. Então, digamos que eu tenha um conjunto de fones de ouvido BlueTooth, o que eu esperaria é (tudo após emparelhar e confiar) poder emitir um comando que possa se conectar diretamente a um determinado perfil nos fones de ouvido BT.
O caminho técnico que tenho em mente seria algo como:
- Ligue os fones de ouvido.
- Emita um comando BluezTools - comobt-áudio -c
- Aguarde o dispositivo se conectar ao serviço que procuro
- PulseAudio agora deve escolher um novo dispositivo de saída
- Emita outro comando para alterar o áudio do que era para um novo áudio de saída (os fones de ouvido BT).
- Desfrute de uma experiência auditiva perfeita.
Tudo isso parece lógico, mas a implementação real não é assim, e estou procurando o PORQUÊ, para poder entender melhor o problema e tentar corrigi-lo.
Isto é o que realmente acontece:
- Ligue os fones de ouvido.
- Emita um comando BluezTools - comobt-áudio -c
- Aguarde o dispositivo se conectar ao serviço que procuro
- PulseAudio agora deve escolher um novo dispositivo de saída
- Emita um comando PulseAudio para alterar o perfil de áudio de qualidade de telefone para alta fidelidade.
Deixe-me expandir um pouco isso. O fone de ouvido bluetooth oferece 2 modos de qualidade (telefone e alta fidelidade). Apenas 1 é realmente adequado para ouvir música.
Eu esperaria que os fones de ouvido BT exponham cada modo de qualidade como um serviço, certo? Essa suposição pode estar errada, mas eu esperaria algo como
bt-audio -c perfil de alta fidelidade
ou
bt-audio -changeProfile perfil de alta fidelidade
Em vez disso, parece que o Bluez apenas lida com a conexão RAW com o dispositivo e, a partir daí, você precisa emitir um:pacmd set-card-profile $INDEX a2dp
Isso parece fundamentalmente errado. Por que o controle de qualidade está no subsistema de áudio, exigindo, portanto, uma implementação diferente para pulso ou alsa, ou qualquer outro subsistema de som existente?
o que estou perdendo? Por que não é possível conectar-se diretamente a um determinado perfil usando Bluez/BluezTools etc?
Responder1
Uma conexão Bluetooth tem latência significativa em comparação com fones de ouvido ou alto-falantes simples com fio. Além do mais, a latência da conexão pode variar, dependendo das propriedades do receptor bluetooth e talvez até da intensidade do sinal de rádio conforme o usuário se move.
A interface entre um aplicativo e o PulseAudio pode ser tão simples quanto "aqui estão alguns dados de áudio PCM; reproduza isto". Mas também pode ser mais complicado; algo como "Aqui estão alguns dados de áudio PCM; reproduza isto e diga-me a cada 50 ms até onde você chegou, para que eu possa dizer para você pular se parecer que você está perdendo a sincronização labial com o fluxo de vídeo Estou jogando. Ah, e você precisará fazer uma nova amostragem também, já que os dados têm uma taxa de amostragem que seu hardware não suporta diretamente. Neste último caso, o PulseAudio precisa ser capaz de fornecer ao aplicativo algum feedback do dispositivo de áudio para determinar corretamente até que ponto os dados de áudio foram realmente reproduzidos em um determinado momento.
Como resultado, faz sentido que o PulseAudio esteja profundamente envolvido no processamento de áudio Bluetooth: quanto mais camadas intervenientes houver, mais possibilidades de os dados serem armazenados em buffer sem manter um feedback preciso, causando a perda da sincronização labial.
Na verdade, antes da existência do PulseAudio, costumava haver um back-end ALSA para áudio Bluetooth, mas foi obsoleto. Acho que o problema era que as interfaces do ALSA naquela época eram projetadas principalmente para placas de som tradicionais, e era difícil lidar com uma latência de áudio potencialmente variável do Bluetooth.
As interfaces do PulseAudio foram projetadas desde o início para lidar com vários dispositivos de som e até mesmo alternar fluxos de áudio entre eles enquanto o fluxo está sendo reproduzido, então me parece que ele também possui um conceito bastante avançado de latência de áudio integrado.
Sim, poderia ter sido implementado no BlueZ em vez de como um módulo PulseAudio; mas então o BlueZ teria que apresentar uma interface de áudio para os aplicativos. E como o PulseAudio deseja lidar com "todo" o áudio em um sistema (para poder transferir o áudio que você está reproduzindo atualmente dos alto-falantes para o Bluetooth ou vice-versa em tempo real), ele teria que fazer interface com o PulseAudio de alguma forma, de qualquer maneira.
Responder2
Acho que finalmente encontrei uma solução (testada em dois sistemas Linux Mint), embora não tenha ideia de por que preciso seguir exatamente estas etapas:
Etapas iniciais:
- Instale o blueman:sudo apt-get install blueman
- Editar arquivo Bluetooth:sudo nano /etc/bluetooth/main.confe adicione esta linha no final:Desativar=Fone de ouvido
Para cada corrida:
- Reinicie o serviço Bluetooth:reinicialização do bluetooth do serviço sudo
- Abra Dispositivos do blueman na bandeja do sistemaoutipogerente bluemanno terminal
- Procurarpara o seu dispositivo de áudio bluetooth
- Clique com o botão direito no seu dispositivo e conecte-se comofone de ouvido
- Vá parasomnas configurações do sistema
- Selecione seu dispositivo clicando nele uma vez
- Agora vá novamente paragerente blueman
- Clique com o botão direito no seu dispositivo Bluetooth e defina o perfil de áudio comoReprodução de alta fidelidade (coletor A2DP)
Se você perder alguma das etapas, vá para a etapa 1 e tente novamente. Deixe-me saber se isso funciona.
Editar: No Linux Mint 19, o gerenciador bluetooth padrão funciona perfeitamente com reprodução de alta fidelidade, nenhuma configuração necessária !!
Responder3
Embora possa variar de acordo com sua configuração, aqui estão alguns comandos bem testados.
Você precisa definir o dispositivo como confiável. Isso pode ser feito através do gui.
navegação sdptoolfornecerá muitos detalhes sobre os protocolos e canais disponíveis no dispositivo de destino.
É mais fácil configurar um coletor de áudio bluetooth a2p ao usar saídas de áudio simultâneas, para configurá-lo consulte a ferramentapaprefs.
sudo apt install bluetooth
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm
Inicie o dispositivo, deve ser hci0 de qualquer maneira:
sudo hciconfig hci0 up
Listar dispositivos remotos:
sudo rfkill list
Listar redes Bluetooth:
hcitool scan
Navegue pelos protocolos disponíveis:
sdptool browse 43:23:00:02:23:A7
Conecte um dispositivo:
sudo rfcomm connect hci0 43:23:00:02:23:A7
Envie um arquivo:
sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png
Receba um arquivo:
sudo bt-obex -s /
Faça a varredura/aguarde pelos dados em um canal (aqui, canal 19) e grave os dados em um arquivo chamado dump, na pasta inicial:
sudo apt install bluez-hcidump
hcidump -i hci0 -O 19 -w ~/dump
Alternativa: às vezes útil para emparelhamento:
sudo apt install bluetoothctl
bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7