尝试将音频从 mpd 发送到 pulseaudio 时出现“无法打开音频输出”错误

尝试将音频从 mpd 发送到 pulseaudio 时出现“无法打开音频输出”错误

当我尝试通过 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"

}

相关内容