lxc折腾之路 篇五:东方不亮西方亮
到了本长篇最重要的环节了。我们要故技重施,像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
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
空调救我命
校验提示文案
空调救我命
校验提示文案