PulseAudio 上的 A2DP - 可怕的断断续续/跳过音频

Naf*_*Kay 33 sound pulseaudio bluetooth realtime

我已将蓝牙耳机与内置蓝牙芯片的 Ubuntu 12.04 笔记本电脑配对:

lsusb | 蓝牙

Bus 003 Device 003: ID 045e:0745 Microsoft Corp. Nano Transceiver v1.0 for Bluetooth
Run Code Online (Sandbox Code Playgroud)

该设备已配对,在 的帮助下blueman,我已将其作为接收器连接到 PulseAudio。音频确实在 A2DP 模式下出现,但非常断断续续,并且跳到比没有好多少的地步。

我四处阅读,发现有一个涉及调整nicePulseAudio 服务器优先级的修复程序。由于默认情况下,PulseAudio 以每个用户为基础运行,因此我将以下内容添加到我的/etc/security/limits.conf:

*       hard    rtpio   0
*       soft    rtpio   0
@audio  hard    rtpio   20
@audio  soft    rtpio   20
pulse   hard    rtpio   20
pulse   soft    rtpio   20
Run Code Online (Sandbox Code Playgroud)

然后我将自己添加到audio组中,以便能够为pulseaudio流程安排优先级。似乎pulseaudio现在运行的优先级为-11

ps -eo pri,ni,cmd | grep [p]ulse

30 -11 /usr/bin/pulseaudio --start --log-target=syslog
Run Code Online (Sandbox Code Playgroud)

这应该意味着 PulseAudio 以 -11 的优先级运行,这很好。

但是,即使重新启动后,我仍然听到可怕的断断续续的音频。

我应该如何进行?我正在尝试使我购买的这款蓝牙耳机可用。

注意:我已经尝试将此设备与笔记本电脑旁边的 Android 平板电脑配对,并且运行良好,因此它不是无线拥塞,它似乎与 Linux 以某种方式直接相关。

Chr*_*128 62

由于其他答案都不适用于我的系统(2012 MacBook Air 上的 Ubuntu 18.04 LTS),我在德国 ubuntuusers wiki上找到了我的解决方案。德文说明书英文摘要:

断断续续的输出可能是由 A2DP 实现以及它在编码之前如何缓冲声音引起的。对我来说,改变这个缓冲区的大小解决了断断续续的声音问题。您需要执行三个步骤:

  1. 查找有关蓝牙设备的必要信息(连接时!)

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

输出应该是这样的

    Name: bluez_card.28_11_A5_84_B6_F9
    Driver: module-bluez5-device.c
    ...
    Ports:
    speaker-output: Speaker (priority: 0, latency offset: 0 usec, available)
        Part of profile(s): a2dp_sink, headset_head_unit
    speaker-input: Bluetooth Input (priority: 0, latency offset: 0 usec, not available)
        Part of profile(s): headset_head_unit
Run Code Online (Sandbox Code Playgroud)

我们看到缓冲区当前的延迟为 0。在下一步中,您将需要输出的NAMEPORT。在本例中,它们分别是bluez_card.28_11_A5_84_B6_F9speaker-output

  1. 使用以下命令模式将卡的缓冲区大小(延迟)设置为合适的值:

    pactl set-port-latency-offset <NAME> <PORT> <BUFFER_SIZE_MICROSECONDS> 
    
    Run Code Online (Sandbox Code Playgroud)

以下命令的延迟单位是微秒,所以我在这里为我的命令使用了 50 毫秒的缓冲区:

    pactl set-port-latency-offset bluez_card.28_11_A5_84_B6_F9 speaker-output 50000 
Run Code Online (Sandbox Code Playgroud)
  1. 重新启动您的蓝牙服务以应用您的更改

    sudo service bluetooth restart
    
    Run Code Online (Sandbox Code Playgroud)

由于通常没有关于此的文档,您可能必须尝试更高或更低的缓冲区值。许多人在此答案的评论中发布了他们的工作延迟。查看它们以获取有关延迟值的指导。

  • 你值得更多赞!我想提一下,45000 适用于 Macbook Air(2014 年初)和 Bose QC35 (3认同)
  • 对我来说仍然口吃:( (Manjaro) (3认同)
  • 一个小得多的值在大多数情况下都有效,但是在执行诸如检查 chrome 中的元素和更改样式之类的操作时,我不得不将其调高到 64448 以消除跳过。 (3认同)
  • 适用于我的 20.04 LTS,Sennheiser CX400BT 使用 @OleAldric 的延迟 45000 (3认同)
  • 这对我有用(ubuntu 22.04)。knb 下面的方法也有效,并且不涉及命令行命令。 (2认同)

小智 33

编辑 ALSA 配置文件

sudo gedit /etc/modprobe.d/alsa-base.conf
Run Code Online (Sandbox Code Playgroud)

添加行

options snd-hda-intel model=generic
Run Code Online (Sandbox Code Playgroud)

到文件末尾,然后重新启动bluetooth服务:

sudo service bluetooth restart
Run Code Online (Sandbox Code Playgroud)

  • 最后编辑此文件后,您无需重新启动,只需运行`sudo service bluetooth restart` (7认同)
  • 这对我的 BOSE 安静舒适 35 II 扬声器(ubuntu 18.04)非常有效 (2认同)

小智 7

Chris_128 答案对我有用,但对于新手,我会添加一些细节。

对于以下命令的 NAME 和 PORT:

pactl set-port-latency-offset NAME PORT 50000 
Run Code Online (Sandbox Code Playgroud)

键入结果后,您将得到它:

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


Name: bluez_card.5C_FB_7C_0D_0F_EE
Driver: module-bluez5-device.c
Owner Module: 28
Properties:
    ...
Profiles:
    headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
    a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, 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, available)
        Part of profile(s): headset_head_unit, a2dp_sink
    headset-input: Headset (priority: 0, latency offset: 0 usec)
        Part of profile(s): headset_head_unit
Run Code Online (Sandbox Code Playgroud)

NAME 将是“bluez_card.5C_FB_7C_0D_0F_EE”,PORT 将是“耳机输出”

所以就我而言,我的命令是

"pactl set-port-latency-offset bluez_card.5C_FB_7C_0D_0F_EE headset-output 50000"
Run Code Online (Sandbox Code Playgroud)

重启你的蓝牙服务

sudo service bluetooth restart
Run Code Online (Sandbox Code Playgroud)


小智 6

在 MacBook Mini 中作为双启动运行的 Ubuntu 18.04 也存在同样的问题。尝试更改 @ConfirmAndCreateThisAccount 提到的 ALSA 配置。

但这没有用。

所以我使用下面的命令安装了 Blueman

sudo apt-get install blueman
Run Code Online (Sandbox Code Playgroud)

然后我从系统蓝牙设置中断开蓝牙设备并使用 Blueman 重新配对。现在一切都很好。甚至播放/暂停控件也能工作。


knb*_*knb 6

您可以打开搜索栏(Unity 中的 CTRL-D,Gnome 中的 Windows 键)键入“Pulse”或“Volume”。打开 GUI 工具“Pulseaudio Volume Control”,它的图标看起来像旋钮或仪表。

在那里您可以选择您的蓝牙扬声器。单击高级,就像其他答案中建议的那样设置延迟值。45 ms 或 50 ms 似乎对他们有用,但我还没有找到适合我的好值。

附上截图。我的蓝牙音箱叫做 SRS-BTX300。更改延迟值后无需重新启动蓝牙。

在此处输入图片说明

  • 不幸的是,声音延迟偏移不能成为播放视频的解决方案。 (2认同)