东方不亮西方亮

2024-04-01 22:18:13 0点赞 1收藏 1评论

到了本长篇最重要的环节了。我们要故技重施,像wayland那样,使用宿主机的unix socket,直接通过宿主机声卡播放声音。不过得让我先水水。我当初以为pipewire就和wayland compositor一样,只要宿主机装上,容器也装上,然后用上同一个unix socket就行了。这没错,但也不完全对。

当初我在笔记本上装了sway和pipewire和wireplumber,在sway上直接用mpv播放视频,笔记本的音响就出声音了。然后我又把pipewire的unix socket给容器用,同样的像wayland socket一样丢到XDG_RUNTIME_DIR里,容器也装了pipewire和wireplumber,我可以直接用wpctl控制宿主机音响声音的大小,也同样用mpv播放了视频,笔记本的音响也同理播放了声音。非常好,试验成功了,然后我就把小主机重装了。一切都如我之前的教程一般顺利,但是让我放弃proxmox的问题又来了,容器通过HDMI播放不了声音。这是什么情况,为什么在笔记本上可以成功,小主机却失败了呢。这就奇怪了,那在宿主机上直接播放视频,会不会有声音,没有。我知道问题所在了,是pipewire。然后卸载了pipewire,装上了老相识pulseaudio。测试下,怎么又没声音,到底是哪里出错了,又搜索了一番,搜到了之前在proxmox直通时没有声音所看到的网站。嗯,装pavucontrol,然后打开,去最后的配置那选择HDMI output,哈,有声音了。为了不再搞砸起见,我又发动了搜索引擎,找到了这个:https://discuss.linuxcontainers.org/t/audio-via-pulseaudio-inside-container/8768 ,跟着做,在容器装了pulseaudio和pavucontrol,然后打开pavucontrol,哈哈,可以控制宿主机的声音,在容器用mpv播个视频也有声音,成功了。成功个头,打开第二个视频就没声音了。这肯定又和dbus扯上关系了,用dbus-launch开pulseaudio,成功开到了3个视频,没有开到第4个视频还有声音的情况。尼玛,到底哪里出了问题,pipewire不行,pulseaudio也不行,回到笔记本上重新研究。在笔记本上,装的是pipewire,容器使用宿主机的pipewire socket和音响,mpv播放几个视频的声音都没问题,嗯,肯定是臭名昭著的pulseaudio远程播放的问题。装上pipewire,笔记本直接HDMI插到电视上,用pavucontrol设置下,宿主机有声音了,容器也有声音了,mpv播放几个视频都有声音,哈哈哈哈,我终于成功了。成功个头,打开firefox,去什么网站都播不出声音,换strawberry播放音乐也没有声音,到底哪里出错了啊。我想是不是错在我在容器中只安装了pipewire,但是却没有启动过。听起来是不是很奇怪,为什么装了却不启动,原因很简单,在容器里使用宿主机的显示和声音现在还在探索阶段,大家都在黑夜里摸石头过河,成功过河的人留下来的指导就和上面的链接里的内容一样,犹抱琵琶半遮面,需要猜他们没写出来的到底是什么,他们惜字如命,多给点提示都不行,不像我废话多的是,没关系,只要你们乖乖跟我做,肯定会有声音的。回到之前启动pipewire的话题,在没有启动pipewire前,使用wpctl status可以宿主机的声音设备,说明这个unix socket是有效的,但是启动pipewire后,wpctl status却显示dummy output,说明启动pipewire后的unix socket是无效的。pipewire并不像wayland compositor,可以通过环境WAYLAND_DISPLAY使用wayland-1的unix socket,同时它也不像pulseaudio,可以通过环境PULSE_SERVER来设置unix socket。所以就出现了个问题,我要是想让firefox之类不会自动使用声音的unix socket的应用,我必须启动声音管理器pipewire,但是启动pipewire后,pipewire就会创建个新的unix socket,然后与宿主机失联。然后我就动了歪脑筋,我先启动pipewire,再把unix socket换成宿主机的会怎么样,顶多出bug干掉容器,甚至宿主机的系统,甚至宿主机的硬件。事实证明我多虑了,替换成宿主机的unix socket后,所有容器内的应用都能通过宿主机的unix socket播放出声音,没有任何问题。要是出问题就是那程序不支持pipewire。东方不亮西方亮

所以我们开干吧。

我敢肯定这wiki只写了一半,装完pipewire后,aplay和pactl都不能用:https://wiki.debian.org/PipeWire

  • sudo apt install pipewire-audio pavucontrol -y

注意,下面的命令不是以root身份运行。如果你有跟着我写的做,肯定创建了个没有sudo权限的用户,登录那用户运行下面的命令,没有创建的话也行。

  • systemctl --user --now enable pipewire pipewire-pulse

  • systemctl --user --now enable wireplumber.service

然后在宿主机开pavucontrol,我知道你们肯定不习惯这么barebone的桌面环境,没事的,按win+enter就会弹出foot,在里面输入pavucontrol然后回车就行。然后去最后一项,点击那个框,现在后面写着已插入的HDMI就行了。在pavucontrol设置下音量,注意不要不小心静音了。win+shift+q就能关闭窗口。

东方不亮西方亮东方不亮西方亮

模拟立体音就是dummy input,不选也行。

我相信各位已经知道怎么改 profile了。

  • incus profile copy default pipewire

  • incus profile edit pipewire

config: {}

description: Let containers use host sound

devices:

pipewireSocket:

type: proxy

bind: container

connect: unix:/run/user/1100/pipewire-0

listen: unix:/mnt/pipewire-0

mode: '0770'

security.gid: '1100'

security.uid: '1100'

gid: '1000'

uid: '1000'

name: pipewire

把profile加进容器。

  • incus profile add htpc pipewire

进入容器。

  • incus exec htpc -- su -l lxc

安装pipewire,没错不装pavucontrol。

https://wiki.alpinelinux.org/wiki/PipeWire

  • doas apk add pipewire pipewire-zeroconf wireplumber

然后运行pipewire。开foot,然后运行这命令,然后不要关闭这个窗口,关掉的话pipewire也会关掉。

  • /usr/libexec/pipewire-launcher

再开个foot,运行这些命令。运行完这窗口就没用了,可以关了。

  • rm $XDG_RUNTIME_DIR/pipewire-0

  • ln -s /mnt/pipewire-0 $XDG_RUNTIME_DIR/pipewire-0

然后你随便开个东西,播放个声音试试。

该长篇完结。特别福利,送上mpv硬解4k h265的方法,前提是你的gpu得支持。

  • nano ~/.config/mpv/mpv.conf

vo=dmabuf-wayland

hwdec=auto-safe

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
1评论

  • 精彩
  • 最新
  • 要是mpv有声音,但是Firefox没声音的话,在Alpine里装pipewire-pulse,重启容器,再干一次。

    校验提示文案

    提交
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
1
扫一下,分享更方便,购买更轻松