【CI130x 离在线】Linux 音频管道测试 & WSL2添加音频驱动
方案1:使用现有的工具进行WAV音频传输
这是最简单直接的方法,使用系统自带工具。
1. 创建命名管道
mkfifo /tmp/audio_fifo
2. 启动消费者(在一个终端中)
播放来自管道的原始音频数据:
aplay -f S16_LE -r 8000 -c 1 /tmp/audio_fifo
或者使用ffplay:
ffplay -f s16le -ar 8000 -ac 1 -autoexit /tmp/audio_fifo
3. 启动生产者(在另一个终端中)
录制音频并直接写入管道:
arecord -f S16_LE -r 8000 -c 1 > /tmp/audio_fifo
完整的工作流程:
# 终端1:创建管道并等待播放
mkfifo /tmp/audio_fifo
aplay -f S16_LE -r 8000 -c 1 /tmp/audio_fifo
# 终端2:开始录制到管道(在终端1启动后运行)
arecord -f S16_LE -r 8000 -c 1 > /tmp/audio_fifo
方案2:使用GStreamer管道
GStreamer是专门为多媒体流设计的,非常适合这种场景。
1. 创建命名管道
mkfifo /tmp/audio_fifo
2. 启动消费者
gst-launch-1.0 filesrc location=/tmp/audio_fifo ! audio/x-raw,format=S16LE,rate=8000,channels=1 ! pulsesink
3. 启动生产者
gst-launch-1.0 pulsesrc ! audio/x-raw,format=S16LE,rate=8000,channels=1 ! filesink location=/tmp/audio_fifo
方案3:压缩音频流(更接近您最初的设想)
如果需要压缩数据,可以使用Opus编码器:
1. 创建命名管道
mkfifo /tmp/audio_fifo
2. 启动消费者
gst-launch-1.0 filesrc location=/tmp/audio_fifo ! opusparse ! opusdec ! pulsesink
3. 启动生产者
gst-launch-1.0 pulsesrc ! audioresample ! audio/x-raw,rate=48000 ! opusenc bitrate=16000 ! filesink location=/tmp/audio_fifo
验证管道工作
您可以这样测试管道是否正常工作:
# 测试1:生成测试音频
mkfifo /tmp/audio_fifo
aplay -f S16_LE -r 8000 -c 1 /tmp/audio_fifo &
echo "录制3秒测试音频..."
arecord -f S16_LE -r 8000 -c 1 -d 3 > /tmp/audio_fifo
# 测试2:使用现有音频文件
mkfifo /tmp/audio_fifo
aplay -f S16_LE -r 8000 -c 1 /tmp/audio_fifo &
# 将现有文件转换为合适格式并推入管道
ffmpeg -i input.wav -f s16le -ar 8000 -ac 1 - 2>/dev/null > /tmp/audio_fifo
关键要点:
-
启动顺序很重要:通常先启动消费者,再启动生产者
-
格式必须匹配:生产者和消费者的音频格式参数必须一致
-
管道是真实的:这些命令都使用了真实的命名管道
/tmp/audio_fifo -
数据速率:
-f S16_LE -r 8000 -c 1格式的数据速率是 8000×16×1 = 128kbps,如果您需要精确的16kbps,需要使用压缩编码(如方案3中的Opus)
这些示例都是完全可以运行的,您可以在任何装有ALSA工具和(可选)GStreamer的Linux系统上测试。
WSL2添加音频驱动
接上一篇,在将USB麦克风接入WSL2后,就想尝试进行录音的操作了。但尝试了之后发现 WSL2 当中缺少音频驱动。
原因
WSL2使用的是微软定制的Linux内核,为了保持轻量级,默认不包含许多硬件驱动,包括音频驱动。即使通过usbipd成功共享了USB设备,WSL2也无法加载必要的音频驱动模块来使用这些设备。
解决方法
使用WSLg的音频重定向
较新版本的WSL2引入了WSLg,它提供了音频重定向功能,无需额外配置即可使用Windows的音频设备:
- 确保WSL2版本足够新:
wsl --version
如果版本低于1.0.0,请更新WSL2:
# 在Windows PowerShell中运行
wsl --update
- 安装必要的音频工具:
sudo apt-get update
sudo apt-get install -y pulseaudio alsa-utils
- 配置PulseAudio使用WSLg的音频服务:
# 创建或编辑PulseAudio配置文件
mkdir -p ~/.config/pulse
echo "default-server = unix:/mnt/wslg/PulseServer" > ~/.config/pulse/client.conf
- 测试音频重定向:
# 安装一个简单的音频测试工具
sudo apt-get install -y sox
# 测试录音
rec test.wav
之后应该就可以正常的在WSL2当中使用麦克风设备了

sox警告:play WARN alsa
当我们使用sox的play指令时,比如下面这个播放蜂鸣声的指令:
play --no-show-progress --null --channels 1 synth 1 sine 435
会出现如下警告:
play WARN alsa: can't encode 0-bit Unknown or not applicable
可以使用下面的指令解决问题:
export AUDIODRIVER=alsa
运行该指令后,再使用play命令,就可以看到警告已经没有了。

当然,这样只在当前会话下有效,当我们退出shell后就失效了,要想永久生效就把它写入配置文件中,我们可以把它写入到~/.profile文件里,接着使用source指令让它生效
echo "export AUDIODRIVER=alsa" >> ~/.profile
source ~/.profile

浙公网安备 33010602011771号