Linux
命令行音頻 - 同時播放和錄製的管道
我正在嘗試生成聲音數據,將其轉換並儲存為 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
可能會出現段錯誤)使用
sox
andmplayer
,我可以很好地錄製 - 但我不能同時聽到任何聲音: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
package,而不是alsa
’saplay
)將為test.wav
文件聲明“持續時間:00:00:03.00”。此外,這個過程似乎比實時執行得更快,即在(顯然)不到 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
會報告“持續時間:未知”。所以我想問一下-是否可以執行類似上述“單行”命令的操作,同時生成、播放和錄製聲音**-**但是,無需安裝
jack
?PS:一些相關連結:
您可以使用 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
您可能還對 soxs 的合成器效果感興趣,它可以產生大多數音調和掃頻,例如
sox -n -r 44100 test.wav synth 4 sine 100:1000