
如何在 Linux 中監控麥克風輸入?
注意:監聽與錄製和播放錄製內容不同。
在Windows中,我可以透過以下方式收聽自己的麥克風:
使用某些程序,它將捕獲我的麥克風並將其發送到我的聲卡進行播放。例如,使用
ffplay
命令ffplay -f dshow -i audio="Front panel mic (Realtek High Definition Audio)"
它將產生顯著的延遲,最多可達幾秒鐘。
使用輸入設備屬性的“監聽”選項
它將產生較小的延遲,最多一秒鐘。
附音效卡小部件
它將產生零延遲。我認為,這將使輸入聲音在不離開聲卡的情況下輸出,但不確定。
我需要 Linux 命令列中的選項#2。
答案1
您應該能夠使用 PulseAudio 監控您的麥克風環回模組。模組應自動為可用輸入裝置建立環回輸出。手動加載模組
pactl load-module module-loopback
若要使變更持久,請/etc/pulse/default.pa
附加
load-module module-loopback
答案2
如果您有類比輸入和類比輸出,我建議僅使用pavucontrol
(PulseAudio Volume Control)將輸入音訊路由到混音器的輸出。但是,如果您有 USB 麥克風,則不能只是混合音頻,而是某些軟體必須錄製音頻,然後將其播放到輸出流。根據您的硬件,此錄製+播放可能會導致一些(甚至高)延遲。
你可以試試這個:
首先取得您要使用的輸入和輸出的名稱:
$ pactl list short | egrep "alsa_(input|output)" | fgrep -v ".monitor"
對我來說,結果如下圖所示:
0 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
0 alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono module-alsa-card.c s16le 1ch 44100Hz SUSPENDED
這意味著我的輸出裝置被稱為alsa_output.pci-0000_00_1b.0.analog-stereo
,我的 USB 網路攝影機/麥克風被稱為alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono
。
我現在可以錄製 USB 麥克風並將其輸出到音訊輸出,如下所示:
$ pacat -r --latency-msec=1 -d alsa_input.usb-Microsoft_Microsoft___LifeCam_HD-5000-02.analog-mono | pacat -p --latency-msec=2 -d alsa_output.pci-0000_00_1b.0.analog-stereo
也就是說,一個pacat
進程從麥克風讀取資料並請求音訊堆疊嘗試將延遲降至 1 毫秒或 0.001 秒。另一個pacat
進程將音訊寫入我的輸出設備,並嘗試將延遲降至 2 毫秒或 0.002 秒。您也可以嘗試將輸出延遲減少到 1 毫秒,但至少對於我相當舊的硬體來說,在這種情況下音訊剪輯有點太容易了。
但是,如果我長時間保持這種錄製和播放輸出的組合運行,那麼延遲似乎會隨著時間的推移而緩慢增加。我猜測我的 USB 麥克風時脈比輸出音訊時脈稍快,這導致緩衝區緩慢增加。我不知道有什麼好方法可以讓這些 pactl 進程跳過音訊以保持輸出即時。我想我需要為此編寫一個自訂應用程式。
對於上述管道,在使用啟用了 PREEMPT 的 Linux 核心(例如 Ubuntu核心)pacat ... | pacat
時,我的硬體的最佳情況延遲似乎是從聲波撞擊麥克風到從輸出揚聲器發出的聲波大約 6 毫秒。linux-lowlatency