====== 리눅스 커맨드라인으로 녹음을 ====== PulseAudio를 사용하여 PC에서 재생되는 소리를 덤프한다. ===== 준비 ===== pactl, parec, sox가 필요하다. 참고로 이번 조사로 처음 알게 된 프로그램. sox의 MP3 인코딩을 위해서는 우분투 기준 libsox-fmt-mp3 패키지를 별도로 설치한다. ===== 준비 과정 ===== ==== 장치 탐색 ==== pactl list 이렇게 하면 리스트가 너무 많으니, pactl list | grep -A3 '^소스 #' 줄여 보자. grep에 대해서는 미리 검색해보자. 출력이 한글로 나올 수 있다. 이제 좀 더 줄여 보자. awk의 $NF는 마지막 필드를 말한다. "monitor"라고 된 소스를 고르는 것이 도움이 될 것이다. pactl list | grep -A3 '^소스 #' | grep '이름: .*\.monitor$' | awk '{print $NF}' 이 결과로 현재 PC에서는 "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor"을 얻을 수 있었다. ==== parec, sox로 녹음 ==== ''parec''은 pulse audio의 오디오 데이터를 리다이렉트 시켜 주는 명령이다. ''sox''는 음원에 대해 여러 작업을 할 수 있는 명령이다. parec -d "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" | sox -t raw -r 44100 -e signed-integer -L -b 16 -c2 - -t mp3 -C "-4.2" out.mp3 이렇게 하면 소리가 출력되는 측시 out.mp3로 소리가 인코딩되어 저장된다. sox에서도 디바이스를 지정할 수 있지만 위처럼 리다이렉트 하는 것이 더 효율적으로 보인다. 왜냐면, 스크립트 시작 후 실제 소리 출력이 없는 동안은 parec이 출력을 내어 놓지 않아 무음구간을 만들지 않기 때문이다. 인코딩을 나중에 하고 싶다면 물론 이렇게 WAV로 저장할 수도 있다. parec -d "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" | sox -t raw -r 44100 -e signed-integer -L -b 16 -c2 - -t wav out.wav mp3의 경우 비트레이트 옵션이 관심의 대상이 된다. sox의 매뉴얼을 참고하자. 간단한 것만 보자면, * 고정 비트레이트의 경우 -C 128 처럼 주면 된다. 이 경우 128kbps로 인코딩된다. * -C 128.1처럼 소수점을 줄 수 있다. 디폴트는 .2이다. .0은 기본값을 쓴다는 뜻이다. .01은 최상의 퀄리티. .9는 가장 낮은 퀄리티이다. * 가변 비트레이트의 경우 음의 실수 표현을 쓴다. -C "-." 처럼 표현한다. 기본은 4.2. 더 자세한 것은 매뉴얼을 참고하자. ==== 검증 ==== 적당한 동영상을 열어 재생 준비를 한다. 위 명령을 커맨드라인에 입력하여 녹음 준비를 하고, 동영상을 적절한 시간동안 재생한다. 동영상 재생을 중지하고 커맨트라인의 명령 또한 중지한다. 출력으로 나온 mp3 파일 또한 재생기에서 제대로 재생되는지 확인한다. ===== 출처 ===== * https://ubuntuforums.org/showthread.php?t=1330728 * https://outflux.net/blog/archives/2009/04/19/recording-from-pulseaudio/ * https://outflux.net/software/pa-clone * http://sox.sourceforge.net/soxformat.html