方案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系统上测试。