특정 사운드 카드에 오디오를 녹음하는 쉽고 응용 프로그램 독립적인 방법이 있습니까?
USB 헤드셋이 연결되어 있고 로 표시된다고 가정해 보겠습니다 /dev/snd/foo
.
그런 다음 Zoom이나 Skype 또는 기타 앱을 사용하여 전화를 겁니다.
응용 프로그램이 로컬 녹음을 허용하지 않는 경우 사운드 카드 수준에서 독립적으로 오디오를 녹음할 수 있습니까?
나는 alsa를 사용하고 있으며 사운드 카드에 연결하거나 "미러링"하고 오디오를 파일에 덤프할 인프라가 있을 것이라고 (순진하게) 상상합니까? 두 개의 채널(마이크, 스피커)을 녹음해야 하는데 약간의 믹싱이 필요한가요?
내 OS는 Debian 10이고 alsa(pulseaudio 아님)를 사용하고 있습니다.
답변1
특정 사운드 카드에 오디오를 녹음하는 쉽고 응용 프로그램 독립적인 방법이 있습니까?
예! 가지다!
당신이 찾고 있는 것은 단순히 사운드 카드의 출력을 녹음하는 것입니다.
가장 쉬운 방법은 아마도 출력을 입력에 연결하는 것입니다.루프alsa 드라이버는 무선 모드를 제공합니다.
A/ 먼저 드라이버가 로드되고 제대로 초기화되었는지 확인하세요.
arecord -l
(내 시스템에서) 다음을 표시하여 이를 알려줄 수 있습니다.
card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
Subdevices: 8/8
Subdevice #0: subdevice #0
Subdevice #1: subdevice #1
Subdevice #2: subdevice #2
Subdevice #3: subdevice #3
Subdevice #4: subdevice #4
Subdevice #5: subdevice #5
Subdevice #6: subdevice #6
Subdevice #7: subdevice #7
물론 구현에 따라 카드 ID가 위 목록과 다를 수 있습니다.
해당 출력을 얻지 못한다면 아마도 드라이버가 로드되지 않았기 때문일 수 있습니다. 따라서 fire: modprobe snd-aloop
.
그래도 실패하면 커널 .config 파일(CONFIG_SND_ALOOP에 대한 grep)에서 드라이버가 선택되었는지 확인하십시오.
B/ 기본적으로 예상대로 작동하는지 확인하세요.
이 드라이버는 교차 연결된 장치 쌍을 제공하여 전이중 서라운드 에코 사운드 카드를 형성합니다. 한 장치를 여는 첫 번째 애플리케이션은 다른 장치를 열려고 시도하는 두 번째 애플리케이션이 설정된 매개변수를 사용하도록 강제합니다. 따라서 속도, 형식 또는 채널 번호 변환이 발생하지 않습니다. 결론은 재생 애플리케이션을 먼저 실행해야 한다는 것입니다. 이제 예상대로 작동하는지 확인해 보겠습니다.
1/.wav 파일을 찾아 카드 0 장치 0 하위 장치 0에서 재생합니다.aplay -D hw:0,0,0 whatever.wav
2/연결된 교차 연결 장치 카드 0 장치 1 하위 장치 0의 레코드:arecord -D hw:0,1,0 record.wav
물론 구성에 따라 카드 ID를 조정해야 할 수도 있습니다.
삼/alsa 기본 장치에서 Record.wav를 재생하여 제대로 작동하는지 확인하세요 aplay record.wav
. 아무 소리도 들리지 않는다면 아마도 기본적인 alsa 구성 오류 때문일 것입니다. (필요하다면 자세히 설명할 수 있습니다)
물론 이와 같이 작동하면(재생을 루프백으로 지정) 출력이 기본 재생 장치로 전송되지 않으므로 녹음하는 동안 아무 소리도 들리지 않습니다. 어쨌든 이는 일부 특정 alsa 구성에서 가능합니다.
C/ 오디오를 귀에서 재생하고 녹음을 활성화합니다.
경고하다! : alsa 프로필은 항상 필요하기 때문에 이것은 작업에서 가장 어려운 부분이 될 것입니다... 마법의 중요한 부분입니다.
이렇게 하려면 /etc/asound.conf 파일(구성이 시스템 전체인 경우) 또는 $HOME/.asoundrc(구성이 유일한 사용자에게 적합한 경우)에서 처음부터 여러 가상 사운드 장치를 생성해야 합니다.
1/준 별칭 정의 시작
pcm.MAUDIO{
type hw
card M2496
device 0
subdevice 0
nonblock true}
ctl.MAUDIO{
type hw
card M2496}
이 예는 내 시스템과 관련이 있습니다.
- MAUDIO(원하는 대로 선택)는 하드웨어 사운드 장치의 향후 참조를 위한 별칭 역할을 합니다.
- M2496은 내가 선호하는 사운드 재생 하드웨어 장치와 연결된 CARD=M2496에서 옵니다(출력에 따라 조정해야 함
aplay -L
). - nonblock true는 Alsa가 사운드 카드 장치 드라이버와 관련된 문자 특수 파일(/dev/snd/pcmwhatever)을 잠그는 것을 원하지 않기 때문에 true입니다. (따라서 다른 어떤 애플리케이션보다 필요할 때 열 수도 있습니다)
그런 다음 루프백 장치를 계속 사용하십시오.
pcm.loopin {
type plug
slave.pcm "hw:Loopback,0,0"
}
pcm.loopout {
type plug
slave.pcm "hw:Loopback,1,0"
}
2/물론 믹서기가 필요해요
pcm.dmixer{
type dmix
ipc_key 219345
slave{
pcm MAUDIO
format S32_LE
period_size 1024
buffer_size 4096 }}
~을 위한ipc_키고유한 공유 메모리 키를 선택하십시오( ipcs -ma
선택한 것이 사용 중이 아닌지 확인하십시오). period_size 및 buffer_size 값은 예상 대기 시간(낮은 값, 낮은 대기 시간) 및 시스템 성능(낮은 값, XRun 확률 높음)에 따라 달라집니다.
3/ 물론 모든 것이 이전처럼 작동하기를 원합니다.(구성 없음)
pcm.!default{
type plug
slave.pcm "dmixer"
hint{
show on
description "Alsa Default Device"}}
이는 오디오 출력 장치 선택을 허용하는 모든 애플리케이션에 설명된 alsa 기본 장치를 정의합니다.
이제 우리에게 필요한 것은 하드웨어 사운드 장치와 루프백 장치에 입력을 복사할 수 있는 의사 장치를 정의하는 것뿐입니다. 이건 알사님 덕분이에요많은끼워 넣다.
4/ 오디오를 하드웨어 사운드 장치로 라우팅하고 루프백으로 복사
pcm.multi {
type route;
slave.pcm {
type multi;
slaves.a.pcm "MAUDIO";
slaves.b.pcm "loopin";
slaves.a.channels 2;
slaves.b.channels 2;
bindings.0.slave a;
bindings.0.channel 0;
bindings.1.slave a;
bindings.1.channel 1;
bindings.2.slave b;
bindings.2.channel 0;
bindings.3.slave b;
bindings.3.channel 1;
}
ttable.0.0 1;
ttable.1.1 1;
ttable.0.2 1;
ttable.1.3 1;
}
Slavs.a.pcm "MAUDIO" 대신에slaves.a.pcm "dmixer"를 선호할 수도 있습니다.
제품의 경우 별칭을 정의합니다.
pcm.pbnrec {
type plug
slave.pcm "multi"
hint{
show on
description "Alsa Playback & Record"}}
D/가자!
시스템 전체를 구성하려면 시스템을 종료하고 재부팅하고, 사용자 고유의 .asoundrc를 구성하려면 로그아웃하세요. 그 시점부터 선호하는 오디오 출력 장치를 선택할 수 있는 정직한 오디오 응용 프로그램에서 "Alsa 재생 및 녹음" 장치를 선택한 다음 명령줄에서 재생을 시작할 수 있습니다.
- 장치의 "루프" 기록
- 리샘플링/다른 파일 형식을 원하면 "루프" 장치에서 ffmpeg를 사용하세요.
- 더 편리한 녹음 데스크탑 유틸리티를 실행하세요.용감한.
에/하! 이는 플레이어 A, B, C에서는 작동하지만 D, E, F 애플리케이션에서는 작동하지 않습니다.
불행하게도 많은 최적이 아닌 응용 프로그램에서는 원하는 출력 장치를 선택할 수 없습니다. 특히 브라우저. alsa default pcm으로 출력되므로 구성 파일을 조정하고 pcm.!default 설명을 다음과 같이 변경해야 합니다.
pcm.!default {
type plug
slave.pcm "pbnrec"
}
F/FTS! Firefox 및 Chrome에서는 여전히 작동하지 않습니다.
1/크롬 합금
솔직히... 제가 써봤기 때문에 말씀드릴 수는 없습니다크롬. --alsa-output-device 옵션을 지정하지 않으면 Chromium은 기본적으로 펄스 오디오 출력을 사용합니다. 따라서 Chrome을 실행 --alsa-output-device='default'
해 보고 작동하는지 들어봐야 합니다. 현재 사용 중인 Chrome 96에서도 작동합니다.
2/파이어폭스 브라우저
심각한 이유가 무엇이든 Firefox는 pluseaudio 권한을 부여하기로 결정했으며, 제가 아는 한 공식 바이너리를 사용하여 이 문제를 해결할 수 있는 방법은 없습니다. 그러나 소스에서 Firefox를 빌드할 때 alsa 백엔드 빌드를 활성화하는 make 옵션이 있습니다. 데비안에서 이것을 달성하는 방법을 모르지만 거의 확실히 가능합니다. 제가 말할 수 있는 것은 현재 버전인 91.4.0에서 작동한다는 것뿐입니다.
신용 거래:OP는 권위 있는 출처를 원하기 때문에 이 답변의 모든 내용은 다음에서 자세히 설명됩니다.
선택하다
사운드 서버는 위에서 설명한 alsa 바이올린에 대한 실행 가능한 대안이 될 수 있습니다. (일부 처리 능력이 희생됨) 사운드 서버는 수십 년 동안 선택되어 왔습니다.잭 오디오 연결 키트.Pulseaudio는 경쟁한 적이 없습니다.
하지만...그것은 또 다른 이야기입니다.
댓글 후 추가 정보
1/ 샘플링 속도
snd-aloop 드라이버 자체는 고정된 샘플 속도에 구속되지 않습니다. 원하는 경우 모든 하위 장치를 다른 샘플링 속도로 실행할 수 있습니다.
그러나 하위 장치를 여는 첫 번째 애플리케이션은 교차 페어링된 하위 장치의 샘플링 속도를 결정합니다(변환이 완료되지 않았기 때문).
실제로 이는 재생 애플리케이션이 PBSourceHz로 출력하고 녹음 애플리케이션이 PBSourceHz 샘플 속도로 샘플을 캡처한다는 것을 의미합니다.
이것이 불편하고 리샘플링이 필요한 경우 녹음 애플리케이션을 나타냅니다.
ffmpeg는 데스크톱 녹음 응용 프로그램과 마찬가지로 즉시 이 작업을 수행할 수 있습니다(아마도 ffmpeg 덕분일 것입니다).
실제로 이는 하드웨어 사운드 장치에 사운드를 푸시하는 데 사용되는 의사 장치가 PBSource Hz에서 입력을 샘플링한다는 의미이기도 합니다.
실제로 사운드 장치의 (고정) HW hz 샘플링 속도와 불일치하여 음질이 저하될 수 있습니다.
Alsa는 이 문제를 극복하기 위한 두 가지 방법을 제공합니다.
- 사용속도플러그인은 특정 주파수로 리샘플링을 강제합니다. alsa는 체계적으로 다시 샘플링하기 때문에 이는 다소 차선책입니다. (소스의 샘플 레이트가 주어진 샘플 레이트와 동일한 경우에도 마찬가지)
- 사용혼합플러그인(위의 §C-2,3 참조)은 필요한 경우에만 자동으로 리샘플링합니다.
defaults.pcm.rate_converter의 정의를 통해 선호하는 리샘플링 알고리즘을 선택할 수도 있습니다.