Kommandozeilen-Audio - Piping für gleichzeitige Wiedergabe und Aufnahme

Kommandozeilen-Audio - Piping für gleichzeitige Wiedergabe und Aufnahme

Ich versuche, Tondaten zu erzeugen, sie zu konvertieren und im WAV-Format zu speichern. Ich bin fast fertig - aber ich möchte den erzeugten Ton hörenwährendes wird "aufgezeichnet".

Dieser Befehl generiert lediglich Daten und gibt sie wieder:

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

(Beachten Sie, dass es zu einem Segmentierungsfehler kommen kann, wenn Sie hier Strg+C drücken, nachdem die Tonwiedergabe beendet ist aplay.)

Mit soxund mplayerkann ich problemlos aufnehmen, höre aber gleichzeitig keinen Ton:

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

Beachten Sie hier, dass play test.wav(wobei playes sich um soxein Paket handelt, nicht um alsaein Paket aplay) für die Datei „Dauer: 00:00:03.00“ angibt test.wav. Außerdem scheint dieser Vorgang schneller als in Echtzeit abzulaufen, d. h. er ist (anscheinend) in weniger als 3 Sekunden abgeschlossen.

Durch den Versuch zu betrügen, indem Sie teeden Stream auf die Festplatte aufnehmen,

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

Hier bekomme ich anscheinend den Ton zu hören, während er erzeugt wird – und test.waver ist auch abspielbar, allerdings play test.wavwird „Dauer: unbekannt“ gemeldet.

Ich möchte also fragen: Ist es möglich, so etwas wie den obigen „Einzeiler“-Befehl zu verwenden, um einen Ton zu erzeugen, abzuspielen und aufzunehmen?gleichzeitig- Jedoch,ohnemuss ich es installieren jack?

PS: einige relevante Links:

Antwort1

Sie können tee(1) verwenden, um den Stream zu multiplexen, z. B.

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

Vielleicht interessiert Sie auch der Synthesizer-Effekt von soxs, der die meisten Töne und Sweeps erzeugen kann, z. B.

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

verwandte Informationen