当前位置: 首页>>技术教程>>正文


使用A2DP通过蓝牙播放音频时,可以消除0.5秒的延迟

, ,

问题描述

如标题中所述,当使用A2DP通过蓝牙播放音频时,我会遇到半秒钟的延迟。由于声音与视频不同步,因此无法观看电影。

我不确定延迟是由蓝牙标准,A2PD协议,Ubuntu 12.04上的A2DP实现还是Belkin Z73蓝牙接收器引起的。

无论如何,这是正常的滞后吗?有没有办法通过蓝牙播放音频而没有任何明显的延迟?

最佳解决方案

不,这不正常,但偶尔我的Altec Lansing iMT525蓝牙音箱也遇到了类似的问题。与Sri的答案相似的概念几乎总是对我有用,而且每次连接我只需要做一次。

Auto-switching蓝牙配置文件到re-initialize PulseAudio

如果你正在寻找罪魁祸首,我先看看Ubuntu的音响系统,PulseAudio,然后是你的蓝牙接收器。试试这个:

  • 首先,删除和re-pair您的蓝牙设备。

  • 然后,将以下内容复制并粘贴到主目录中的.sh文件中,例如/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

  • 通过打开终端并键入chmod +x ~/pabluezswitch.sh使文件可执行

  • 转到设置…键盘…快捷方式,并创建自定义快捷方式;使用命令/home/brillout/pabluezswitch.sh命名它(在路径中替换相应的用户名!)。单击“应用”,然后单击右侧的“禁用”以设置键盘快捷方式以执行脚本。

这样做是迫使PulseAudio系统通过切换来自ad2p -> hsp -> a2dp的配置文件来重新同步发送到耳机/扬声器的音频,因此希望摆脱任何延迟。


每当您连接并注意滞后时,您应该按上面选择的键盘快捷键来尝试修复延迟 – 希望它适合您!

次佳解决方案

pavucontrol中,我转到输出设备选项卡,然后选择蓝牙设备下方的advanced选项。在那里,您可以将延迟偏移设置为600毫秒。问题解决了。

第三种解决方案

无论玩家使用什么,我偶尔会遇到类似的问题。我的是诺基亚BH-503蓝牙立体声耳机,带有MSI CR400笔记本电脑和Ubuntu 11.10。我偶然遇到了一个你可以尝试的解决方法。

  • 开始视频播放。

  • 转到声音设置>硬件。

  • 选择蓝牙设备。

  • 然后在所选设备drop-down的设置中,切换到电话双工(HSP /HFP)配置文件,然后切换回高保真播放(A2DP)。

第四种方案

这里的顶部回复有效,但不适用于所有蓝牙音频设备。有些设备的配置文件名称与海报与蓝牙音箱的名称不同。例如,在以下由该人最初发布的代码中,它显然具有名为a2dphsp的配置文件。例如,这些都不适用于我的LG Tones,但它们与我的索尼耳机等其他设备一样。

#!/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

该代码适用于它出现的大多数蓝牙设备,但为了使这些设备能够正常运行,而不是那些没有a2dp配置文件或hsp配置文件的设备,请键入:

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

这将在找到蓝牙设备后返回所有内容。例如,使用LG Tone Ultra耳机,我得到了这个:

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

我们对profiles部分感兴趣。在本节中,我们看到三个配置文件,即a2dp_sinkheadset_head_unitoff。我们需要的两个配置文件应该包含在其中(A2DP Sink)和(HSP /HFP)。在这种情况下,它们是a2dp配置文件的a2dp_sink,以及hsp配置文件的headsethead_unit。请注意,这与原始海报的a2dphsp不同。

现在,使用上面的代码,我们将修改它并将其放入文件中。我调用了文件bluezswitch.sh

切换到要放置文件的目录。它可以在任何地方。

touch bluezswitch.sh

然后

nano bluezswitch.sh

复制并粘贴此注释最顶部的代码,并将a2dphsp替换为运行上述命令时获得的值,并将其粘贴到该文件中。例如,这就是我的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

现在,ctrl-x然后y保存文件并退出nano,然后使文件可执行:

chmod +x bluezswitch.sh

然后按照说明设置键盘快捷键进行跟进。

Go to Settings…Keyboard…Shortcuts, and create a custom shortcut; name it whatever you want, with the command as /home/brillout/bluezswitch.sh (substitute appropriate username in path!). Click Apply, and then click on the right where it says Disabled to set up a keyboard shortcut to execute the script.

应该就是它的全部内容。这应该适用于之前不起作用的所有人。

第五种方案

自适应差分脉冲编码调制涉及look-ahead类型的压缩算法,其中在编码器有机会检查即将到来的信息的几个字节之前不能发送信息。因此,数据必须在编码器中堆叠,并且在进入和离开编码器的流之间存在固有的时间偏移。很久以前,我对数据网络延迟进行了研究,以确定voice-over-data电话的可行性(现在是什么VoIP)。我想我的结论是ADPCM-style压缩/编码会引入太多延迟。我认为要克服这个Bluetooth-delay问题,可能需要non-compressing类型的音频编码,它应具有较低的延迟。

第六种方案

我尝试了很多解决这个问题的方法,但没有什么能解决它。然后我偶然发现了set-port-latency-offset

如果你使用的是pulseaudio:

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

这将为您提供蓝牙接口。现在相应地设置延迟:

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

我使用100000微秒,对我来说很好。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2076.html,未经允许,请勿转载。