- USB 마이크를 이용하여 내 목소리를 녹음하고 있다. 마이크에는 모니터링용 3.5 mm 스테레오 단자가 있어서 헤드폰을 연결할 수 있으나 녹음 중인 내 목소리는 들을 수가 없다.
- USB 마이크를 이용하여 내 목소리를 녹음하고 있다. 유튜브에서 흘러나오는 음악을 배경으로 깔고 싶다면 어떻게 해야 하는가? 단, 음원에 대한 저작권 문제는 없다고 가정한다.
- Behringer UCA200 오디오 인터페이스에 Alesis NanoPiano를 연결하여 녹음을 하면서 실시간으로 모니터링을 하고 싶다. 하지만 UCA200과 NanoPiano에는 헤드폰 출력 단자가 없다.
$ pacmd list-sinks | grep -e 'name:' -e 'index:' * index: 0 name: <alsa_output.pci-0000_00_1b.0.analog-stereo> index: 1 name: <alsa_output.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-stereo>
$ pactl load-module module-loopback sink=alsa_output.pci-0000_00_1b.0.analog-stereo 24
일단 24번이라는 모듈 번호를 기억해 두라. 나중에 모듈을 내릴 때 필요하다. 실은 이 번호를 기억하지 못해도 'pacmd list-modules' 명령으로 알 수 있다. 웹브라우저를 작동시켜서 유튜브 동영상 재생을 시작한 다음, 명령행에서 녹음 명령(arecord)을 내린다.
$ arecord -f cd -d 300 test.mp3
상단의 'Loopback to 내장 오디오'에는 무엇을 선택하여야 할까? 고를 수 있는 것은 다음 중 하나이다.
정답은 두 번째인 'PCM2912A Audio Codec 아날로그 모노'이다. 이렇게 연결하면 마이크로 입력되는 음성이 default sink로 선언한 내장 오디오로 들어가게 된다. 녹음 프로그램인 arecord의 실행 여부와 상관없이 마이크에 대고 말한 것이 음성이 내장 오디오(헤드폰)를 통해 나올 것이다.
module-loopback을 로드할 때 아예 source를 지정해도 된다. 'pacmd list-source' 명령어를 이용하여 source의 정확한 명칭을 알아낸 뒤 'pactl load-module' 명령에서 'source=NAME' 처럼 파라미터로 제공한다. 아래 사례에서는 sink가 정확히 작동하는 것을 알고 있기에 따로 지정하지 않았다.
$ pacmd list-sources | grep -e 'name:' -e 'index:' index: 0 name: <alsa_output.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-stereo.monitor> * index: 1 name: <alsa_input.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-mono> index: 2 name: <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor> index: 3 name: <alsa_input.pci-0000_00_1b.0.analog-stereo> $ pactl load-module module-loopback source=alsa_input.usb-Burr-Brown_from_TI_USB_audio_CODEC-00.analog-mono 22
하단의 'ALSA plugin [aplay]: Alsa Capture from'을 연결하기 위해 선택 사항도 이와 동일한 네 가지이다. 2번과 3번을 고르면 마이크 음성 입력을 잘 받아들여 녹음이 된다. 그러나 유튜브에서 재생하는 음악 소리를 같이 녹음하려면 3번의 'Monitor of 내장 오디오 아날로그 스테레오'를 선택해야 한다.
눈치가 빠른 사람은 녹음 중에 조금 부자연스러운 것을 느꼈을 것이다. 스피커에서 나오는 내 음성이 조금 뒤늦게 나온다는 것을. 이는 module-loopback을 로드할 때 'latency_msec=5' 정도의 파라미터를 주면 된다. 기본값은 200(단위는 msec)이니 평균적인 청력을 지닌 사람이라면 레이턴시를 느낄 수 있다. 파라미터를 바꾸어서 모듈을 다시 로드하려면 'pulseaudio -k' 명령을 입력하여 PulseAudio를 완전히 재시작하거나, 다음의 명령을 입력하여 방금 올렸던 모듈을 내린 다음 다시 pactl load-module 명령어를 원하는 파라미터와 함께 실행한다. 24라는 모듈 번호는 실제 상황에 맞게 입력해야 한다.
$ pactl unload-module 24
이상과 같이 PulseAudio의 루프백 기능을 쓰면 어렵지 않게 두 개(혹은 그 이상?)의 오디오 디바이스를 연결할 수 있게 된다. 좀 더 고급 기능을 맛보려면 가상 싱크(혹은 소스)를 사용하면 된다는데 아직 그 필요성을 느끼지 못하고 있다. 다음의 웹사이트를 숙독하면 많은 발전이 있을 것이다!
Emma Joe Anderson - PulseAudio Loopback
여기에서 설명하는 주요 개념만 간략하게 소개해 보겠다. 보편적으로 쓰이는 정의와는 약간 다를 수도 있다. 디바이스는 마이크, 스피커, 헤드폰과 같은 물리적 오디오 장치이다(USB 오디오 인터페이스는 디바이스가 아니다. 흠...). Virtual sink는 virtual device이다. PulseAudio는 근본적으로 비 디바이스(non-device)와 디바이스를 정확히 1:1로만 연결한다. 두 개의 비 디바이스를 연결하려면 virtual sink가 필요하고, 두 개의 디바이스를 연결하려면 loopback을 써야 한다. 루프백은 정확히 하나씩의 입력과 출력을 갖지만, 디바이스는 원하는 수만큼의 루프백을 가질 수 있다.
주요 개념을 이해할 수는 있는데 Anderson의 웹사이트에서 그래프를 그려 설명하는 방식은 아직 어렵다. Virtual device가 필요한 상황은 무엇이 있을까? 좀 더 쉬운 사례를 찾아야 할 듯.
출처: Emma J. Anderson, PulseAudio Loopback. 뭔 말인지 아직 잘 모르겠다. Dig는 구글 행아웃에서 돌아가는 애플리케이션인 모양이다. V1-V3은 virtual sink이다. |
업데이트 - 쉬운 일을 어렵게 하기?
- https://github.com/toadjaune/pulseaudio-config
- https://endless.ersoft.org/pulseaudio-loopback/
- https://gavv.github.io/articles/pulseaudio-under-the-hood
차라리 Ask Ubuntu의 Re-directing applications to virtual sinks가 조금 더 이해하기 쉽다. 안, 어쩌면 StackExchange의 How to create a virtual audio output and route it in Ubuntu-based distro가 virtual sink 및 loopback을 이해하기에 더 좋은 자료라고 생각된다. 질문자가 요구하는 사항은 이러하다.
- 게임을 하는 화면 및 사운드를 OBS로 녹화한다.
- 게임을 하는 동시에 음성 채팅을 하는데, 이 소리는 OBS로 녹화되지 않게 하고 싶다.
댓글 없음:
댓글 쓰기