Перенаправление приемника Pulseaudio на виртуальный источник

Перенаправление приемника Pulseaudio на виртуальный источник

Я пытаюсь перенаправить звук программы (в моем случае ffmpeg) на источник, чтобы я мог воспроизвести этот звук в Zoom (программное обеспечение для видеоконференций). Классический способ сделать это — выбрать в качестве источника звука в Zoom источник SinkName.monitor, поскольку каждый sink поставляется с монитором. Но:

1) Zoom не перечисляет источники монитора в раскрывающемся списке микрофонов. Я пробовал установить свойство device.class монитора на "sound" (вместо "monitor"), чтобы обмануть Zoom и заставить его принять его, но безрезультатно.

2) Zoom, похоже, отказывается разрешить вам самостоятельно устанавливать источник из pavucontrol. На вкладке «Запись», когда я пытаюсь установить другой источник для прослушивания Zoom, независимо от того, что я выбираю, мой выбор игнорируется. Выпадающий список даже не меняется. Я где-то читал, что создание ~/.alsoftrc и запись «[pulse]» (новая строка) «allow-moves=yes» может помочь, но мне это ничего не дало.

Поэтому я пытаюсь задать свой собственный источник и «перенаправить звук на него». Я создал нулевой приемник, нулевой источник и обратную петлю, но, открыв pavucontrol, я понял, что, вероятно, я сделал все наоборот; обратная петля, по-видимому, используется для перенаправления источника на приемник, а не наоборот (pavucontrol в разделе «Воспроизведение» говорит: «Обратная петля MySource на [...] MySink», где MySink — это значение раскрывающегося списка справа).

Есть ли способ достичь того, что я пытаюсь сделать? Либо:

а) Модифицировать монитор так, чтобы он выглядел как обычный микрофон, или

б) Перенаправить звук раковины к источнику?

Спасибо.

решение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(как описал Пол.) Поскольку нет никакого эха, которое мы на самом деле хотим отменить, мы создаем фальшивый сток для отмены:

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» (чтобы отправлять его только на виртуальный микрофон) или на «Simultaneous output for Mix-for-Virtual-Microphone, …» для отправки его на микрофон и динамики.

Обратите внимание, что вы также можете отключить или изменить громкость звука приложения на виртуальном микрофоне и динамиках независимо от фактической громкости вашего микрофона, изменив громкость «Одновременный вывод на …» в pavucontrol.

Разумеется, вы можете отключить микрофон в разделе «Устройства ввода», чтобы передавать только звук приложения.

Вот визуализация этой установки для более легкого понимания:

график настройки.

решение2

Нашел другой способ сделать это: module-pipe-source.

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. Выйти из ОБС,
  6. Запустите OBS (теперь звук идет без задержек).
  7. преподавать класс.

Если мне придется вести еще один класс:

  1. Выйти из Zoom,
  2. Начать новую конференцию Zoom,
  3. Выйти из ОБС,
  4. Запустите OBS.
  5. преподавать 2-й класс

Этот процесс был надежным для меня уже некоторое время. Я не пытался добавлять дополнительную автоматизацию в процесс. ТЕОРИЯ (без фактических доказательств): Мне нужно запустить OBS до ZOOM, чтобы программы захватили нужные устройства. 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.

Связанный контент