Fedora 容器中的 Pipewire 音频

mOt*_*tmd 9 audio containers fedora pipewire

从 Fedora 34 开始,pulseaudio 被 Pipewire 取代。我使用脉冲音频插座从容器中获取声音,这是最安全的方法。所以,我现在想设置管道来处理容器中的音频,但我找不到方法......

我现在正在尝试最简单的方法,共享 snd 设备,无需套接字:

启动 fedora 34 容器:

podman run -it --device /dev/snd fedora
Run Code Online (Sandbox Code Playgroud)

创建用户并将其添加到音频组:

useradd usertest -u 1000 -m -p ''

usermod -aG audio usertest
Run Code Online (Sandbox Code Playgroud)

安装页面:

dnf -y install pipewire alsa-utils pulseaudio-utils

systemctl start --user pipewire-pulse.service
Run Code Online (Sandbox Code Playgroud)

当我启动它时,出现 DBUS 错误,因为 DBUS 没有在容器上运行

对于用户,pactl info返回此错误:

连接失败:连接被拒绝
pa_context_connect() 失败:连接被拒绝

或者是否有可能获得类似于带有管道线的脉冲音频插座的东西?

Ale*_*lex 2

我想您不需要在容器中运行成熟的 pipeline 服务器,您只需要安装它即可。它包含您需要的客户端库。如果您的主机上已经运行了 Pipewire 服务器,我们只需从容器连接到它即可。

我需要的正是你想要的(在容器内运行软件,能够通过主机声卡播放声音),这就是我的做法 - /sf/answers/5304311281/

与您的设置有一些小差异:

  • 我正在使用docker,没有podman
  • 在我的测试中,我使用了alpinedocker 镜像,而不是fedora那个

我用 docker image 尝试了一下fedora- 它工作得很好:

  1. 确保将 Pipewire 套接字文件从主机传递到容器。在docker中是这样完成的-v /run/user/1000/pipewire-0:/tmp/pipewire-0
  2. 确保将容器内的 XDG_RUNTIME_DIR 变量设置为指向安装管道套接字文件的位置 ( -e XDG_RUNTIME_DIR=/tmp)
  3. 在容器内安装pipewire(既是客户端又是服务器,但我们只使用它的客户端部分)和pipewire-alsa,它引入了虚拟ALSA设备,用于仅限ALSA的软件
docker run -it -v /run/user/1000/pipewire-0:/tmp/pipewire-0 -e XDG_RUNTIME_DIR=/tmp --rm fedora /bin/sh
yum install pipewire pipewire-alsa alsa-utils
speaker-test
# you should hear a sound here
Run Code Online (Sandbox Code Playgroud)

我唯一不喜欢的是,在 Fedora 中,该pipewire软件包带来了很多硬依赖项。Alpine 并没有发生这种情况。可能还有另一种方法存在,将 Pipewire 客户端仅安装到 Fedora,而不带来所有混乱,但仍然如此。