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スクリプト

関連情報