![为什么pulseaudio 处理与 BT 设备的音质连接?](https://linux22.com/image/50496/%E4%B8%BA%E4%BB%80%E4%B9%88pulseaudio%20%E5%A4%84%E7%90%86%E4%B8%8E%20BT%20%E8%AE%BE%E5%A4%87%E7%9A%84%E9%9F%B3%E8%B4%A8%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
我是 Linux 新手,也是蓝牙脚本新手。到目前为止我发现的内容如下:
- Bluez 是默认的 BT 堆栈。
- BluezTools 是一组实用程序,您可以使用它们更轻松地与 Bluez 交互
- DBus 是 Bluez 在直接与硬件交互时连接的接口。
- PulseAudio 是负责在系统上生成音频的子系统。
这是有道理的。假设我有一套蓝牙耳机,我期望的是(在配对和信任之后)能够发出可以直接连接到 BT 耳机上的某个配置文件的命令。
我想到的技术路径是这样的:
- 打开耳机。
- 发出 BluezTools 命令 - 例如bt 音频 -c
- 等待设备连接到我想要的服务
- PulseAudio 现在应该选择一个新的输出设备
- 发出另一个命令将音频从原来的音频更改为新的输出音频(BT 耳机)。
- 享受无缝的聆听体验。
这一切看起来都很合乎逻辑,但实际的实现并不是这样的,我正在寻找为什么,这样我可以更好地理解问题并尝试解决它。
这是实际发生的情况:
- 打开耳机。
- 发出 BluezTools 命令 - 例如bt 音频 -c
- 等待设备连接到我想要的服务
- PulseAudio 现在应该选择一个新的输出设备
- 发出 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 系统上进行了测试),尽管我不知道为什么我需要遵循这些确切的步骤:
初始步骤:
- 安装蓝人:须藤 apt-get 安装 blueman
- 编辑蓝牙文件:须藤纳米 /etc/bluetooth/main.conf并在末尾添加这一行:禁用=耳机
对于每次运行:
- 重新启动蓝牙服务:sudo服务蓝牙重启
- 在系统托盘中打开 blueman 中的设备或者类型蓝人经理在终端
- 搜索对于您的蓝牙音频设备
- 右键单击您的设备并连接为耳机
- 去声音从系统设置
- 单击一次选择您的设备
- 现在再次转到蓝人经理
- 右键单击您的蓝牙设备并将音频配置文件设置为高保真播放(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