Áudio de linha de comando - tubulação para reprodução e gravação simultâneas

5

Estou tentando gerar dados de som, convertê-los e armazená-los em um formato WAV. Eu estou quase lá - exceto que eu gostaria de ouvir o som gerado "while" sendo "gravado".

Esta linha de comando apenas gera dados e os reproduz:

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 

(Note que se você pressionar Ctrl-C aqui depois que o som parar, aplay may segfault)

Usando sox e mplayer , posso gravar bem, mas não ouço nenhum som ao mesmo tempo:

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

Observe que play test.wav (onde play é de sox package, não alsa ' aplay ) informará "Duration: 00: 00: 03.00" para o arquivo test.wav . Além disso, este processo parece correr mais rápido do que em tempo real (isto é, conclui em (aparentemente) menos de 3 segundos).

Ao tentar enganar usando tee para capturar o fluxo em disco,

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

Aqui, aparentemente, eu ouço o som enquanto ele é gerado - e test.wav é jogável também, no entanto, play test.wav reportará "Duration: unknown".

Então, eu gostaria de perguntar - é possível fazer algo como a linha de comando "one-liner" acima, para gerar, tocar e gravar um som "ao mesmo tempo" - no entanto, sem a necessidade de instalar jack ?

PS: alguns links relevantes:

por sdaau 28.03.2012 / 19:31

1 resposta

1

Você pode usar tee (1) para multiplexar o fluxo, por exemplo

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

Você também pode estar interessado no efeito de síntese do soxs, que pode produzir a maioria dos tons e varreduras, por exemplo,

sox -n -r 44100 test.wav synth 4 sine 100:1000
    
por 13.04.2012 / 02:33