如何通过命令行管道将PipeWire音频传输至ffmpeg stdin
PipeWire音频流导出为管道可读裸流的实现方案
完全可以实现,PipeWire原生自带工具即可直接输出能被cat、ffmpeg等命令通过标准输入读取的音频流,不需要额外安装第三方插件。
核心实现工具
使用PipeWire默认预装的pw-cat命令即可,该工具支持将采集到的音频直接输出到标准输出(stdout),天然适配命令行管道机制。
具体使用方法
基础采集命令
显式指定音频格式参数,将裸音频流输出到stdout的命令格式如下:pw-cat -r --format s16 --rate 48000 --channels 2 -参数说明:
-r:启用录制模式,从PipeWire音频服务捕获音频流--format s16:指定输出为16位有符号小端PCM格式,是通用音频工具兼容度最高的裸流格式--rate 48000:设置采样率为48kHz,和PipeWire默认全局采样率对齐,避免不必要的重采样开销--channels 2:设置双声道输出- 末尾的
-:指定输出目标为标准输出,而非本地文件,输出的流可以直接被管道后续命令读取
验证流可读性
你可以直接用cat命令接收流数据写入本地文件,验证流的通用性:# 录制几秒后按Ctrl+C终止,生成的test.pcm就是标准裸PCM文件 pw-cat -r --format s16 --rate 48000 --channels 2 - | cat > test.pcm直接对接ffmpeg的管道示例
采集到的流可以直接通过管道喂给ffmpeg的标准输入,注意ffmpeg侧需要指定和采集端完全一致的裸流参数,否则会出现解析错误:pw-cat -r --format s16 --rate 48000 --channels 2 - | ffmpeg -f s16le -ar 48000 -ac 2 -i - -c:a libmp3lame output.mp3上述命令会直接将PipeWire采集的音频实时编码为MP3文件,不产生中间临时文件。
指定采集目标节点
如果不需要采集默认音频设备,而是要采集指定应用、指定声卡的音频流,可以先通过wpctl status命令查询目标音频节点的ID,再通过--target参数指定采集源:# 示例中52为目标节点ID,替换为你实际查询到的ID即可 pw-cat -r --target 52 --format s16 --rate 48000 --channels 2 -
注意事项
禁止省略格式、采样率、声道数参数直接运行
pw-cat -r -,默认输出参数可能和你预期的配置不匹配,会导致后续工具解析出的音频出现爆音、杂音、变速变调问题,采集端和接收端的参数必须严格对齐。
如果你系统安装了PulseAudio兼容工具,也可以用parec --raw -命令实现类似效果,但原生pw-cat没有兼容层开销,性能表现更好。
内容的提问来源于stack exchange,提问作者les_h
相关产品推荐
相关产品推荐

