
Я пытаюсь перенаправить звук программы (в моем случае 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 звук и видео синхронизируются, но если вы попытаетесь добавить комментарий поверх видео, синхронизация будет выполнена неправильно.
ОБНОВЛЯТЬ:
Пользуюсь этим уже некоторое время, вот мой алгоритм:
- Загрузочный компьютер,
- Запустить скрипт,
- Запустить OBS (который берет на себя управление камерой и запускает виртуальную видеотрансляцию),
- Запустить Zoom (захватывает виртуальные потоки, но иногда возникает задержка звука),
- Выйти из ОБС,
- Запустите OBS (теперь звук идет без задержек).
- преподавать класс.
Если мне придется вести еще один класс:
- Выйти из Zoom,
- Начать новую конференцию Zoom,
- Выйти из ОБС,
- Запустите OBS.
- преподавать 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.