命令列音訊 - 用於同時播放和錄製的管道

命令列音訊 - 用於同時播放和錄製的管道

我正在嘗試生成聲音數據,將其轉換並將其儲存為 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

(請注意,如果在聲音停止播放後按 Ctrl-C,aplay可能會出現段錯誤)

使用soxmplayer,我可以很好地錄音 - 但我同時聽不到聲音:

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

請注意,play test.wav(其中play是來自sox包,而不是alsas 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

顯然,我在這裡聽到了生成的聲音 - 並且test.wav也可以播放,但是,play test.wav會報告“持續時間:未知”。

所以我想問 - 是否可以執行類似於上面的“one-liner”命令的操作來產生、播放和錄製聲音同時- 然而,沒有需要安裝jack嗎?

PS:一些相關連結:

答案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

您可能也對紅襪隊的合成效果感興趣,它可以產生大多數音調和掃頻,例如

sox -n -r 44100 test.wav synth 4 sine 100:1000

相關內容