You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中拆分立体声管道并合并处理后的管道流?

Bash中实现立体声双声道拆分-处理-合并的优雅方案

核心需求是将立体声PCM流拆分为左右两个独立单声道流,分别经过不同的处理管道(如低通+混响、高通+混响)后,重新合并为立体声流。以下是两种简洁的Bash实现方式:

一、进程替换(最简洁,无临时文件)

利用Bash的进程替换特性(>(...))创建匿名管道,无需生成临时文件即可完成流的拆分、处理与合并:

# 假设genpcm-stereo输出16位、44100Hz立体声PCM,处理工具为lowpass/highpass/reverb,合并工具为merge-stereo
genpcm-stereo | tee >(split-left | lowpass | reverb) >(split-right | highpass | reverb) > /dev/null | merge-stereo - -

细节说明:

  • tee >(...) >(...) 将输入的立体声流复制到两个匿名管道,分别送入左右声道的处理流程
  • split-left/split-right 是拆分工具,需将立体声流提取对应单声道输出到stdout(可基于ffmpeg/sox实现,比如ffmpeg -f s16le -ar 44100 -ac 2 -i - -f s16le -ac 1 -map_channel 0.0.0 - 提取左声道)
  • merge-stereo - - 从两个匿名管道读取处理后的单声道流,交错合并为立体声流(可通过ffmpeg -f s16le -ar 44100 -ac 1 -i - -f s16le -ar 44100 -ac 1 -i - -filter_complex join=inputs=2:channel_layout=stereo -f s16le - 实现)

如果用ffmpeg一站式完成拆分、处理、合并,命令更紧凑:

genpcm-stereo | ffmpeg -f s16le -ar 44100 -ac 2 -i - \
  -f s16le -ac 1 -map_channel 0.0.0 - >(lowpass | reverb) \
  -f s16le -ac 1 -map_channel 0.0.1 - >(highpass | reverb) \
  | ffmpeg -f s16le -ar 44100 -ac 1 -i - \
    -f s16le -ar 44100 -ac 1 -i - \
    -filter_complex "[0:a][1:a]join=inputs=2:channel_layout=stereo" \
    -f s16le -

二、命名管道(直观可控,适合复杂流程)

若需要分步调试或处理逻辑更复杂,可使用命名管道显式管理数据流:

  1. 创建两个命名管道:
mkfifo left_pipe right_pipe
  1. 启动合并进程,等待两个处理后的单声道流:
merge-stereo left_pipe right_pipe &
  1. 启动左右声道的处理流程,从命名管道读取原始单声道流并输出处理后的结果:
cat left_pipe | lowpass | reverb > left_processed &
cat right_pipe | highpass | reverb > right_processed &
  1. 拆分立体声流到命名管道,并将处理后的流送入合并进程:
genpcm-stereo | split-stereo left_pipe right_pipe &
cat left_processed right_processed | interleave > merge-stereo-input

细节说明:

  • 命名管道是持久化的管道文件,可独立控制每个流程的启动顺序
  • 完成后可删除命名管道:rm left_pipe right_pipe

内容的提问来源于stack exchange,提问作者Konrad Eisele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:28:28