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

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

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

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

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

我想到的技术路径是这样的:

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

这一切看起来都很合乎逻辑,但实际的实现并不是这样的,我正在寻找为什么,这样我可以更好地理解问题并尝试解决它。

这是实际发生的情况:

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

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

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

bt-音频-c 高保真度配置文件

或者

bt-audio-changeProfile 高保真度配置文件

相反,Bluez 似乎只处理与设备的 RAW 连接,从那里您需要发出:pacmd 设置卡配置文件 $INDEX a2dp

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

我缺少什么?为什么无法使用 Bluez / BluezTools 等直接连接到某个配置文件?

答案1

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

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

因此,PulseAudio 相当深入地参与蓝牙音频处理是有道理的:中间层越多,数据被缓冲而不保持准确反馈的可能性就越大,从而导致口型同步丢失。

事实上,在 PulseAudio 出现之前,曾经有一个用于蓝牙音频的 ALSA 后端,但它已被弃用。我认为问题在于当时 ALSA 的接口主要是为传统声卡设计的,处理蓝牙潜在可变的音频延迟很困难。

PulseAudio 的接口是从头开始设计的,可以处理各种声音设备,甚至可以在播放流时在它们之间切换音频流,所以在我看来,它也有一个非常先进的内置音频延迟概念。

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

答案2

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

初始步骤:

  1. 安装蓝人:须藤 apt-get 安装 blueman
  2. 编辑蓝牙文件:须藤纳米 /etc/bluetooth/main.conf并在末尾添加这一行:禁用=耳机

对于每次运行:

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

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

编辑:在 Linux Mint 19 中,默认的蓝牙管理器与高保真播放完美配合,根本不需要配置!

答案3

虽然它可能会因您的配置而异,但这里有一些经过充分测试的命令。

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

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

使用同步音频输出时,设置蓝牙 a2p 音频接收器更容易,要设置它,请参阅工具帕普夫斯

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

相关内容