
Ich versuche, den Ton eines Programms (in meinem Fall ffmpeg) auf eine Quelle umzuleiten, damit ich den betreffenden Ton in Zoom (Videokonferenzsoftware) abspielen kann. Die klassische Vorgehensweise hierfür wäre, als Tonquelle in Zoom die Quelle SinkName.monitor auszuwählen, da jeder Sink mit einem Monitor ausgestattet ist. Aber:
1) Zoom listet die Monitorquellen nicht in seinem Mikrofon-Dropdown-Menü auf. Ich habe versucht, die Eigenschaft device.class des Monitors auf „sound“ (anstelle von „monitor“) zu setzen, um Zoom dazu zu bringen, es zu akzeptieren, aber ohne Erfolg.
2) Zoom scheint es zu verweigern, dass Sie die Quelle selbst über pavucontrol festlegen. Wenn ich auf der Registerkarte „Aufnahme“ versuche, eine andere Quelle für Zoom festzulegen, wird meine Auswahl ignoriert, egal, was ich auswähle. Die Dropdown-Option ändert sich nicht einmal. Ich habe irgendwo gelesen, dass es helfen könnte, ~/.alsoftrc zu erstellen und „[pulse]“ (neue Zeile) „allow-moves=yes“ zu schreiben, aber bei mir hat das nichts bewirkt.
Daher versuche ich, meine eigene Quelle festzulegen und „den Ton dorthin umzuleiten“. Ich habe einen Null-Sink, eine Null-Quelle und einen Loopback erstellt, aber als ich pavucontrol öffnete, wurde mir klar, dass ich es wahrscheinlich falsch gemacht hatte; ein Loopback scheint verwendet zu werden, um eine Quelle zu einem Sink umzuleiten, nicht umgekehrt (pavucontrol sagt unter „Wiedergabe“: „Loopback von MySource auf [...] MySink“, wobei MySink der Wert der Dropdown-Liste rechts ist).
Gibt es eine Möglichkeit, das zu erreichen, was ich versuche? Entweder:
a) Einen Monitor so modifizieren, dass er wie ein normales Mikrofon aussieht, oder
b) Den Schall eines Spülbeckens auf eine Quelle umleiten?
Danke.
Antwort1
Das folgende Setup funktioniert bei mir, um Anwendungsaudio mit Zoom unter Linux zu teilen. Das Setup speist Ihr Mikrofon und Anwendungsaudio in Zoom ein. Aber wie am Ende beschrieben, kann es auch so geändert werden, dass nur eines der beiden verwendet wird.
Erstellen Sie einen Senke, in dem wir das Mikrofon und einige Anwendungsaudiosignale mischen:
pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone
Erstellen Sie einen Senke, der Anwendungsaudio aufnimmt und an unsere Lautsprecher und den speziellen Misch-Senke sendet, den wir gerade erstellt haben (ersetzen Sie ihn alsa_output….analog-stereo
durch den Namen Ihres Senke, siehe 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
Führen Sie eine Schleife von unserem eigentlichen Mikrofon zu unserem Mischpult durch (ersetzen Sie diese alsa_input…analog-stereo
durch den Namen Ihrer Quelle, siehe 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
Mir ist nicht klar, wie Zoom feststellt, was eigentlich ein Mikrofon ist. Wir können ihm nicht sagen, dass es einen Monitor verwenden soll, aber es wird auf ein echo-cancel
(wie Paul beschrieben hat) hören. Da es kein Echo gibt, das wir eigentlich ausblenden möchten, erstellen wir einen Fake-Sink, gegen den wir ausblenden:
pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel
Schließlich erstellen wir die Echounterdrückungsquelle, die als Mikrofon dient, das Zoom erkennt:
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
Jetzt sollte Zoom im Abschnitt „Mikrofon“ ein virtuelles Mikrofon anzeigen.
Um Anwendungsaudio an Ihr virtuelles Mikrofon zu senden, pavucontrol
stellen Sie in den Sink Ihrer Anwendung auf „Mix für virtuelles Mikrofon“ (um es nur an das virtuelle Mikrofon zu senden) oder auf „Gleichzeitige Ausgabe für Mix für virtuelles Mikrofon, …“, um es an das Mikrofon und Ihre Lautsprecher zu senden.
Beachten Sie, dass Sie den Anwendungston am virtuellen Mikrofon und den Lautsprechern auch unabhängig von der tatsächlichen Lautstärke Ihres Mikrofons stummschalten oder die Lautstärke ändern können, indem Sie die Lautstärke von „Gleichzeitige Ausgabe auf …“ in ändern pavucontrol
.
Natürlich können Sie Ihr Mikrofon im Bereich „Eingabegeräte“ stummschalten, um nur Anwendungsaudio freizugeben.
Hier ist eine Visualisierung dieses Setups zum leichteren Verständnis:
Antwort2
Habe eine andere Möglichkeit gefunden, dies zu tun: module-pipe-source.
pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1
Dann:
ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic
(Beachten Sie, dass hierdurch mithilfe des Moduls v412loopback auch eine Webcam vorgetäuscht wird.)
Antwort3
Ich wollte OBS einfach an Zoom weiterleiten. Ich habe V4l2loopback verwendet, um das Video zu verbinden (siehehttps://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/). Um das Audio anzuschließen, funktioniert Folgendes:
#!/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
Beim Abspielen von Videos von OBS werden Audio und Video ausgerichtet. Wenn Sie versuchen, dem Video einen Kommentar hinzuzufügen, erfolgt die Synchronisierung nicht richtig.
AKTUALISIEREN:
Nachdem ich dies nun eine Weile verwendet habe, ist hier mein Ablauf:
- Computer starten,
- Skript ausführen,
- Starten Sie OBS (das die Kontrolle über die Kamera übernimmt und einen virtuellen Video-Feed startet),
- Starten Sie Zoom (erfasst die virtuellen Feeds, hat aber manchmal eine Audioverzögerung),
- OBS beenden,
- Starten Sie OBS (Audio hat jetzt keine Verzögerung mehr).
- Unterrichten.
Wenn ich eine weitere Klasse unterrichten muss:
- Zoom beenden,
- Neues Zoom-Meeting starten,
- OBS beenden,
- Starten Sie OBS.
- unterrichte 2. Klasse
Dieser Prozess funktioniert bei mir seit einiger Zeit zuverlässig. Ich habe nicht versucht, dem Prozess zusätzliche Automatisierung hinzuzufügen. THEORIE (ohne tatsächliche Beweise): Ich muss OBS vor ZOOM starten, damit die Programme die richtigen Geräte erfassen. OBS beginnt, Dinge in die Audio-Pipeline einzufügen, also muss ich OBS dann stoppen und neu starten, damit die Pipeline geleert wird.
Antwort4
Ich hatte dasselbe Problem mit Zoom. Eine Alternative könnte das sein module-echo-cancel
. Damit kann aus einer vorhandenen Monitorquelle eine neue Quelle erstellt werden. Ich glaube, mit den Standardeinstellungen wird nur wenig verarbeitet.
pactl load-module module-echo-cancel \
sink_name="echo_cancel" \
source_master="YourSink.monitor" \
sink_master="DefaultSink" \
aec_method="webrtc"
Stellen Sie DefaultSink
es auf Ihr Standardausgabegerät und YourSink.monitor
auf den Monitor des Sinks ein (in unserem Fall der Stream-Sink).
Ich habe diese Lösung vonipwebcam-gst-Skript.