將 Pulseaudio 接收器重定向到虛擬來源

將 Pulseaudio 接收器重定向到虛擬來源

我正在嘗試將程式(在我的例子中為 ffmpeg)的聲音重定向到來源,以便我可以在 Zoom(視訊會議軟體)中播放有問題的聲音。執行此操作的經典方法是選擇 SinkName.monitor 來源作為 Zoom 中的聲音來源,因為每個接收器都配有監視器。但 :

1) Zoom 未在其麥克風下拉清單中列出監聽來源。我嘗試將顯示器的 device.class 屬性設為「聲音」(而不是「顯示器」)來欺騙 Zoom 接受它,但無濟於事。

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 如何確定什麼是麥克風。我們不能告訴它使用監視器,但它會監聽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(僅將其傳送至虛擬麥克風)或「同時輸出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 腳本

相關內容