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 sox
und mplayer
kann 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 play
es sich um sox
ein Paket handelt, nicht um alsa
ein 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 tee
den 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.wav
er ist auch abspielbar, allerdings play test.wav
wird „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:
- Hinweise zu Linux-Audiodateiformaten
- Mplayer streamt nicht von stdin ohne Cache-Einstellung - Dag Olav Prestegarden
- Befehlszeile - So konvertieren Sie 16-Bit-WAV in RAW-Audio - Stack Overflow
- Old Nabble - Linux-Audio-Entwicklung - Audioaufnahme über Pipe mit MPlayer und Sox hat manchmal die falsche Geschwindigkeit
- Wie leite ich die ALSA-Ausgabe in eine Datei um? | Softwareansicht
- Kann ich ein Loopback-Audiogerät einrichten? – Unix und Linux – Stack Exchange
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