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

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

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

1) Zoom은 마이크 드롭다운 목록에 모니터링 소스를 나열하지 않습니다. Zoom이 이를 허용하도록 속이기 위해 디스플레이의 device.class 속성을 "sound"("display" 대신)로 설정하려고 시도했지만 소용이 없었습니다.

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

그래서 나는 나만의 소스를 설정하고 "사운드를 해당 소스로 리디렉션"해 보았습니다. 빈 싱크, 빈 소스 및 루프백을 만들었지만 pavucontrol을 연 후에는 루프백이 소스를 싱크로 리디렉션하는 데 사용된 것 같았습니다. 그 반대는 아닙니다(pavucontrol 재생 아래에는 "[...] MySink의 MySource 루프백"이 표시됩니다. 여기서 MySink는 오른쪽 드롭다운 값입니다.

내가 원하는 것을 달성할 수 있는 방법이 있나요? 누구나:

a) 일반 마이크처럼 보이도록 모니터를 수정합니다.

b) 수신기의 사운드를 소스로 리디렉션하시겠습니까?

감사해요.

답변1

Zoom으로 애플리케이션 오디오를 공유할 때 Linux에서 다음 설정이 작동합니다. 마이크와 애플리케이션 오디오를 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이 마이크가 무엇인지 어떻게 결정하는지 잘 모르겠습니다. 모니터를 사용하라고 말할 수는 없지만 echo-cancel(Paul이 설명한 대로) 들을 것입니다. 실제로 취소하려는 에코가 없으므로 취소할 가짜 수신기를 만듭니다.

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(가상 마이크에만 전송)으로 설정하거나 ..에서 "Also Output 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. 스케일링 시작(가상 소스를 가져오지만 오디오 지연이 가끔 발생함),
  5. OBS를 종료하고,
  6. OBS를 시작합니다(현재 오디오 지연 없음).
  7. 가르치다.

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

  1. 줌 종료,
  2. 새로운 Zoom 회의를 시작하세요.
  3. OBS를 종료하고,
  4. OBS를 시작하세요.
  5. 두 번째 수업을 가르치세요

이 프로세스는 한동안 나에게 신뢰할 수 있었습니다. 프로세스에 추가 자동화를 추가하려고 시도하지 않았습니다. 이론(실제 증거 없음): 프로그램이 올바른 장치를 가져오도록 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 스크립트.

관련 정보