pulseaudio,在 KVM 虚拟机(以 root 用户身份)和您的桌面(非 root 用户)同时播放音频?

Pet*_*ter 5 audio pulse-audio qemu linux-kvm

如何让pulseaudio同时在KVM虚拟机(以root身份运行)和桌面应用程序(不以root身份运行)中播放声音?

似乎默认情况下,它一次只会为一个用户播放声音,而阻止所有其他用户。

例如,

我播放一些音乐:

mplayer ~/Music/*
Run Code Online (Sandbox Code Playgroud)

我的虚拟机开始于:

kdesu qemu-system-x86_64 -enable-kvm [... disks, network, etc. ...] -soundhw hda
Run Code Online (Sandbox Code Playgroud)

这会以 root 身份运行进程,并显示运行它的用户的 X。直到 mplayer 停止,声音才起作用。

如果在 root shell 中运行,我会得到:

pulseaudio: pa_context_connect() failed
pulseaudio: Reason: Connection refused
pulseaudio: Failed to initialize PA contextaudio: Could not init `pa' audio driver
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: Device or resource busy
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: Device or resource busy
audio: Failed to create voice `dac'
Run Code Online (Sandbox Code Playgroud)

然后 VM 运行,它的声音设备看起来可以工作,但没有播放声音。

然后我可以停止mplayer,然后可以从VM播放声音而无需重新启动它。

然后,如果我再次启动 mplayer,我会收到错误并且没有声音:

AO: [pulse] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:  -0.0 (unknown) of 308.2 (05:08.2) ??,?% 
Audio device got stuck!
A:  -0.0 (unknown) of 308.2 (05:08.2) ??,?% 
Audio device got stuck!
A:  -0.0 (unknown) of 308.2 (05:08.2) ??,?% 
Audio device got stuck!
A:  -0.0 (unknown) of 308.2 (05:08.2) ??,?% 
Run Code Online (Sandbox Code Playgroud)

我相信我可以通过卸载pulseaudio并使用ALSA来解决这个问题,但是我需要重新配置qemu配置并从源代码构建它。我想通过配置pulseaudio来做到这一点,就像在ALSA中使用软件混音器一样。

Rad*_*cka 2

您可能已经为 Qemu 设置了正确的环境变量,例如:

QEMU_AUDIO_DRV=pa
Run Code Online (Sandbox Code Playgroud)

但在设置 QEMU_PA_SINK 之前,有必要安装软件包,paprefs该软件包包含与pulseaudio类似的服务器设置。

我已经检查了 PulseAudio Preferences 中的所有内容,但可能只是选项:

  • “启用对本地声音设备的网络访问”,
  • “允许局域网上的其他机器发现本地声音设备”和
  • “不需要身份验证”

重新启动pulseaudio后,combined源可用。作为您的用户然后开始:

pulseaudio -k
pactl list short sinks
Run Code Online (Sandbox Code Playgroud)

如果您看到名为的源,combined您可以继续为 Qemu 设置其他环境变量,例如:

QEMU_PA_SINK=combined
QEMU_PA_SOURCE=input
Run Code Online (Sandbox Code Playgroud)

最后一步重新启动您的虚拟机

https://wiki.archlinux.org/index.php/QEMU <- 参见音频部分 https://freedesktop.org/software/pulseaudio/paprefs/

编辑:现在我们有 QEMU 版本 4.0

https://www.redhat.com/archives/libvir-list/2019-February/msg01305.html

那么虚拟机 xml 定义中的常见更改如下所示

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  ...
  <qemu:commandline>
    <qemu:arg value='-audiodev'/>
    <qemu:arg value='pa,id=pa1,out.name=combined,in.name=input'/>
  </qemu:commandline>
</domain>
Run Code Online (Sandbox Code Playgroud)