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, aplay
puede producirse un error de segmentación)
Usando sox
y mplayer
puedo 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 play
es del sox
paquete, no alsa
de aplay
) indicará "Duración: 00:00:03.00" para el test.wav
archivo. 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 tee
para 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.wav
también se puede reproducir, sin embargo, play test.wav
informará "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:
- notas sobre formatos de archivos de audio de Linux
- Mplayer no transmite desde stdin sin configuración de caché - Dag Olav Prestegarden
- línea de comando - Cómo convertir wav de 16 bits a audio sin formato
- Old Nabble - linux-audio-dev - la grabación de audio a través de pipe usando mplayer y sox a veces tiene una velocidad incorrecta
- ¿Cómo redirigir la salida de ALSA a un archivo? | Vista de software
- ¿Puedo configurar un dispositivo de audio loopback? - Unix y Linux - Intercambio de pila
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