Livre-se da latência de 0,5s ao reproduzir áudio por Bluetooth com A2DP


49

Conforme descrito no título, experimento um atraso de meio segundo ao reproduzir áudio por Bluetooth com A2DP.
Isso impossibilita a exibição de filmes, pois o som não é sincronizado com o vídeo.

Não tenho certeza se o atraso é causado pelo padrão Bluetooth, pelo protocolo A2PD, pela implementação A2DP no Ubuntu 12.04 ou pelo Belkin Z73 Bluetooth Receiver.

Enfim, isso é um atraso normal? Existe uma maneira de reproduzir áudio por Bluetooth sem latência perceptível?


9
Não é uma solução real para o seu problema, mas uma solução alternativa: se se trata apenas de reproduzir filmes, você pode ajustar o deslocamento de áudio / vídeo, o que também atrasará o vídeo. Usando mplayer, você faz isso pressionando as teclas +e -. No VLC, não sei como definir o atraso, mas ficaria surpreso se o VLC não tiver essa opção.
perfil completo de leemes

Pensei nisso, mas estou perdendo uma solução para o YouTube. Quando o vídeo é reproduzido com HTML5, uma solução pode ser instalar uma extensão do navegador que defina um deslocamento de vídeo. Mas, para o caso, o vídeo é reproduzido com flash, não sei como conseguir isso.
Brillout

Aliás, a opção VLC está em Tools->Track Synchronisation, ou brinca com a --audio-desyncopção. Receio não ter certeza de quais são as unidades, e qual direção é positiva, e a ajuda não está disponível sobre o assunto, mas é aí que você deseja procurar.
Darael


Você encontrou uma solução permanente para esse problema? Atualmente, estou usando a solução para alternar entre o A2DP / HSP / A2DP, mas não é prático continuar fazendo isso sempre que ocorrer um problema de sincronização.
Fred Wuerges

Respostas:


37

Não, isso não é normal, mas ocasionalmente tive um problema semelhante com os meus alto-falantes Altec Lansing iMT525 Bluetooth. Algo semelhante em conceito à resposta de Sri quase sempre funciona para mim, e eu preciso fazer isso apenas uma vez por conexão.

Troca automática de perfis Bluetooth para reinicializar o PulseAudio

Se você está procurando um culpado, eu procuraria primeiro o sistema de som do Ubuntu, PulseAudio, e depois o seu receptor bluetooth. Tente o seguinte:

  • Primeiro, exclua e emparelhe seu dispositivo Bluetooth.

  • Em seguida, copie e cole o texto abaixo em um .sharquivo no diretório inicial, diga /home/brillout/pabluezswitch.sh:

    #! / bin / bash
    BLUEZCARD = `pactl list cards short | egrep -o bluez. * [[: space:]] ` pactl set-card-profile $ BLUEZCARD a2dp pactl set-card-profile $ BLUEZCARD hsp pactl set-card-profile $ BLUEZCARD a2dp
  • Torne o arquivo executável abrindo um terminal e digitando chmod +x ~/pabluezswitch.sh

  • Vá para Configurações ... Teclado ... Atalhos e crie um atalho personalizado; nomeie como quiser, com o comando como /home/brillout/pabluezswitch.sh(substitua o nome de usuário apropriado no caminho!). Clique em Aplicar e clique à direita, onde diz Desativado, para configurar um atalho de teclado para executar o script.

O que isso faz é forçar o sistema PulseAudio a ressincronizar o áudio que está sendo enviado aos seus fones de ouvido / alto-falantes, trocando os perfis ad2p -> hsp -> a2dp, assim, esperançosamente, eliminando qualquer latência.


Sempre que você conectar e perceber o atraso, pressione o atalho de teclado escolhido acima para tentar corrigir a latência - espero que funcione para você!


Estou usando isso há alguns dias e funciona muito bem. # 14.04
dpb

7
Observe que o pactl possui terríveis mensagens de erro e que muitos equipamentos de áudio não possuem essas ad2pe hsp. Meu Bose só tem ad2p_sink, não esses outros dois.
odinho - Velmont

1
Acho que você precisa aspas em torno esse padrão egrep
naught101

1
Suponho que não haja uma maneira de monitorar a latência e disparar esse script automaticamente quando exceder algum limite acima da referência? pacmd info | grep "current latency"e pacmd statparecem fornecer os mesmos números de latência / tamanho do buffer, independentemente do tamanho da latência real (por exemplo, ao tirar o fone de ouvido do alcance e trazê-lo de volta), talvez uma parte diferente da pilha seja responsável pela latência?
Ponkadoodle 10/08/16

2
@ odinho-Velmont alternando entre ad2p_sinke offfunciona para mim. Eu recentemente aded isso para o meu script de controle de áudio Pulso / volume que possa ser útil a alguém
Sam Mason

21
  • Instale o pavucontrol: sudo apt install pavucontrol
  • Executar a pavucontrolpartir do menu
  • Vá para Dispositivos de saída
  • Ir para dispositivo bluetooth
  • Vá para Avançado
  • Lá, você pode definir o deslocamento da latência para o valor em milissegundos (mais ou menos). Para garantir o valor, você precisa começar com qualquer valor, por exemplo, 250,00 mi.
  • Reproduza qualquer "teste de sincronização de áudio" do YouTube e defina a velocidade de reprodução para 0,25 (aumente a velocidade) e a partir daí você poderá começar a perceber se o valor está correto ou precisa ser aumentado ou diminuído.

2
Removido sass desnecessário da resposta - não há necessidade de ser rude. Além disso, isso soa como ele deve funcionar, mas não parece realmente fazer alguma coisa para mim ...
naught101

Para mim, isso funcionou para a reprodução do youtube com alto-falantes bluetooth. Obrigado. Quando abri o pavucontrol, a opção avançada estava oculta. Tinha que expandir verticalmente a janela.
usar o seguinte comando

11

Ocasionalmente, fico com um problema semelhante, independentemente do player usado. O Mine é um fone de ouvido estéreo Nokia BH-503 Bluetooth com laptop MSI CR400 e Ubuntu 11.10. Por acaso encontrei uma solução alternativa que você pode tentar.

  • Inicie a reprodução do vídeo.
  • Vá para Configurações de som> Hardware.
  • Selecione o dispositivo Bluetooth.
  • Em Configurações, no menu suspenso Dispositivo selecionado, alterne para o perfil Telephony Duplex (HSP / HFP) e, em seguida, volte para a Reprodução de alta fidelidade (A2DP).

7

A resposta superior aqui funciona, mas não para todos os dispositivos de áudio bluetooth. Alguns dispositivos têm nomes de perfil diferentes dos que o pôster possui com os alto-falantes bluetooth. Por exemplo, no código a seguir, que foi originalmente publicado por essa pessoa, aparentemente possui perfis nomeados a2dpe hsp. Nenhum deles está disponível nos meus tons LG, por exemplo, mas estão em outros dispositivos, como meu fone de ouvido Sony.

#!/bin/bash

BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp
pactl set-card-profile $BLUEZCARD hsp
pactl set-card-profile $BLUEZCARD a2dp

Esse código funcionará para a maioria dos dispositivos bluetooth, mas para fazê-lo funcionar corretamente nos dispositivos que não possuem o perfil a2dp ou o perfil hsp, digite:

pactl list | grep -Pzo '.*bluez_card(.*\n)*'

Isso retornará tudo depois de onde encontrar um dispositivo bluetooth. Por exemplo, com o fone de ouvido LG Tone Ultra, recebo o seguinte:

Name: bluez_card.B8_AD_3E_**_**_**
    Driver: module-bluez5-device.c
    Owner Module: 36
    Properties:
        device.description = "LG HBS810"
        device.string = "B8:AD:3E:**:**:**"
        device.api = "bluez"
        device.class = "sound"
        device.bus = "bluetooth"
        device.form_factor = "headset"
        bluez.path = "/org/bluez/hci0/dev_B8_AD_3E_**_**_**"
        bluez.class = "0x240404"
        bluez.alias = "LG HBS810"
        device.icon_name = "audio-headset-bluetooth"
        device.intended_roles = "phone"
    Profiles:
        a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes)
        headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: yes)
        off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
    Active Profile: a2dp_sink
    Ports:
        headset-output: Headset (priority: 0, latency offset: 0 usec)
            Part of profile(s): a2dp_sink, headset_head_unit
        headset-input: Headset (priority: 0, latency offset: 0 usec)
            Part of profile(s): headset_head_unit

Estamos interessados ​​na profilesseção. Nesta seção, vemos três perfis, que são a2dp_sink, headset_head_unite off. Os dois perfis que precisamos devem ter neles (A2DP Sink) e (HSP / HFP). Nesse caso, eles são a2dp_sinkpara o perfil a2dp e headsethead_unitpara o perfil hsp. Observe que isso é diferente do pôster original a2dpe hsp.

Agora, com o código acima, vamos modificá-lo e colocá-lo em um arquivo. Eu liguei para o arquivo bluezswitch.sh.

Mude para o diretório em que deseja colocar o arquivo. Pode estar em qualquer lugar.

touch bluezswitch.sh

Então

nano bluezswitch.sh

Copiar e colar o código no topo deste comentário e substituir o a2dpe hspcom os valores que você tem quando você executou o comando acima, e colá-lo no arquivo. Por exemplo, é assim que meu arquivo se parece com os meus LG Tones.

#!/bin/bash

BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-card-profile $BLUEZCARD headset_head_unit
pactl set-card-profile $BLUEZCARD a2dp_sink

Agora, ctrl-xem seguida, ypara salvar o nano arquivo e saia, e, em seguida, tornar o arquivo executável:

chmod +x bluezswitch.sh

Em seguida, prossiga configurando um atalho de teclado, conforme explicado.

Vá para Configurações ... Teclado ... Atalhos e crie um atalho personalizado; nomeie como quiser, com o comando como /home/brillout/bluezswitch.sh (substitua o nome de usuário apropriado no caminho!). Clique em Aplicar e clique à direita, onde diz Desativado, para configurar um atalho de teclado para executar o script.

Isso deve ser tudo o que existe. Isso deve funcionar para todos aqueles para os quais não funcionava antes.


1
Para mim, desligando a2dp_sink, off, a2dp_sinkem obras seqüência muito bem para mim. Configurando para headset_head_uniterro de E / S.
Mohd Shahril

5

A modulação adaptativa do código de pulso diferencial envolve um algoritmo de compressão do tipo antecipado, em que as informações não podem ser transmitidas antes que o codificador tenha a chance de examinar vários bytes de informações futuras. Portanto, os dados precisam se acumular no codificador, e há uma mudança de tempo inerente entre os fluxos que entram e saem do codificador. Há muito tempo, fiz um estudo de atrasos na rede de dados para determinar a viabilidade da telefonia de voz sobre dados (o que é agora o VoIP). Acho que concluí que a compactação / codificação no estilo ADPCM apresentaria muito atraso. Penso que para ultrapassar este problema de atraso do Bluetooth, pode ser necessário um tipo de codificação de áudio sem compressão, que deve ter uma latência mais baixa.


6
O problema da compressão seria responsável por algumas dezenas de milissegundos, e não meio segundo, com certeza?
precisa saber é o seguinte

4

Tentei várias abordagens para esse problema, mas nada poderia corrigi-lo. Então eu tropecei em set-port-latency-offset

Se você estiver usando o pulseaudio, faça:

pactl list cards short | egrep -o bluez.*[[:space:]]

Isso lhe dará a interface bluetooth. Agora defina a latência de acordo:

pactl set-port-latency-offset <INTERFACE> speaker-output 100000

Estou usando 100000 microssegundos, o que funciona bem para mim.


1
Para qualquer pessoa que tropeçar neste post antigo procurando uma resposta, a resposta de Arindam Mani Das funciona perfeitamente. Se você receber o erro "não existe tal entidade", execute 'pactl list cards' e verifique quais portas estão disponíveis para o seu dispositivo. Eu tive que mudar "saída do alto-falante" para "saída do fone de ouvido" no segundo comando, pois meu dispositivo não possui uma porta de saída de alto-falante.
Billy Farrington

1

Aqui está o que o resolveu para mim: $ sudo apt-get install phonon-backend-vlce verifique se é o back-end preferido, no KDE, vá para [Configurações do sistema] [Multimídia] [Configurações de áudio e vídeo] [Back-end] e use o [botão Preferir]


1
@ Dargaud Eu recomendo expandir isso para explicar como torná-lo o back-end preferido.
Eliah Kagan

0

pessoas que estão tendo esse problema Consulte este site: http://projectzeorymer.wordpress.com/2011/09/01/ubuntu-how-to-connect-nokia-bh-503-bluetooth-headset-to-your-pc / para ver uma foto do que você precisa baixar.

Faça o download do gerenciador de bluetooth e use-o para manipular as configurações do fone de ouvido. Defina as configurações de som como Reprodução de alta fidelidade (A2DP) e, em seguida, vá nas configurações de som.


1
Vá em Bluetooth gerenciar e ir ao perfil de áudio e selecione Reprodução alta Fedelity .. que é ele
Alex Força

0

No VLC media player, vá para a guia Ferramentas Sincronizar faixa de sincronização Na faixa Sincronizar faixa de áudio / vídeo, use um valor negativo como cerca de -0,67 e o atraso será totalmente compensado. Você deve fazer isso manualmente sempre que abrir um novo arquivo. Chris


0

Da mesma forma que a resposta de Timm, eu também não tinha os perfis da resposta aceita. A configuração do HSP deu um código de erro.

Acabei usando o seguinte script, quase idêntico.

#!/bin/bash
BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-card-profile $BLUEZCARD off
pactl set-card-profile $BLUEZCARD a2dp_sink

0

Parece que esse problema ainda é relevante depois de todos esses anos.

Com base na resposta de Arindam Mani Das e no comentário de Billy Farrington , criei o seguinte shell script:

#!/bin/bash
export BLUEZCARD=`pactl list cards short | egrep -o bluez.*[[:space:]]`
pactl set-card-profile $BLUEZCARD a2dp_sink
pactl set-port-latency-offset $BLUEZCARD headphone-output 100000

Estou usando 100000 microssegundos como o Arindam recomendou e também funciona bem para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.