Audio de línea de comando: canalización para reproducción y grabación simultáneas

Audio de línea de comando: canalización para reproducción y grabación simultáneas

Estoy intentando generar datos de sonido, convertirlos y almacenarlos en formato WAV. Ya casi he llegado, excepto que me gustaría escuchar el sonido generado.mientrasestá siendo "grabado".

Este comando simplemente genera datos y los reproduce:

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

(Tenga en cuenta que si presiona Ctrl-C aquí después de que el sonido deja de reproducirse, aplaypuede producirse un error de segmentación)

Usando soxy mplayerpuedo grabar bien, pero no puedo escuchar ningún sonido al mismo tiempo:

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

Tenga en cuenta aquí que play test.wav(donde playes del soxpaquete, no alsade aplay) indicará "Duración: 00:00:03.00" para el test.wavarchivo. Además, este proceso parece ejecutarse más rápido que en tiempo real, es decir, se completa en (aparentemente) menos de 3 segundos.

Al intentar hacer trampa utilizando teepara capturar la transmisión en el 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

Aquí aparentemente puedo escuchar el sonido a medida que se genera, y test.wavtambién se puede reproducir, sin embargo, play test.wavinformará "Duración: desconocida".

Entonces me gustaría preguntar: ¿es posible hacer algo como el comando "de una sola línea" anterior para generar, reproducir y grabar un sonido?al mismo tiempo- sin embargo,sinla necesidad de instalar jack?

PD: algunos enlaces relevantes:

Respuesta1

Puede utilizar tee(1) para multiplexar la secuencia, por ejemplo

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

Quizás también te interese el efecto de sintetizador de Sox, que puede producir la mayoría de los tonos y barridos, por ejemplo.

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

información relacionada