如何将音频重定向至FIFO文件?及用音频文件替代arecord发起呼叫?
没问题,我来帮你一步步解决这两个问题:
问题1:如何将音频重定向至FIFO文件?
首先得先创建一个FIFO文件(也叫命名管道),用mkfifo命令就能搞定:
mkfifo my_audio_fifo
接下来分两种常见场景处理:
- 从实时录制的音频输出到FIFO:用
arecord(或其他录音工具)直接把输出重定向到FIFO即可,比如用CD级别的音频格式(44.1kHz 16位立体声):
你可以根据实际需求调整arecord -f cd > my_audio_fifoarecord的参数,比如修改采样率、声道数。 - 从本地音频文件输出到FIFO:直接用
cat把文件的二进制内容写入FIFO就可以(音频文件是二进制数据,cat能完整传递):cat your_audio_file.wav > my_audio_fifo
注意:FIFO有个关键特性——必须有程序打开它进行读取时,写入操作才会正常执行,否则写入命令会一直阻塞,直到有读端连接。所以要确保你的目标程序已经在监听这个FIFO,再执行写入命令。
问题2:替换arecord命令,将本地sound.wav输出至call_in FIFO
原来你用arecord的命令大概是类似arecord [参数] > call_in,现在换成本地文件输出,分两种情况处理:
情况1:sound.wav的格式和程序预期完全匹配
最简单的方法就是直接用cat把文件内容写入call_in:
cat sound.wav > call_in
这个命令会把整个wav文件的二进制内容直接发送到FIFO,只要格式(采样率、位深、声道数)和程序要求一致,就能正常发起呼叫。
情况2:sound.wav格式和程序预期不匹配
如果程序对音频格式有特定要求(比如单声道、48kHz采样率),就得先转码再输出。这里推荐用sox或者ffmpeg工具:
- 用
sox转码并输出到FIFO:
参数说明:sox sound.wav -t raw -r 48000 -b 16 -c 1 - > call_in-r 48000是48kHz采样率,-b 16是16位位深,-c 1是单声道,你可以根据程序要求调整这些数值。 - 用
ffmpeg转码并输出到FIFO:
参数说明:ffmpeg -i sound.wav -f s16le -ar 48000 -ac 1 - > call_in-f s16le指定输出为16位小端格式的原始音频,-ar 48000是采样率,-ac 1是单声道,同样按需调整。
同样要注意:执行这些命令前,确保你的程序已经在监听
call_in这个FIFO,否则命令会卡住,直到程序开始读取。
内容的提问来源于stack exchange,提问作者BlandCorporation
相关产品推荐
相关产品推荐

