我正在尝试从 Raspberry Pi 4 上托管的网络服务器在蓝牙扬声器上启动音频文件。
我将 PulseAudio 与该pulseaudio-module-bluetooth
模块一起使用。
我可以通过该帐户在蓝牙扬声器上播放音乐pi
,但我没有成功使其与www-data
用户帐户(网络服务器使用的帐户)一起使用。
这是当我从两个帐户列出 PulseAudio 设备时看到的内容:
(蓝牙设备在 pi 帐户中可见,但在 www-data 帐户中不可见)
在深入研究问题时,我发现一些模块是为 加载的pi
,但不是为该www-data
帐户加载的。
我尝试手动加载它们,但出现此错误:
raspberrypi pulseaudio[384]: E: [pulseaudio] module.c: Module "module-bluez5-discover" should be loaded once at most. Refusing to load.
raspberrypi pulseaudio[384]: E: [pulseaudio] module.c: Failed to load module "module-bluetooth-discover" (argument: ""): initialization failed.
这是有道理的,因为该模块已经为 pi 帐户加载了。
我不明白加载的模块有何不同,因为系统上只有一个 PulseAudio 服务实例在运行,对吧?
不管怎样,也许模块上的这种差异与我的问题无关,但我发现提及它很有用。
服务配置如下所示:
[Unit]
Description=PulseAudio Daemon
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
PrivateTmp=true
ExecStart=/usr/bin/pulseaudio --system --realtime --disallow-exit --no-cpu-limit
我做了什么来尝试解决这个问题:
- 我添加到
www-data
以下组中:audio
、bluetooth
、pulse
和pulse-access
- 我定义了一个
$HOME
文件夹,www-data
并将该/home/pi/.config/pulse
文件夹复制到该www-data
$HOME
文件夹中。
你有什么想法让它发挥作用吗?
谢谢
答案1
我认为主要问题是两个用户都试图控制声卡/声卡驱动程序。这是因为默认的 PulseAudio 服务只是尝试创建主守护程序。
根据我之前的评论,Arch Linux wiki 有一篇关于允许多个用户同时使用PulseAudio。
上例的目标是让一个用户创建主守护进程,其他 PA 用户连接到该守护进程,从而共享一个主会话。这样看,您有一个人拥有一间带扬声器的音乐工作室 - 而其他人则租用它通过这些扬声器播放音乐。但必须有人来控制设置。 PA 可以处理相当多的客户端,它也可以基于 TCP/UDP,并充当跨多个 Raspberry Pi 的 Sonos 设置;)
为了解决这个多租户问题,为pi
用户创建一个脉冲配置:(如果您已经有default.pa
in ,请跳过~/.config/pulse/
)
sudo cp /etc/pulse/default.pa ~/.config/pulse/default.pa
sudo chown pi:pi ~/.config/pulse/default.pa
通过将以下内容添加到配置底部来修改pi
脉冲配置:~/.config/pulse/default.pa
load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket
在www-data
主目录中,创建/编辑~/.config/pulse/client.conf
并添加以下内容:
default-server = unix:/tmp/pulse-socket
这将指示pi
在 上创建一个 PulseAudio 套接字/tmp/pulse-socket
,并依次指示www-data
连接到该套接字而不是生成一个新套接字。
请注意,套接字需要被两个用户访问,并且在您的情况下,它/tmp
通常是世界可写的。这可能太多了,在这种情况下,将套接字移动到只有两个用户可以访问的地方。