libvirt:配置客户机以共享主机音频

libvirt:配置客户机以共享主机音频

过去几天我一直在尝试将 x64 Windows 8.1 VM 的音频与主机音频混合,并成功混合。

目前对我来说可行的解决方案是使用 Spice 处理音频,并使用 ICH6 作为声卡的设置,但由于 Spice 中存在一个已知的错误,我只能找到报告Fedora红帽,音频质量非常差,唯一的部分解决方法是放入<playback compression='off'/>我的 VM 域配置。我说的部分意思是声音质量变得有些可用,但音频中仍然存在故障,正如一些用户在上面的错误报告中指出的那样。

我也尝试过使用 VNC 代替 Spice,但客户端不支持声音。以下错误报告我理解如果 VNC 客户端不支持音频,可以通过常规后端发送音频,方法是将 VM 运行的用户和组更改为我当前的用户,并添加 VNC 设置,如下所示/etc/libvirt/qemu.conf

vnc_allow_host_audio = 1
user = "yourusernamehere"
group = "yourusernamehere"

而且还使我的用户成为kvmlibvirtd组的一部分,并进一步添加此行/etc/default/libvirt-bin

export QEMU_AUDIO_DRV=pa

这样做得到了我想要的效果,客户机音频可以顺利运行,但主机音频无法工作,直到我关闭客户机。查看主机进程时,我注意到 libvirt 在我当前用户下生成了另一个 Pulseaudio 实例(实际上有 2 个 Pulseaudio 实例),而不是使用已经可用的实例。

在谷歌上搜索了一段时间后,我发现如果module-native-protocol-tcp启用了此功能,pulseaudio 可以与其他用户共享音频。不幸的是,我在这里找不到有用的信息。我发现的每一篇解释如何启用此功能的文章都建议在系统模式下运行 Pulseaudio,这显然是一个安全问题,但也会使 Plasma5 中的脉冲音频小部件无法按预期工作。我设法找到了Fedora 12 的文章解释说可以以非特权用户(即我当前的用户)身份运行 Pulseaudio,但我不明白如何与自己共享音频。

有人知道我如何使用 Pulse 以便与我的 VM 共享音频或提供另一种解决方案来混合来自客户机和主机的声音而不会出现音频故障吗?

答案1

好的,经过多次反复尝试后,我终于让它正常工作了,没有任何故障。

下面的某些步骤可能不是使其工作所必需的,但执行这些步骤后,它对我来说确实有效。如果有人想修改答案并摆脱不必要的步骤,请这样做。

除了我上面在使用 VNC 时所说的内容(更改 qemu.conf 和 libvirt-bin 中的设置并确保我的用户属于所需组的一部分)之外,我还确保我的用户属于pulse&pulse-access组的一部分。

我将 /etc/pulse 中的所有内容复制到我的主目录 .pulse 中:

cd ~
mkdir .pulse
cp /etc/pulse/* .pulse/

~/.pulse/client.conf评论/修改了以下几行:

enable-shm = yes
auto-connect-localhost = yes
auto-connect-display = yes

~/.pulse/daemon.conf

daemonize = yes
allow-module-loading = yes
use-pid-file = yes
enable-shm = yes

我还安装了 paprefs ( apt-get install paprefs) 并检查:

  • 使可发现的 PulseAudio 网络声音设备在本地可用
  • 启用本地声音设备的网络访问
  • 不需要身份验证
  • 启用多播/RTP 接收器
  • 添加虚拟输出设备,可实现本地所有声卡同时输出

完成所有更改后,您可以重新启动计算机或注销/登录并重新启动 libvirt-bin,启动 VM 时一切都应该正常运行。

附言:如果虚拟机的音频有爆裂声,请确保虚拟机具有与主机相同的采样率和位深度,这样它应该可以正常工作。

更新:我发现,从我在域日志文件 (/var/log/libvirt/qemu/yourdomain.log) 中看到的情况来看,客户机中的音频仍然可能存在问题(嘶嘶声),因为 libvirt 可能无法加载脉冲配置。您可以暂时禁用该配置文件,或者只需添加:

@{HOME}/.pulse/** rw,

在 /etc/apparmor.d/abstractions/libvirt-qemu 中并使用以下命令重新加载 apparmor 配置文件:

sudo invoke-rc.d apparmor reload

注意:出于安全原因,我在 /etc/libvirt/qemu.conf 中将 libvirt 配置为以当前用户身份运行。

答案2

这有点老了,但也许可以为那些研究这个问题的人节省时间。对我而言,有效的方法是配置 unix 套接字并使用全局 pulseaudio 配置,而不是module-native-protocol-tcp像大多数在线指南建议的那样为用户指定 TCP 连接。

我认为 pulseaudio 无法识别个人用户,无论出于什么原因。所以我最终在 中编辑了 pulseaudio 配置/etc

我编辑了/etc/pulse/default.pa以下行:

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/system-pulseaudio.socket

/etc/pulse/client.conf我添加的行中:

default-server = unix:/tmp/system-pulseaudio.socket

相关内容