命令行音频 - 用于同时播放和录制的管道

sda*_*aau 7 linux pipe alsa audio

我正在尝试生成声音数据,将其转换并存储为 WAV 格式。我快到了 - 除了我想在“录制”听到生成的声音。

此命令仅生成数据并回放:

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
aplay -t raw -c 1 -r 44100 -f FLOAT_LE
Run Code Online (Sandbox Code Playgroud)

(请注意,如果您在声音停止播放后在此处按 Ctrl-C,则aplay可能会出现段错误)

使用soxand mplayer,我可以录制得很好 - 但同时我听不到声音:

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
    -c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
mplayer - -cache 8092 -endpos 3 -vo null -ao pcm:waveheader:file=test.wav
Run Code Online (Sandbox Code Playgroud)

请注意,play test.wavplay来自sox包的位置,而不是alsa's aplay)将说明文件的“持续时间:00:00:03.00” test.wav。此外,这个过程似乎比实时运行得更快,即在(显然)不到 3 秒内完成。

通过尝试通过使用tee将流捕获到磁盘来作弊,

perl -e 'for ($c=0; $c<4*44100; $c++) {
             $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
         } ' |
sox -V -r 44100 -c 1 -b 32 -e floating-point -t raw - \
    -c 2 -b 16 -t wav - trim 0 3 gain -1 dither |
tee test.wav |
aplay
Run Code Online (Sandbox Code Playgroud)

显然,我在这里可以听到生成的声音 - 并且test.wav也可以播放,但是,play test.wav会报告“持续时间:未知”。

所以我想问-是有可能做类似上述的“一个班轮”命令,既产生,播放和录制声音在同一时间-但是,没有安装必要jack

PS:一些相关链接:

Tho*_*hor 1

您可以使用 tee(1) 来复用流,例如

perl -e 'for ($c=0; $c<4*44100; $c++) {
  $k=1*sin((1500+$c/16e1)*$c*22e-6); print pack "f", $k;
}' | tee >(sox -c1 -r44100 -t f32 - test.wav) \
         >(sox -c1 -r44100 -t f32 - -d) > /dev/null
Run Code Online (Sandbox Code Playgroud)

您可能还对红袜队的合成效果感兴趣,它可以产生大多数音调和扫频,例如

sox -n -r 44100 test.wav synth 4 sine 100:1000
Run Code Online (Sandbox Code Playgroud)