Командная строка аудио — конвейеризация для одновременного воспроизведения и записи

Командная строка аудио — конвейеризация для одновременного воспроизведения и записи

Я пытаюсь сгенерировать звуковые данные, преобразовать их и сохранить в формате WAV. Я почти у цели - кроме того, что я хотел бы услышать сгенерированный звукпокаэто «записывается».

Эта команда просто генерирует данные и воспроизводит их:

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

(Обратите внимание, что если вы нажмете Ctrl-C здесь после того, как звук остановится, aplayможет произойти сбой сегментации)

Используя soxи mplayer, я могу нормально записывать, но в то же время не слышу звука:

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

Обратите внимание, что play test.wav(где playиз soxпакета, а не alsa's aplay) будет указано "Длительность: 00:00:03.00" для test.wavфайла. Кроме того, этот процесс, похоже, выполняется быстрее, чем в реальном времени, т.е. завершается (по-видимому) менее чем за 3 секунды.

Пытаясь обмануть, используя teeдля записи потока на диск,

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

Здесь, по-видимому, я могу услышать звук по мере его генерации, и test.wavего также можно воспроизвести, однако play test.wavвыводится сообщение «Длительность: неизвестна».

Поэтому я хотел бы спросить - возможно ли сделать что-то вроде приведенной выше "однострочной" команды, чтобы и генерировать, и воспроизводить, и записывать звук?в то же время- однако,безнеобходимость установки jack?

PS: несколько ссылок по теме:

решение1

Вы можете использовать tee(1) для мультиплексирования потока, например:

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

Вас также может заинтересовать эффект синтезатора Soxs, который может воспроизводить большинство тонов и свипов, например

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

Связанный контент