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"即为成功。

相关推荐
被遗忘的旋律.7 小时前
Linux驱动开发笔记(十五)——MISC驱动实验
linux·驱动开发·笔记
大聪明-PLUS7 小时前
深入 initrd
linux·嵌入式·arm·smarc
AI+程序员在路上7 小时前
linux下网络IP、网关及路由设置详解
linux·网络·tcp/ip
wabil7 小时前
VSCode远程调试Linux的GUI程序
linux·ide·vscode
lbb 小魔仙7 小时前
【Linux】Linux 安全实战:防火墙配置 + 漏洞修复,符合企业合规标准
linux·运维·安全
oMcLin7 小时前
如何在 Linux 上打开和编辑 Apple iWork 文件(增强版)
linux·运维·服务器
艾莉丝努力练剑7 小时前
【Linux进程(七)】进程虚拟地址空间详解:从概念到实现与设计哲学
java·linux·运维·服务器·人工智能·安全·进程
五阿哥永琪7 小时前
Linux 常用命令
linux·服务器·网络
日更嵌入式的打工仔7 小时前
linux内核查看网口负荷的指令
linux·服务器·笔记
郝学胜-神的一滴7 小时前
Linux多线程编程:深入解析pthread_detach函数
linux·服务器·开发语言·c++·程序人生