web-dev-qa-db-ja.com

Pulseaudioシンクを仮想ソースにリダイレクトする

プログラム(私の場合はffmpeg)のサウンドをソースにリダイレクトしようとしているので、問題のサウンドをズーム(ビデオ会議ソフトウェア)で再生できます。すべてのシンクにはモニターが付属しているため、これを行う古典的な方法は、ズームの音源としてSinkName.monitorソースを選択することです。だが :

1)ズームのマイクドロップダウンにモニターソースが表示されません。モニターのdevice.classプロパティを(「モニター」ではなく)「サウンド」に設定して、ズームをだまして受け入れられないようにしました。

2)ズームは、pavucontrolからソースを自分で設定することを拒否するようです。 [録音]タブで、ズームでリッスンする別のソースを設定しようとすると、何を選択しても、その選択は無視されます。ドロップダウンオプションも変更されません。 〜/ .alsoftrcを作成して "[Pulse]"(新しい行) "allow-moves = yes"と書いても助かるとどこかで読んだことがありますが、私には何もしませんでした。

したがって、私は自分のソースを設定し、「サウンドをそれにリダイレクトする」ことを試みています。私はnullシンク、nullソース、ループバックを作成しましたが、pavucontrolを開くと、おそらく逆方向になっていることがわかりました。ループバックは、ソースをシンクにリダイレクトするために使用されているように見えますが、その逆ではありません(pavucontrolによると、[再生中: "[MySource]のMySourceのループバック]、MySinkは右側のドロップダウンリストの値です) )。

私がやろうとしていることを達成する方法はありますか?どちらか:

a)通常のマイクのように見えるようにモニターを変更する、または

b)シンクのサウンドをソースにリダイレクトしますか?

ありがとう。

6
Biganon

それを行う別の方法が見つかりました: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を使用して、ウェブカメラを偽装していることに注意してください)

6
Biganon

次の設定は、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

ズームが実際にマイクであるものをどのように決定するかは私にはわかりません。モニターを使用するように指示することはできませんが、echo-cancelをリッスンします(Paulの説明に従います)。実際にキャンセルするエコーはないため、キャンセルする偽のシンクを作成します。

pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel

最後に、ズームが検出するマイクとして機能するエコーキャンセルソースを作成します。

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

これで、ズームの[マイク]セクションに仮想マイクが表示されます。

アプリケーションオーディオを仮想マイクに送信するには、pavucontrolで、アプリケーションのシンクをMix-for-Virtual-Microphone(仮想マイクにのみ送信する)または「Mix-for-の同時出力」に設定します。仮想マイク、…」をマイクとスピーカーに送信します。

pavucontrolの[…の同時出力]の音量を変更することで、マイクの実際の音量とは別に、仮想マイクとスピーカーのアプリケーションオーディオの音量をミュートまたは変更することもできます。

もちろん、「入力デバイス」セクションでマイクをミュートして、アプリケーションオーディオのみを共有することもできます。

2
saraedum

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スクリプト から取得しました。

2