使用 A2DP 通过蓝牙播放音频时摆脱 0.5 秒的延迟

bri*_*out 63 pulseaudio bluetooth

如标题中所述,在使用 A2DP 通过蓝牙播放音频时,我遇到了半秒的延迟。
这使得无法观看电影,因为声音与视频不同步。

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

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

ish*_*ish 42

不,这不正常,但我的 Altec Lansing iMT525 蓝牙扬声器偶尔会遇到类似问题。与 Sri 的回答在概念上类似的东西几乎总是对我有用,而且每次连接我只需要做一次。

自动切换蓝牙配置文件以重新初始化 PulseAudio

如果您正在寻找罪魁祸首,我会先查看 Ubuntu 的声音系统、PulseAudio,然后再查看您的蓝牙接收器。尝试这个:

  • 首先,删除并重新配对您的蓝牙设备。

  • 然后,将以下内容复制并粘贴到.sh您的主目录中的文件中,例如/home/brillout/pabluezswitch.sh

#!/bin/bash
bluezcard=$(pactl list cards short | awk '/bluez/{print $2}')
pactl set-card-profile "$bluezcard" a2dp
pactl set-card-profile "$bluezcard" hsp
pactl set-card-profile "$bluezcard" a2dp
Run Code Online (Sandbox Code Playgroud)
  • 通过打开终端并键入来使文件可执行 chmod +x ~/pabluezswitch.sh

  • 转到Settings...Keyboard...Shortcuts,并创建自定义快捷方式;将它命名为您想要的任何名称,命令为/home/brillout/pabluezswitch.sh(在路径中替换适当的用户名!)。单击Apply,然后单击右侧的Disabled以设置执行脚本的键盘快捷键。

这样做是强制 PulseAudio 系统通过从 切换配置文件来重新同步发送到您的耳机/扬声器的音频ad2p -> hsp -> a2dp,从而有望消除任何延迟。


每当您连接并注意到延迟时,您应该按下上面选择的键盘快捷键以尝试修复延迟 - 希望它对您有用!

  • 请注意 pactl 有可怕的错误消息,而且许多音频设备没有这些 `ad2p` 和 `hsp`。我的 Bose 只有 `ad2p_sink`,没有其他两个。 (11认同)
  • @odinho-Velmont 在 `ad2p_sink` 和 `off` 之间切换对我有用。我最近将此添加到我的 [Pulse 音频/音量控制脚本](https://github.com/smason/dotfiles/blob/master/bin/pulse-volume.py) 中,这可能对某人有所帮助 (2认同)
  • 这似乎已经过时了,不适用于最新的 Linux Mint。“pavucontrol”是 2020/2021 年底更好的答案 (2认同)

小智 30

  • 安装 pavucontrol: sudo apt install pavucontrol
  • pavucontrol从菜单运行
  • 转到输出设备
  • 在蓝牙设备下,打开高级菜单
    • 在那里您可以将延迟偏移设置为以毫秒为单位的值(正负)。要确定您需要从任何值开始的值,例如 250.00 ms。
    • 从 YouTube 播放任何“音频同步测试”并将播放速度设置为 0.25(使其变慢),然后您可以开始注意该值是否正确或需要增加或减少。

  • 从答案中删除了不必要的 sass - 无需粗鲁。另外,这听起来应该可行,但实际上似乎对我没有任何作用...... (5认同)
  • 这确实有效。我相信这现在应该是公认的答案,因为不需要每次连接都重复操作...... (2认同)

Sri*_*Sri 12

无论使用何种播放器,我偶尔都会遇到类似的问题。我的是带有 MSI CR400 笔记本电脑和 Ubuntu 11.10 的诺基亚 BH-503 蓝牙立体声耳机。我碰巧遇到了一个您可以尝试的解决方法。

  • 开始播放视频。
  • 转到声音设置 > 硬件。
  • 选择蓝牙设备。
  • 然后在所选设备的设置下拉菜单中,切换到电话双工 (HSP/HFP) 配置文件,然后切换回高保真播放 (A2DP)。


PoD*_*uck 11

此处的最高回复有效,但不适用于每个蓝牙音频设备。某些设备的配置文件名称与海报上的蓝牙扬声器名称不同。例如,在最初由该人发布的以下代码中,它显然具有名为a2dp和 的配置文件hsp。例如,这些都不适用于我的 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
Run Code Online (Sandbox Code Playgroud)

该代码适用于它出现的大多数蓝牙设备,但要使其在没有 a2dp 配置文件或 hsp 配置文件的设备上正常工作,请输入:

pactl list | grep -Pzo '.*bluez_card(.*\n)*'
Run Code Online (Sandbox Code Playgroud)

这将在找到蓝牙设备后返回所有内容。例如,使用 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
Run Code Online (Sandbox Code Playgroud)

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

现在,有了上面的代码,我们将对其进行修改并将其放入一个文件中。我调用了文件bluezswitch.sh

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

touch bluezswitch.sh
Run Code Online (Sandbox Code Playgroud)

然后

nano bluezswitch.sh
Run Code Online (Sandbox Code Playgroud)

复制和粘贴代码在此评论的最顶端和更换a2dp,并hsp与价值观你有当您运行上面的命令,并将其粘贴在该文件中。例如,这就是我的 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
Run Code Online (Sandbox Code Playgroud)

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

chmod +x bluezswitch.sh
Run Code Online (Sandbox Code Playgroud)

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

转到设置...键盘...快捷方式,并创建自定义快捷方式;将它命名为您想要的任何名称,命令为 /home/brillout/bluezswitch.sh(在路径中替换适当的用户名!)。单击“应用”,然后单击“禁用”的右侧以设置执行脚本的键盘快捷键。

这应该就是全部了。这应该适用于所有以前不起作用的人。

  • 对我来说,依次关闭 `a2dp_sink`、`off`、`a2dp_sink` 对我来说非常有效。设置为 `headset_head_unit` I/O 错误。 (2认同)

小智 10

我尝试了很多方法来解决这个问题,但没有任何方法可以解决它。然后我偶然发现了set-port-latency-offset

如果您使用的是pulseaudio,请执行以下操作:

pactl list cards short | egrep -o bluez.*[[:space:]]
Run Code Online (Sandbox Code Playgroud)

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

pactl set-port-latency-offset <INTERFACE> speaker-output 100000
Run Code Online (Sandbox Code Playgroud)

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

  • 对于偶然发现这篇旧帖子寻找答案的其他人来说,Arindam Mani Das 的答案非常有效。如果您收到“没有这样的实体”错误,请运行“pactl listcards”并检查哪些端口可用于您的设备。由于我的设备没有扬声器输出端口,因此我不得不在第二个命令中将“扬声器输出”更改为“耳机输出”。 (3认同)

小智 7

自适应差分脉冲编码调制涉及一种前瞻型压缩算法,其中在编码器有机会检查即将到来的信息的几个字节之前,信息无法传输。因此,数据必须在编码器中堆积,并且在进入和离开编码器的流之间存在固有的时间偏移。很久以前,我对数据网络延迟进行了研究,以确定数据语音电话(现在是 VoIP)的可行性。我想我的结论是 ADPCM 风格的压缩/编码会引入太多延迟。我认为要克服这个蓝牙延迟问题,人们可能需要一种非压缩类型的音频编码,它应该具有较低的延迟。

  • 压缩问题肯定会占几十毫秒,而不是半秒吗? (6认同)