명령줄 오디오 - 동시 재생 및 녹음을 위한 파이프

명령줄 오디오 - 동시 재생 및 녹음을 위한 파이프

사운드 데이터를 생성하고 변환하여 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(여기서는 's' 가 아닌 패키지 play에서 ) 파일에 대해 "Duration: 00:00:03.00"으로 표시됩니다 . 또한 이 프로세스는 실시간보다 빠르게 실행되는 것 같습니다. 즉, (분명히) 3초 이내에 완료됩니다.soxalsaaplaytest.wav

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

관련 정보