【在 WSL2 GUI 中使用 pulseaudio 播放声音】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近在搞一个Linux项目,由于WSL2中需要用到声音外放,无奈只能潜心研究。后来就使用了一种折中的方式替代,那就是pulseaudio。目前来讲WSL2对硬件外设的支持还是不太友好,关于USB的支持我之前在其他文章中已经论述过了,这里不讨论。


一、pulseaudio 是什么?

PulseAudio(以前叫Polypaudio)是一个跨平台的、可通过网络工作的声音服务,其一般使用于Linux和FreeBSD操作系统。它可以用来作为一种简易改进的开放声音后台(ESD)替换。

PulseAudio运行于Microsoft Windows和POSIX兼容系统(如Linux和FreeBSD)。PulseAudio是自由软件,基于GNU宽通用公共许可证 (LGPL)2.1协议。

一言以蔽之:一种跨平台,通过网络传输声音的工具。我们今天不讨论实现原理,就单讲怎么部署。

二、部署步骤

1.下载PulseAudio

PulseAudio.zip
为了尽可能减少配置,我上传了一个无需配置的压缩包。

2.前提条件

这里由于测试使用的是ffplay,而ffplay需要打开一个图形界面,如果你的WSL2不带GUI,会出现一个段错误。所以前提是你的WSL2需要支持GUI。

理论上,只要你能调用播放命令即可,哪怕没有GUI也是可以的,但是前提是你需要通过代码实现或者其它命令实现。只不过ffplay是我能想到的最简单的方法了,要不然你就要装一个播放器了。

怎么配置GUI,请看我的其它文章Windows11 配置GUI

3.开始配置

1.配置pulseaudio

解压pulseaudio.zip到桌面或者任何一个可以访问的目录,这里我选择解压到桌面。需要特别说明的是最好使用我的pulseaudio.zip,这个软件本身版本很多,不能保证所有的版本都是可以的。而且,我的zip解压就可以用,不需要额外配置,至少我是一次跑通。

解压完之后进入pulseaudio\bin,然后在这个目录开一个powershell或terminal,之后执行bin下面的pulseaudio.exe

./pulseaudio.exe
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
W: [(null)] pulsecore/core.c: failed to allocate shared memory pool. Falling back to a normal memory pool.
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
W: [(null)] pulsecore/core-util.c: Secure directory creation not supported on Win32.
E: [(null)] daemon/main.c: Failed to load directory.

出现上面的报错提示不用惊慌,不会影响声音输出,至少我的环境没有影响。

注:这个页面不要关掉,它是个服务,需要一直挂在那里,最小化就行了。

2.配置麦克风权限

windows10或11上外放是不需要特殊权限的,但是使用麦克风需要赋予麦克风权限,具体方法请往下看。
Windows11:
首先,Win+i进入设置页面
其次,在左边的侧边栏找到隐私和安全性
最后,一直往下划,找到麦克风点进去
在这里插入图片描述
在这里插入图片描述
Windows 10:
首先,Win+i打开设置
其次,在面板里找到隐私并进入
最后,在左侧边栏找到麦克风
在这里插入图片描述

在这里插入图片描述

注意:一定要在测试前先打开Windows上的pulseaudio

3.配置WSL2外放

这里,我用的是Ubuntu-18.04版本,Ubuntu-20.04应该也是可以的(没有实测)。
打开一个powershell

#powershell输入wsl进入环境
wsl
#安装多个wsl分发版
wsl -d <分发版>

进入wsl环境之后,如果没有安装ffmpeg的先安装ffmpeg。

sudo apt update
sudo apt install ffmpeg

接下来配置一个环境变量

vim .bashrc
#添加环境变量
export PULSE_SERVER=tcp:$(cat /etc/resolv.conf | grep nameserver | cut -c 12-23)
#保存
wq
#生效
source .bashrc

检查下变量:

echo $PULSE_SERVER
#我的
tcp:172.20.144.1

每个人可能都不一样,这个就是/etc/resolv.conf里面的nameserver
在这里插入图片描述

最后一步,随便找一个wav文件或MP3复制到用户目录

ffplay -i "1.wav|1.mp3"

注意:如果你的文件包含空格的话,一定要用双引号括住,不然文件会被解析成多个参数。

这个时候你应该就可以听到音乐了,一定要先把右下角的声音打开。

4.配置WSL2麦克风

这里我用到了一个snap应用audio-recoder,如果你恰好和我一样打开了systemd并安装了snap,你可以很轻松安装一个录音软件。

sudo snap install --edge audio-recorder

安装好之后打开应用:

audio-recorder

在这里插入图片描述
按照我的配置就行了,点击Start recording开始录音,点击Stop recording停止录音。播放的话很简单,用上面的ffplay就可以了。

虽然是tcp,我的电脑没有感觉到太明显的延迟,可能性能越强的电脑体验越好吧。


总结

1、Windows11别忘记打开声音,麦克风别忘了给权限
2、可能有一定延迟,因为是通过网络传输的。
3、效果的话只能见仁见智了,如果不能满足要求就安装一个实实在在的Ubuntu吧!

猜你喜欢

转载自blog.csdn.net/jiexijihe945/article/details/131680406