Running PulseAudio를 한번 훑어보자. 과연 내 리눅스 시스템에 PulseAudio가 설치되어 돌아가는 중인가? 우분투/데비안 계열이라면 그럴 가능성은 200%이다. 그럼에도 불구하고 확신이 들지 않는다면 다음 명령어를 입력해 본다.
$ pulseaudio --check # 아무 것도 나오지 않으면(exit code 0) 실행 중이라는 뜻이다. # 또는 다음과 같이 입력하여 무언가 줄줄 출력된다면 실행 중이라는 뜻이다. $ pactl list # or 'pactl list short' $ pactl list short sinks # or 'pacmd list-sinks'
PulseAudio는 autospawn 기능에 의해 클라이언트 요청이 있으면 저절로 시작된다. 따라서 PulseAudio을 중단하려면 ~/.config/pulse/client.conf 또는 /etc/pulse/client.conf 파일에서 “autospawn = no”으로 설정을 한 뒤 다음을 실행한다.
$ pulseaudio --kill # 'pulseaudio -k' 또는 다음과 같이 실행한다. $ killall pulseaudio
PulseAudio는 start-pulseaudio-x11 명령을 통해 실행된다. 설정 파일은 /etc/xdg/autostart/pulseaudio.desktop이다. /etc/xdg/autostart는 graphical session manager가 사용자 로그인시 자동으로 실행하는 응용 프로그램의 정보를 수록한 디렉토리이다.
PulseAudio를 다시 시작하려면 설정 파일을 “autospawn = yes”로 되돌린 후 다음을 실행한다.
$ pulseaudio --start
$ man pulse-cli-syntax # PulseAudio Command Line Interface Syntax
두 프로그램이 어떤 차이가 있는지 쉽게 구별할 수 있겠는가? 잘 모르겠다. control과 reconfigure의 차이인데, 예컨대 음량을 바꾸는 것은 control의 범주이고, loopback을 설정하는 것은 reconfigure의 범주에 속하는 것 같다. pacmd는 세부 명령어를 직접 입력할 수 있는 간단한 live shell을 제공하기도 한다.
$ pacmd Welcome to PulseAudio 11.1! Use "help" for usage information. >>>
'pactl list [short] [TYPE]' 명령에서 TYPE은 modules, sinks, sources, sink-inputs, source-outputs, clients, samples, cards 중의 하나가 되어야 한다. pacmd 명령에서는 samples만 제외한 나머지 7개에 대하여 'pacmd list-modules'와 같은 방식으로 명령을 내려야 한다. 두 명령어의 출력 포맷은 같지 않다.
set-sink-volume 바로 뒤의 숫자는 사운드 카드의 인덱스를 의미한다.
$ pactl -- set-sink-volume 0 +10% $ pactl -- set-sink-volume 0 80%
pavucontrol → Output Devices 탭을 열어 놓고 pactl로 음량 조절을 해 보라.
paplay, parec, parecord, pamon은 전부 pacat을 가리키는 심볼릭 링크이다. 다른 이름으로 불리고 있지만 실제로는 하나의 실행 파일이 녹음과 재생 등 다양한 역할을 수행하는 것이다.
parec은 PulseAudio 사운드 서버를 거치는 오디오 스트림(예: 애플리케이션의 출력)을 녹음하는 유틸리티이다. 이것을 그대로 사용하기에는 꽤 난해하니(바로 다음에 새로 추가한 섹션에 따르면 그렇지도 않음) 이를 응용하여 만든 스크립트인 pulse-recorder.bash를 사용하는 것이 편리하다.
pulse-recorder.bash를 이용하여 유튜브의 재생음을 녹음하는 방법은 다음과 같다. 녹음하려는 애플리케이션이 재생 중인 상태여야 이것(sink-input)의 인덱스 번호를 구할 수 있다. 출력 파일에는 temp.ogg라는 이름이 자동으로 붙는다.
$ pulse-recorder.bash index: 2 application.name = "Firefox" module-stream-restore.id = "sink-input-by-application-name:Firefox" Choose recording index: 2 temp.ogg file already exist, replace (y/n)? y Encoding standard input to "temp.ogg" at approximate bitrate 192 kbps (VBR encoding enabled) Encoding [ 1m05s so far] - # Ctrl+C를 눌러서 녹음을 종료하고 소리를 들어보자. $ ogg123 temp.ogg Audio Device: PulseAudio Output Playing: temp.ogg Ogg Vorbis stream: 2 channel, 44100 Hz Done. # GUI 재생기를 써 보자. $ parole temp.ogg 2> /dev/null & $ vlc temp.ogg
왜 하필이면 OGG 파일인가? 이 포맷은 대중적인 MP3보다 압축률이 더 크고, 무엇보다도 공개된 포맷이라서 라이센스 제한이 없다는 점이 유용하다. pulse-recorder.bash 스크립트는 Ask Ubuntu의 질문 Record a program's output with PulseAudio에 대한 답변으로 만들어진 것이다. parec을 '날것'으로 이용하여 오디오 스트림을 녹음하는 방법을 익히려면 이 Ask Ubuntu의 글을 꼼꼼히 읽어보면 도움이 될 것이다. module-combine-sink 모듈과 move-sink-input 명령을 알아야 이 과정을 이해할 수 있다.
바로 위 섹션에서는 parec을 이용하여 애플리케이션의 재생음을 녹음하는 방법을 설명하였다. USB 오디오 장비를 연결하지 않은 상태에서 헤드셋을 컴퓨터에 꽂은 다음, 마이크 입력을 parec으로 녹음하는 간편한 방법이 있는지를 찾아보았다. Jérôme Belleman의 Recording the Sounds of your Computer가 좋은 힌트가 되었다. 이 방법은 애플리케이션이 아니라 sink 또는 source device를 지정한다는 점이 앞서 소개한 방법과는 조금 다르다.
$ parec -d # 이 상태에서 탭을 쳐 보라. alsa_input.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
Source로 사용할 수 있는 디바이스는 *input*(마이크) 또는 output*.monitor이다. 무엇을 써야 마이크로 녹음이 될지는 명백하다.
$ parec -d alsa_input.pci-0000_00_1b.0.analog-stereo | twolame -r - out.mp3 --------------------------------------------------------- Input Filename: STDIN Output Filename: out.mp3 Raw input format: 2 channels, 16-bit, 44100 Hz --------------------------------------------------------- LibTwoLame 0.3.13 (http://www.twolame.org) Input : 44100 Hz, 2 channels Output: 44100 Hz, Stereo 192 kbps CBR MPEG-1 Layer II psycho model=3 [De-emph:Off Copyright:No Original:Yes] [Padding:Off CRC:Off Energy:Off ] --------------------------------------------------------- Encoding frame: 447 # Ctrl+C를 눌러서 종료 $ play out.mp3
lame과 twolame은 거의 같은 기능을 하는 것 같다. twolame은 녹음이 진행될 때 친절하게 화면에 정보를 뿌리는 것이 마음에 든다. 다른 encorder를 쓰는 방법을 알아보자. CLI로 녹음하는 일에 재미를 들이면 아마도 각종 encorder의 파라미터를 공부하는 자신을 발견하게 될 것이다.
$ DEVICE=alsa_output.pci-0000_00_1b.0.analog-stereo.monitor $ parec -d ${DEVICE} | oggenc -b 192 --raw - -o temp.ogg $ parec -d ${DEVICE} | lame -r -q 3 --lowpass 17 --abr 192 - temp.mp3 $ pared -d ${DEVICE} | sox -t raw -r 44100 -L -e signed-integer -S -b 16 -c 2 - "output.wav" # parec 명령어는 파일 포맷을 지정하여 직접 오디오 파일로 기록할 수도 있다. $ parec -d ${DEVICE} --file-format=wav output.wav $ parec -d ${DEVICE} -v --file-format=wav output.wav 샘플 사양 '녹음', 채널 맵 's16le 2ch 44100Hz'으로 front-left,front-right 스트림을 엽니다. 연결되었습니다. 스트림이 성공적으로 생성되었습니다. 버퍼 지표: maxlength=4194304, fragsize=352800 샘플 사양 's16le 2ch 44100Hz', 채널 맵 'front-left,front-right' 사용. 장치 alsa_output.pci-0000_00_1b.0.analog-stereo.monitor에 연결되었습니다(색인: 0, 정지됨: no). 시간: 6.870 sec; 지연: -24419 usec.
parec은 libsndfile이 지원하는 모든 파일 포맷을 인식한다. libsndfile 패키지에 포함된 프로그램들(sndfile-*)에는 쓸만 한 것들이 제법 있어 보인다.
JACK을 실행한 상태에서 'parec -d ' + tab을 눌러 보자.
$ parec -d alsa_input.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo alsa_output.pci-0000_00_1b.0.analog-stereo.monitor jack_in jack_out jack_out.monitor
jack_out.monitor를 선택하여 애플리케이션 재생음을 녹음하면 된다.
$ parec -d jack_out.monitor | twolame -r - out.mp3
JACK 실행 중에는 'parec -d alsa_output.pci-0000_00_1b.0.analog-stereo.monitor'로 녹음을 하여 MP3 파일을 만들었더니 재생이 안 되는 현상을 발견하였다. 이에 대해서는 좀 더 알아보도록 하자.
WAV 파일은 'pacat file.wav' 명령을 이용하여 재생할 수 있다. MP3 파일이라면 디코더가 필요할 것이다. 그러나 mpg123이나 play(+libsox-fmt-mp3 or libsox-fmt-all)와 같은 훌륭한 MP3 재생기가 있으므로 디코더를 병용해야 하는 pacat을 써야 할 이유가 별로 없다.