
私は、プログラム (私の場合は ffmpeg) のサウンドをソースにリダイレクトして、問題のサウンドを Zoom (ビデオ会議ソフトウェア) で再生できるようにしようとしています。これを行うための一般的な方法は、すべてのシンクにモニターが付属しているため、Zoom のサウンド ソースとして SinkName.monitor ソースを選択することです。しかし、
1) Zoom のマイクのドロップダウンにモニター ソースが表示されません。モニターの device.class プロパティを (「モニター」ではなく)「サウンド」に設定して、Zoom がそれを受け入れるようにしようとしましたが、効果はありませんでした。
2) Zoom では、pavucontrol から自分でソースを設定することができないようです。録音タブで、Zoom で聞く別のソースを設定しようとすると、何を選択しても、その選択は無視されます。ドロップダウン オプションも変更されません。どこかで、~/.alsoftrc を作成し、"[pulse]" (改行) "allow-moves=yes" と記述すると役立つと読んだことがありますが、私の場合は何も起こりませんでした。
したがって、私は独自のソースを設定し、「サウンドをそれにリダイレクト」しようとしています。ヌル シンク、ヌル ソース、およびループバックを作成しましたが、pavucontrol を開いたときに、おそらく逆になっていることがわかりました。ループバックは、ソースをシンクにリダイレクトするために使用され、その逆ではないようです (pavucontrol の [再生] の下に「MySource の [...] MySink へのループバック」と表示され、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 のマイクセクションに仮想マイクが表示されます。
アプリケーション オーディオを Virtual-Microphone に送信するには、 でpavucontrol
、アプリケーションのシンクを Mix-for-Virtual-Microphone (仮想マイクにのみ送信) に設定するか、または「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を終了し、
- OBS を起動します (オーディオに遅延はありません)。
- 授業を教える。
別のクラスを教えなければならない場合:
- ズームを終了し、
- 新しいZoomミーティングを開始、
- OBSを終了し、
- OBSを起動します。
- 2年生を教える
このプロセスは、私にとってはしばらくの間信頼できるものでした。プロセスにさらなる自動化を追加しようとはしていません。理論 (実際の証拠はありません): プログラムが適切なデバイスを取得するには、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 スクリプト。