WSL音频转发配置流程:WSL2/WSL1全适配

WSL默认无音频转发配置,导致ekho、ffmpeg等程序"运行无声音"。本次WSL2(WSLg方案)与WSL1(PulseAudio方案)完整配置流程,步骤直接可执行。

一、确认WSL版本

WSL1与WSL2配置不同,需先明确版本。打开Windows PowerShell(Win+R输入powershell),执行:

Plain 复制代码
wsl -l -v  # 查看版本及发行版状态

输出示例(重点看VERSION列):

Plain 复制代码
  NAME            STATE           VERSION
* Ubuntu-22.04    Running         2  # WSL2
  CentOS-7        Stopped         1  # WSL1

WSL2需版本≥1.0.0以支持WSLg,低于此版本需先升级(见下文)。

二、WSL2配置:WSLg原生转发

WSLg是WSL2官方音频组件(版本≥1.0.0默认集成),无需Windows端额外软件。

1. 升级WSL2版本:版本<1.0.0时,PowerShell中执行:

WSL2版本<1.0.0时,在PowerShell中执行升级命令:

Plain 复制代码
wsl --update          # 升级核心组件
wsl --shutdown        # 重启WSL使生效

验证版本:wsl --version,输出"WSL版本:2.0.9.0"及以上合格。

Plain 复制代码
wsl --version

输出"WSL版本:2.0.9.0"及以上即为合格。

2. 安装WSL音频依赖 :WSL端需PulseAudio和alsa-utils,必须用普通用户操作(PulseAudio禁止root):

WSL端需PulseAudio(音频服务)和alsa-utils(设备管理)对接WSLg,必须使用 普通用户操作(PulseAudio禁止root运行)。

Plain 复制代码
su - zimo             # root切换至普通用户(示例用户zimo)
sudo apt update       # 更新软件源
sudo apt install -y pulseaudio alsa-utils  # 安装依赖

3. 配置PulseAudio连接WSLg:WSLg服务路径固定,执行:

WSLg音频服务节点路径固定,配置PulseAudio指向该路径即可:

Plain 复制代码
mkdir -p ~/.config/pulse  # 新建配置目录
# 写入WSLg服务地址
echo "default-server = unix:/mnt/wslg/PulseServer" > ~/.config/pulse/client.conf
echo "enable-shm = no" >> ~/.config/pulse/client.conf  # 禁用共享内存减卡顿

4. 验证音频转发:用sox工具测试,出声即成功:

通过sox工具"录制+播放"验证链路连通性:

Plain 复制代码
sudo apt install -y sox  # 安装测试工具
rec test.wav             # 录制音频(Ctrl+C结束)
play test.wav            # 播放音频

ekho测试:./ekho -v zh "WSL2音频转发成功"

Plain 复制代码
./ekho -v zh "WSL2音频转发成功"

5. PulseAudio自启配置:普通用户bash中设置,避免手动启动:

配置普通用户bash自启,避免每次手动启动PulseAudio:

Plain 复制代码
nano ~/.bashrc  # 编辑bash配置
# 末尾添加:服务未启动则自动启动
if ! pulseaudio --check; then
  pulseaudio --start --exit-idle-time=-1
fi
source ~/.bashrc  # 生效配置(Ctrl+O保存,Ctrl+X退出)

三、WSL1/旧版WSL2配置:PulseAudio手动转发

适用于WSL1或WSL2版本<1.0.0,通过"Windows服务器+WSL客户端"实现转发。

1. Windows端部署PulseAudio服务器

下载:访问PulseAudio Windows Support,获取最新压缩包(如pulseaudio-1.2.10-windows.zip)。

解压配置:解压至C:\PulseAudio(路径无中文),编辑C:\PulseAudio\etc\pulse\default.pa,修改内容:

Plain 复制代码
# 注释本地socket配置
# load-module module-native-protocol-unix
# 开放TCP访问(允许WSL连接)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;172.0.0.0/8 auth-anonymous=1
# 绑定Windows音频设备
load-module module-waveout sink_name=output source_name=input
set-default-sink output
set-default-source input

启动:双击C:\PulseAudio\bin\pulseaudio.exe,防火墙弹窗选"允许访问",任务栏喇叭图标代表运行中。

2. WSL端配置PulseAudio客户端

3. 验证转发效果

Plain 复制代码
speaker-test -t wav -c 2  # 系统音频测试(出声即成功)
./ekho -v zh "WSL1音频转发成功"  # ekho测试

四、常见问题处理

Connection refused(连接被拒) :WSL2+WSLg执行wsl --shutdown重启;PulseAudio方案确认Windows端服务器启动、防火墙放行,WSL端用echo $PULSE_SERVER验证IP;全程用普通用户操作,禁止root。

无报错但无声音 :检查Windows主机音频设备(音箱连接、音量未静音);WSL2+WSLg执行rm -rf ~/.config/pulse后重新配置;PulseAudio方案确认Windows端配置含set-default-sink output

权限不足(Permission denied) :将普通用户加入audio组,sudo usermod -aG audio $USER,重启终端生效。

Plain 复制代码
sudo usermod -aG audio $USER  # 加入audio组
# 重启终端生效
Plain 复制代码
sudo usermod -aG audio $USER
# 重启终端生效

五、版本适配说明

Plain 复制代码
WSL版本          配置方案          特点
WSL2(≥1.0.0)   WSLg原生转发      零额外软件,简单稳定
WSL2(<1.0.0)   升级后用WSLg      一劳永逸
WSL1             PulseAudio手动转发 唯一适配,兼容性强

核心原则:普通用户运行音频程序+确保音频服务连接正常。配置完成后,ekho、ffmpeg等程序均可正常输出声音。

Plain 复制代码
sudo apt update  # 更新源
sudo apt install -y pulseaudio  # 安装客户端
# 配置关联Windows服务器(DNS地址即Windows IP)
nano ~/.bashrc
echo 'export PULSE_SERVER=tcp:$(grep -oP "(?<=nameserver\ ).*" /etc/resolv.conf)' >> ~/.bashrc
source ~/.bashrc  # 生效配置

验证:执行echo $PULSE_SERVER,输出"tcp:172.xx.xx.xx"即为成功。

相关推荐
酉鬼女又兒22 分钟前
每天一个Linux命令_printf
linux·运维·服务器
Trouvaille ~28 分钟前
TCP Socket编程实战(三):线程池优化与TCP编程最佳实践
linux·运维·服务器·网络·c++·网络协议·tcp/ip
June`37 分钟前
高并发网络框架:Reactor模式深度解析
linux·服务器·c++
生活很暖很治愈2 小时前
Linux——孤儿进程&进程调度&大O(1)调度
linux·服务器·ubuntu
晚霞的不甘2 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
HalvmånEver2 小时前
Linux:线程同步
linux·运维·服务器·线程·同步
Zach_yuan2 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers][I2C]I2C
linux·笔记·学习
VekiSon2 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
Y1rong3 小时前
linux之网络
linux