【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

关键要点:

  1. 启动顺序很重要:通常先启动消费者,再启动生产者

  2. 格式必须匹配:生产者和消费者的音频格式参数必须一致

  3. 管道是真实的:这些命令都使用了真实的命名管道 /tmp/audio_fifo

  4. 数据速率-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的音频设备:

  1. 确保WSL2版本足够新:
 wsl --version

如果版本低于1.0.0,请更新WSL2:

# 在Windows PowerShell中运行
   wsl --update
  1. 安装必要的音频工具:
sudo apt-get update
sudo apt-get install -y pulseaudio alsa-utils
  1. 配置PulseAudio使用WSLg的音频服务:
# 创建或编辑PulseAudio配置文件
mkdir -p ~/.config/pulse
echo "default-server = unix:/mnt/wslg/PulseServer" > ~/.config/pulse/client.conf
  1. 测试音频重定向:
# 安装一个简单的音频测试工具
sudo apt-get install -y sox

# 测试录音
rec test.wav

之后应该就可以正常的在WSL2当中使用麦克风设备了

image

 

 

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
posted @ 2025-11-07 02:39  FBshark  阅读(17)  评论(0)    收藏  举报