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


49

如标题中所述,在通过带有A2DP的蓝牙播放音频时,我会经历半秒的延迟。
由于声音与视频不同步,因此无法观看电影。

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

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


9
解决方案不是解决问题的真正方法,而是一种解决方法:如果仅是关于播放电影,则可以调整音频/视频偏移,这也会延迟视频。使用和mplayer,您可以按+-键。在VLC中,我不知道如何设置延迟,但是如果VLC没有这样的选项,我会感到惊讶。
leemes 2012年

我曾考虑过这一点,但是却没有YouTube的解决方案。使用HTML5播放视频时,一种解决方案是安装用于设置视频偏移量的浏览器扩展程序。但是对于视频播放Flash的情况,我不确定如何实现。
brillout 2012年

顺便说一句,VLC选项位于Tools->Track Synchronisation,或与该--audio-desync选项一起使用。恐怕我不确定这些单位是什么,哪个方向是正向的,在这件事上没有帮助,但这就是您要查找的地方。
Darael


您是否找到了永久解决此问题的方法?我目前正在使用该解决方案在A2DP / HSP / A2DP之间进行切换,但是每次同步问题时都不要这样做。
Fred Wuerges's

Answers:


37

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

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

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

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

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

    #!/ bin / bash
    BLUEZCARD =`pactl卡片清单简短| egrep -o bluez。* [[:: space:]]` pactl设置卡配置文件$ BLUEZCARD a2dp pactl设置卡配置文件$ BLUEZCARD hsp pactl设置卡配置文件$ BLUEZCARD a2dp
  • 通过打开终端并键入来使文件可执行 chmod +x ~/pabluezswitch.sh

  • 转到“设置...键盘...快捷方式”,然后创建一个自定义快捷方式;使用命令将其命名为任意名称/home/brillout/pabluezswitch.sh(在路径中替换适当的用户名!)。单击“ 应用”,然后在显示“ 已禁用”的右侧单击,以设置键盘快捷方式来执行脚本。

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


每当您连接并注意到延迟时,都应按上面选择的键盘快捷键来尝试解决延迟-希望它对您有用!


我已经使用了几天了,效果很好。- 14.04
DPB

7
请注意,pactl具有严重的错误消息,并且许多音频设备没有这些ad2phsp。我的Bose只有一个ad2p_sink,而其他两个没有。
odinho-Velmont,2016年

1
我认为你需要周围的egrep的格局报价
naught101

1
我不认为有一种方法可以监视延迟并在超出参考值的某个阈值时自动触发此脚本?pacmd info | grep "current latency"并且pacmd stat无论实际延迟增加多少(例如,将耳机移出范围并放回原处)时,似乎都给出相同的延迟数/缓冲区大小,那么延迟中可能由堆栈的不同部分负责吗?
Ponkadoodle

2
@ odinho-Velmont在ad2p_sink和之间切换并off为我工作。我最近将此添加到我的Pulse音频/音量控制脚本中,该脚本可能会对某人有所帮助
Sam Mason

21
  • 安装pavucontrol: sudo apt install pavucontrol
  • pavucontrol从菜单运行
  • 转到输出设备
  • 转到蓝牙设备
  • 转到高级
  • 您可以在此处将等待时间偏移量设置为以毫秒为单位的值(正负)。为了确保该值,您需要以任何值开头,例如250.00 mi。
  • 播放YouTube上的任何“音频同步测试”,然后将播放速度设置为0.25(使其变慢),然后您就可以开始注意该值是否正确或需要增加或减小。

2
从答案中删除了不必要的无礼-无需粗鲁。同样,这听起来像应该起作用,但实际上对我没有任何作用……
naught101 '16

对我来说,这适用于使用蓝牙扬声器的youtube播放。谢谢。当我第一次打开pavucontrol时,高级选项被隐藏了。必须垂直扩展窗口。
user75505

11

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

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

7

此处的最高答复有效,但不适用于每个蓝牙音频设备。某些设备的配置文件名称与海报使用其蓝牙扬声器的配置文件名称不同。例如,在最初由该人发布的以下代码中,它显然具有名为a2dp和的配置文件hsp。例如,我的LG Tones都不提供这些功能,但我的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

该代码将适用于它显示的大多数蓝牙设备,但是要使这些代码正确地用于那些没有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_sink用于a2dp配置文件和headsethead_unithsp配置文件。请注意,这与原始海报的a2dp和不同hsp

现在,使用上面的代码,我们将对其进行修改并将其放入文件中。我叫这个文件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

然后按照说明进行操作,然后设置键盘快捷键。

转到“设置...键盘...快捷方式”,然后创建一个自定义快捷方式;使用/home/brillout/bluezswitch.sh命令将其命名为任意名称(在路径中替换相应的用户名!)。单击“应用”,然后在显示“已禁用”的右侧单击,以设置键盘快捷方式来执行脚本。

那应该就是它的全部了。这应该适用于以前从未使用过的所有功能。


1
对我来说,关闭a2dp_sinkoffa2dp_sink顺序都非常好,我。设置为headset_head_unitI / O错误。
Mohd Shahril

5

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


6
压缩问题肯定会占几十毫秒,而不是半秒?
naught101 '16

4

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

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

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

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

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

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


1
对于在此旧帖子中搜寻答案的任何其他人,Arindam Mani Das的答案都非常有效。如果收到“没有这样的实体”错误,请运行“ pactl列表卡”并检查哪些端口可用于您的设备。由于我的设备没有扬声器输出端口,因此我必须在第二个命令中将“扬声器输出”更改为“耳机输出”。
比利·法灵顿

1

这是为我解决的问题:$ sudo apt-get install phonon-backend-vlc并确保它是首选的后端,在KDE中转到[系统设置] [多媒体] [音频和视频设置] [后端],然后使用[首选按钮]


1
@dargaud我建议将其扩展以解释如何使其成为首选后端。
伊利亚·卡根

0

遇到此问题的个人,请访问此网站:http : //projectzeorymer.wordpress.com/2011/09/01/ubuntu-how-to-connect-nokia-bh-503-bluetooth-headset-to-your-pc /以查看您需要下载的图片。

下载蓝牙管理器,并使用它来管理耳机的设置。将声音设置设置为“高保真播放(A2DP)”,然后进入声音设置。


1
进行蓝牙管理并转到“音频配置文件”,然后选择“高逼真度播放”。多数民众赞成
Alex Force

0

在VLC媒体播放器上,转到“工具”。轨道同步“同步”选项卡在“音频/视频音频轨道同步”下,使用大约-0.67之类的负值,并且将完全补偿滞后。每次打开新文件时,都必须手动执行此操作。克里斯


0

与Timm的答案类似,我也没有接受的答案的简介。设置HSP会给出错误代码。

我最终使用了以下几乎相同的脚本。

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

这些年来似乎仍然与这个问题有关。

基于Arindam Mani Das的回答和Billy Farrington的评论,我创建了以下shell脚本:

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

我正在按照Arindam的建议使用100000微秒,这对我也很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.