Я пытаюсь сгенерировать звуковые данные, преобразовать их и сохранить в формате 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: несколько ссылок по теме:
- заметки о форматах аудиофайлов Linux
- Mplayer не транслирует из stdin без настройки кэша - Dag Olav Prestegarden
- командная строка - Как преобразовать 16-битный wav в необработанный звук - Stack Overflow
- Старый Nabble - linux-audio-dev - аудиозапись через канал с использованием mplayer и sox иногда имеет неправильную скорость
- Как перенаправить вывод ALSA в файл? | Software View
- Могу ли я настроить петлевое аудиоустройство? - Unix и Linux - Stack Exchange
решение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