![尝试将音频从 mpd 发送到 pulseaudio 时出现“无法打开音频输出”错误](https://linux22.com/image/976435/%E5%B0%9D%E8%AF%95%E5%B0%86%E9%9F%B3%E9%A2%91%E4%BB%8E%20mpd%20%E5%8F%91%E9%80%81%E5%88%B0%20pulseaudio%20%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E6%97%A0%E6%B3%95%E6%89%93%E5%BC%80%E9%9F%B3%E9%A2%91%E8%BE%93%E5%87%BA%E2%80%9D%E9%94%99%E8%AF%AF.png)
当我尝试通过 pulseaudio 播放 mpd 时,mpd.log 报告:
pulse_output:无法启用“Pink ROCKI” [pulse]:pa_context_connect() 失败:连接被拒绝
- Pulse 似乎工作正常,因为 pacmd list-sinks 显示我所有的脉冲接收器,meb 浏览器音频可以通过默认接收器正常播放,并且 VLC 可以通过其中任何一个播放声音。
- 如果我通过 alsa 而不是 pulse 发送输出,mpd 可以正常工作
- mpd 和 pulseaudio 都在我的帐户(fred)下运行。
- fred、mpd 和 pulseaudio 都是 pulse、pulse-access 和 audio 组的成员。
- 我甚至尝试过使用不同版本的 pulseaudio:Ubuntu 14.04 自带的 4.0,实验性 RAOP2使用 pulse 4.0 构建,以及使用 pulse 5.0 构建的实验性 RAOP2。mpd 无法与它们中的任何一个一起使用。
我的 mpd.conf 文件是原始的;脉冲部分是通用的:
audio_output {
type "pulse"
name "General Pulse"
}
尽管正如 laugeo 在下面所建议的那样,我也尝试指定一个单独的水槽,两者都按名称:
audio_output {
type "pulse"
name "ROCKI"
sink "raop_output.ASAP1826T.local"
}
并按索引编号:
audio_output {
type "pulse"
name "ROCKI"
sink "4"
}
下一步我应该尝试什么?将 pulseaudio 配置为作为系统服务运行是否有帮助?
这是在 Ubuntu 14.04、pulseaudio 4.0(和 5.0)、音乐播放器守护进程 0.18.7 上
更新: 我发现这个博客博主 Louiz 似乎已经解决了相同(或非常相似)的问题:
MPD 似乎试图以我自己的用户身份生成一个新的 pulseaudio 进程,但由于该进程已在运行,因此失败。我不明白为什么它不能直接使用现有的 pulseaudio 实例,而不尝试生成新的实例。
我明白了,感谢这个帖子。
MPD 找不到已经运行的 pulseaudio 实例,因为未设置环境变量 XDG_RUNTIME_DIR,而 pulseaudio 在其中存储其文件(套接字、进程 pid 等)。
我尝试了他的解决方案:
创建一个新文件 /etc/systemd/system/mpd.service.d/fixenv.conf,其中包含:
[服务] 环境=XDG_RUNTIME_DIR=/run/user/1000
(将 1000 替换为您用户的 UNIX ID。)
我重新启动了,并且 XDG_RUNTIME_DIR 设置正确,并且 pulse 将其 pid 文件放在 /run/user/1000/pulse/ 目录中(我的用户 id 是 1000),但是我仍然从 mpd 收到相同的错误:
pulse_output:无法启用“ROCKI” [pulse]:pa_context_connect() 失败:连接被拒绝
我每天都在学习更多关于 Linux 的知识,但是套接字、进程 pid、systemd(Ubuntu 不是应该使用 upstart 吗?systemd 似乎正在运行和启动一些东西)等都超出了我的能力范围——我迷失了方向。
答案1
最后,比 pulseaudio 守护进程模式更好的解决方案是那里:它是关于以您自己(而不是 mpd 用户)的身份运行 mpd,因此您可以毫无问题地使用自己的会话 pulseaudio。
答案不同,但经过测试并且有效:
配置 pulseaudio 以“守护进程模式”而不是标准“用户模式”运行
- 在终端中,运行
sudo gedit /etc/init/pulseaudio.conf
然后取消注释第 20 行并删除#
以获得:
start on runlevel [2345]
保存并退出 gedit。 - 在终端中运行这两个命令:
sudo usermod -aG pulse,pulse-access mpd
sudo usermod -aG pulse,pulse-access your-login
在第二个命令中,替换“your-login”
现在重新启动:希望它能够起作用。
注意:有关信息,页列出了为什么必须避免使用 pulseaudio 守护进程模式的原因,但我发现它在单个用户电脑上没问题(特别是我看到的 CPU/内存使用率没有比用户模式高)。
答案2
XDG_RUNTIME_DIR 解决方案对我有用,但不需要在 /etc/systemd/system 中创建文件。只需在 /etc/init.d/mpd 中添加此行:
export XDG_RUNTIME_DIR=/run/user/1000
我已经在 /etc/mpd.conf 中指定 mpd 以我自己的用户和“audio”组身份运行。
答案3
您可以尝试在 MPD 配置文件中指定 pulseaudio 接收器:
要显示 pulseaudio 接收器,请在终端中运行以下命令:
pactl list short sinks
它将输出类似以下内容的内容:
0 alsa_output.pci-0000_00_03.0.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz IDLE
1 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
选择您的主接收器(在我的情况下是第二个,因为我没有 HDMI 声音)并将其名称复制到 mpd.conf audio_output 中:
音频输出 {
type "pulse"
name "MPD PulseAudio Output"
sink "alsa_output.pci-0000_00_1b.0.analog-stereo"
}