Pulseaudio 싱크를 가상 소스로 리디렉션

Pulseaudio 싱크를 가상 소스로 리디렉션

Zoom(화상 회의 소프트웨어)에서 문제의 사운드를 재생할 수 있도록 프로그램(제 경우에는 ffmpeg)의 사운드를 소스로 리디렉션하려고 합니다. 이를 수행하는 전통적인 방법은 모든 싱크에 모니터가 함께 제공되므로 Zoom의 음원으로 SinkName.monitor 소스를 선택하는 것입니다. 하지만 :

1) Zoom은 마이크 드롭다운에 모니터 소스를 나열하지 않습니다. Zoom이 이를 받아들이도록 속이기 위해 모니터의 device.class 속성을 "sound"("monitor" 대신)로 설정해 보았으나 소용이 없었습니다.

2) Zoom은 pavucontrol에서 소스를 직접 설정하는 것을 거부하는 것 같습니다. 녹음 탭에서 Zoom에서 들을 수 있는 다른 소스를 직접 설정하려고 하면 무엇을 선택하든 내 선택이 무시됩니다. 드롭다운 옵션도 변경되지 않습니다. ~/.alsoftrc를 생성하고 "[pulse]"(새 줄) "allow-moves=yes"를 작성하면 도움이 될 수 있다는 내용을 어딘가에서 읽었지만 아무 소용이 없었습니다.

따라서 나는 나만의 소스를 설정하고 "사운드를 해당 소스로 리디렉션"하려고 합니다. 나는 널 싱크, 널 소스 및 루프백을 만들었지만 pavucontrol을 열 때 아마도 거꾸로 된 것 같다는 것을 깨달았습니다. 루프백은 소스를 싱크로 리디렉션하는 데 사용되는 것으로 보입니다. 그 반대는 아닙니다(pavucontrol은 재생 아래에서 "[...] MySink의 MySource 루프백"이라고 말합니다. MySink는 오른쪽에 있는 드롭다운 목록의 값입니다. ).

내가하려는 일을 달성 할 수있는 방법이 있습니까? 어느 하나:

a) 일반 마이크처럼 보이도록 모니터를 수정하거나

b) 싱크의 소리를 소스로 리디렉션합니까?

감사해요.

답변1

다음 설정은 Linux에서 Zoom과 애플리케이션 오디오를 공유하는 데 효과적입니다. 설정은 그대로 마이크와 애플리케이션 오디오를 Zoom에 제공합니다. 하지만 마지막에 설명했듯이 둘 중 하나만 사용하도록 변경할 수도 있습니다.

마이크와 일부 애플리케이션 오디오를 믹싱할 싱크를 만듭니다.

pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone

애플리케이션 오디오를 가져와서 스피커와 방금 만든 특수 믹싱 싱크로 보내는 싱크를 만듭니다( alsa_output….analog-stereo싱크 이름으로 바꾸세요. 참조 pactl list sinks short).

pactl load-module module-combine-sink sink_name=virtual-microphone-and-speakers \
slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo

실제 마이크를 믹싱 싱크로 루프백합니다( alsa_input…analog-stereo소스 이름으로 교체, 참조 pactl list sources short).

pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo \
sink=mix-for-virtual-mic latency_msec=20

Zoom이 실제로 마이크가 무엇인지 어떻게 결정하는지 확실하지 않습니다. 모니터를 사용하라고 말할 수는 없지만 (Paul이 설명한 대로) 소리를 듣습니다 echo-cancel. 실제로 취소하려는 에코가 없으므로 취소할 가짜 싱크를 만듭니다.

pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel

마지막으로 Zoom이 감지하는 마이크 역할을 할 에코 제거 소스를 만듭니다.

pactl load-module module-echo-cancel \
sink_name=virtual-microphone source_name=virtual-microphone \
source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null \
source_properties=device.description=Virtual-Microphone \
sink_properties=device.description=Virtual-Microphone

이제 Zoom의 마이크 섹션에 가상 마이크가 표시됩니다.

애플리케이션 오디오를 가상 마이크에 보내려면 에서 pavucontrol애플리케이션의 싱크를 Mix-for-Virtual-Microphone(가상 마이크로만 보내기 위해) 또는 "Mix-for-Virtual-Microphone에 대한 동시 출력, …"으로 설정합니다. 마이크와 스피커로 보내려면

에서 "동시 출력..."의 볼륨을 변경하여 마이크의 실제 볼륨과 관계없이 가상 마이크 및 스피커의 애플리케이션 오디오 볼륨을 음소거하거나 변경할 수도 있습니다 pavucontrol.

당연히 "입력 장치" 섹션에서 마이크를 음소거하여 애플리케이션 오디오만 공유할 수 있습니다.

다음은 더 쉽게 이해할 수 있도록 이 설정을 시각화한 것입니다.

설정 그래프.

답변2

다른 방법을 찾았습니다: 모듈-파이프-소스.

pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1

그 다음에:

ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic

(이것은 또한 v412loopback 모듈을 사용하여 웹캠을 가짜로 만듭니다.)

답변3

OBS를 Zoom으로 라우팅하고 싶었습니다. V4l2loopback을 사용하여 비디오를 연결했습니다(참조https://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/). 오디오를 연결하려면 다음이 작동합니다.

#!/bin/sh

# This created something I could see in OBS.  Set it as the monitor device in Settings->Audio.  Then
# turn on monitoring for the microphone and the video.

pactl load-module module-null-sink sink_name=Virtual-Speaker sink_properties=device.description=Virtual-Speaker

# Now I need to take the monitor stream from the Virtual-Speaker and turn it into a source that Zoom can use
# as a microphone.

pactl load-module module-remap-source source_name=Remap-Source master=Virtual-Speaker.monitor

OBS에서 동영상을 재생하면서 오디오/비디오가 정렬된 상태에서 동영상 위에 해설을 추가하려고 하면 올바르게 동기화되지 않습니다.

업데이트:

한동안 이것을 사용해 본 결과 내 흐름은 다음과 같습니다.

  1. 컴퓨터 부팅,
  2. 스크립트 실행,
  3. OBS를 시작합니다(카메라를 제어하고 가상 비디오 피드를 시작합니다).
  4. Zoom을 시작합니다(가상 피드를 캡처하지만 때로는 오디오 지연이 발생함).
  5. OBS를 종료하고,
  6. OBS를 시작합니다(이제 오디오가 지연되지 않습니다).
  7. 수업을 가르치다.

다른 수업을 가르쳐야 하는 경우:

  1. 줌 종료,
  2. 새로운 Zoom 회의를 시작하세요.
  3. OBS를 종료하고,
  4. OBS를 시작하세요.
  5. 2학년을 가르치다

이 프로세스는 한동안 나에게 신뢰할 수 있었습니다. 프로세스에 추가 자동화를 추가하려고 시도하지 않았습니다. 이론(실제 증거 없음): 프로그램이 올바른 장치를 잡을 수 있도록 ZOOM 전에 OBS를 시작해야 합니다. OBS는 오디오 파이프라인에 항목을 넣기 시작하므로 파이프라인을 플러시하려면 OBS를 중지했다가 다시 시작해야 합니다.

답변4

Zoom에서도 같은 문제가 발생했습니다. 대안은 module-echo-cancel. 기존 모니터 소스에서 새 소스를 생성할 수 있습니다. 기본 설정에서는 처리가 거의 이루어지지 않는다고 생각합니다.

pactl load-module module-echo-cancel \
   sink_name="echo_cancel" \
   source_master="YourSink.monitor" \
   sink_master="DefaultSink" \
   aec_method="webrtc"

DefaultSink기본 출력 장치와 YourSink.monitor싱크 모니터(이 경우 스트림 싱크)로 설정합니다 .

나는이 솔루션을 얻었습니다ipwebcam-gst 스크립트.

관련 정보