为什么pulseaudio处理与BT设备的音质连接?


11

我是Linux的新手,也是Bluetooth脚本的新手。到目前为止,我发现的是以下内容:

  1. Bluez是默认的BT堆栈。
  2. BluezTools是一组实用程序,可用于更轻松地与Bluez进行交互
  3. DBus是Bluez与硬件直接交互时所连接的接口。
  4. PulseAudio是负责在系统上产生音频的子系统。

这是有道理的。因此,假设我有一套蓝牙耳机,我期望的是(都在配对和信任之后),以便能够发出可以直接连接到BT耳机上特定配置文件的命令。

我想到的技术路线可能是这样的:

  1. 打开耳机。
  2. 发出BluezTools命令-例如bt-audio -c
  3. 等待设备连接到我要的服务
  4. 现在,PulseAudio应该选择一个新的输出设备
  5. 发出另一个命令,将音频从原来的音频更改为新的输出音频(BT耳机)。
  6. 享受无缝的聆听体验。

这一切似乎合乎逻辑,但是实际的实现方式并非如此,我正在寻找WHY,因此我可以更好地理解问题并尝试解决它。

实际上是这样的:

  1. 打开耳机。
  2. 发出BluezTools命令-例如bt-audio -c
  3. 等待设备连接到我要的服务
  4. 现在,PulseAudio应该选择一个新的输出设备
  5. 发出PulseAudio命令将音频配置文件从电话质量更改为高保真度。

让我对此进行扩展。蓝牙耳机提供2种质量模式(电话和高保真)。只有1个真正适合听音乐。

我希望BT耳机将每种质量模式作为服务公开,对吗?这个假设可能是错误的,但我希望

bt-audio -c highFidelityProfile

要么

bt-audio -changeProfile highFidelityProfile

相反,Bluez似乎只是处理与设备的RAW连接,因此您需要从那里发出:pacmd set-card-profile $ INDEX a2dp

这似乎根本上是错误的。为什么在音频子系统中进行质量控制,从而要求对脉冲或alsa或其他声音子系统进行不同的实现?

我想念什么?为什么无法使用Bluez / BluezTools等直接连接到特定配置文件?

Answers:


3

与简单的有线耳机或扬声器相比,蓝牙连接具有显着的延迟。此外,连接延迟可能会有所不同,具体取决于蓝牙接收器的属性,甚至取决于用户四处移动时的无线电信号强度。

应用程序和PulseAudio之间的接口可以很简单,例如“这里有一些PCM音频数据;可以播放它”。但是它也可能更复杂。像是“这里有一些PCM音频数据;播放并每隔50毫秒告诉我您走了多远,这样我就可以告诉您如果看起来像视频流失去了同步感,请跳过我在玩。哦,您也需要重新采样,因为数据具有您的硬件无法直接支持的采样率。” 在后一种情况下,PulseAudio需要能够从音频设备向应用程序提供一些反馈,以正确确定在任何给定时间实际播放音频数据的距离。

结果,PulseAudio相当深入地参与了蓝牙音频处理是有意义的:介入的层越多,在不保持准确反馈的情况下缓冲数据的可能性就越大,从而导致口形同步丢失。

实际上,在存在PulseAudio之前,曾经有一个用于蓝牙音频的ALSA后端,但已过时了。我认为问题在于,当时的ALSA接口主要是为传统声卡设计的,处理蓝牙的音频延迟可能很困难。

PulseAudio的接口是从头开始设计的,可以处理各种声音设备,甚至在播放流时在它们之间切换音频流,因此在我看来,它也具有内置的音频延迟的高级概念。

是的,它可以在BlueZ中实现,而不是作为PulseAudio模块实现;但是之后,BlueZ必须为应用程序提供音频接口。并且由于PulseAudio希望处理系统上的“所有”音频(以便能够将您当前正在播放的音频从扬声器传输到蓝牙,或者反之亦然),因此它必须与PulseAudio接口无论如何。


2

我想我终于找到了一种解决方案(已在两个Linux Mint系统上进行了测试),尽管我不知道为什么需要遵循以下确切步骤:

初始步骤:

  1. 安装blueman:sudo apt-get安装blueman
  2. 编辑蓝牙文件:sudo nano /etc/bluetooth/main.conf并在最后添加此行:Disable = Headset

对于每次运行:

  1. 重新启动蓝牙服务:sudo服务蓝牙重新启动
  2. 从系统托盘中的blueman打开设备,在终端中键入blueman-manager
  3. 搜索您的蓝牙音频设备
  4. 右键单击您的设备并连接为耳机
  5. 从系统设置转到声音
  6. 单击一次选择您的设备
  7. 现在再次去blueman-manager
  8. 右键单击您的蓝牙设备,然后将“音频”配置文件设置为“ 高保真播放”(A2DP接收器)

如果您错过任何一个步骤,请转到步骤1,然后重试。让我知道这个是否奏效。

编辑:在Linux Mint 19中,默认的蓝牙管理器与High Fidelity Playback完美配合,根本不需要任何配置!


0

尽管它可能会因您的配置而异,但以下是一些经过良好测试的命令。

您需要将设备设置为可信任。可以通过gui完成。

sdptool浏览将提供有关目标设备上可用协议和通道的许多详细信息。

使用同时音频输出时,设置蓝牙a2p音频接收器更容易,要进行设置,请参阅工具paprefs

sudo apt install bluetooth 
sudo apt install bluez bluez-tools
sudo apt install rfkill rfcomm

启动设备,无论如何应为hci0:

sudo hciconfig hci0 up

列出远程设备:

sudo rfkill list

列出蓝牙网络:

hcitool scan

浏览可用的协议:

sdptool browse 43:23:00:02:23:A7

连接设备:

sudo rfcomm connect hci0 43:23:00:02:23:A7

发送文件:

sudo bt-obex -p 43:23:00:02:23:A7 ~/images/tof.png

接收文件:

sudo bt-obex -s /

扫描/等待通道(此处为通道19)上的数据,并将数据写入主文件夹中名为dump的文件中:

sudo apt install bluez-hcidump

hcidump -i hci0 -O 19 -w ~/dump

备选:有时对配对有用:

sudo apt install bluetoothctl

bluetoothctl
power on
connect 43:23:00:02:23:A7
trust 43:23:00:02:23:A7
info 43:23:00:02:23:A7

[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# discoverable on
[bluetooth]# pairable on
[bluetooth]# scan on
[bluetooth]# pair 43:23:00:02:23:A7
[agent]PIN code: ####
[bluetooth]# trust 43:23:00:02:23:A7
[bluetooth]# connect 43:23:00:02:23:A7
[bluetooth]# info 43:23:00:02:23:A7
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.