Audio

alsa:記錄給定音效卡上的所有內容

  • January 30, 2022

有沒有一種簡單的、獨立於應用程序的方法來在給定的音效卡上錄製音頻?

假設我插入 USB 耳機,顯示為/dev/snd/foo.

然後我使用縮放或Skype或任何其他應用程序撥打電話。

如果應用程序不允許本地錄製,我可以在音效卡級別獨立錄製音頻嗎?

我正在使用 alsa,並且我(天真地)想像可能有一些基礎設施可以附加到或“鏡像”音效卡並將音頻轉儲到文件中?我需要錄製兩個通道(麥克風、揚聲器),所以可能需要一些混合?

我的作業系統是 Debian 10,我正在使用 alsa(不是 pulseaudio)

有沒有一種簡單的、獨立於應用程序的方法來在給定的音效卡上錄製音頻?

是的 !有 !

您正在尋找的是簡單地記錄音效卡的輸出。

最簡單的方法可能是將其輸出連接到其輸入…… aloop alsa 驅動程序將提供一種無線方式。

A/ 所以首先確保驅動程序已載入並適當初始化:

arecord -l可以告訴你這一點,顯示(在我的系統上):

card 0: Loopback [Loopback], device 0: Loopback PCM [Loopback PCM]
 Subdevices: 8/8
 Subdevice #0: subdevice #0
 Subdevice #1: subdevice #1
 Subdevice #2: subdevice #2
 Subdevice #3: subdevice #3
 Subdevice #4: subdevice #4
 Subdevice #5: subdevice #5
 Subdevice #6: subdevice #6
 Subdevice #7: subdevice #7
card 0: Loopback [Loopback], device 1: Loopback PCM [Loopback PCM]
 Subdevices: 8/8
 Subdevice #0: subdevice #0
 Subdevice #1: subdevice #1
 Subdevice #2: subdevice #2
 Subdevice #3: subdevice #3
 Subdevice #4: subdevice #4
 Subdevice #5: subdevice #5
 Subdevice #6: subdevice #6
 Subdevice #7: subdevice #7

當然,根據您的實現,卡 ID 可能與上述列表不同。

如果您沒有獲得該輸出,則可能是因為未載入驅動程序因此觸發:modprobe snd-aloop

如果您仍然沒有成功,請確保在核心 .config 文件中選擇了驅動程序(grep for CONFIG_SND_ALOOP)

B/ 基本上確保它按預期工作

該驅動提供了一對交叉連接的設備,形成一個全雙工環迴音效卡。打開一個設備的第一個應用程序將強制嘗試打開另一個設備的第二個應用程序使用其已建立的參數。因此,不進行速率、格式或通道號轉換。這樣做的結果是,您必須首先啟動播放應用程序。因此,讓我們確保它按預期工作:

**1/**找到任何 .wav 文件並將其播放到卡 0 設備 0 子設備 0 :aplay -D hw:0,0,0 whatever.wav

**2/**從關聯的交叉連接設備卡0設備1子設備0記錄:arecord -D hw:0,1,0 record.wav

當然,您可能需要根據您的配置調整卡 ID。

**3/**通過在您的 alsa 預設設備上播放 record.wav 確保它可以正常工作:aplay record.wav。如果您聽不到任何聲音,這可能是因為一些基本的 alsa 配置錯誤。(如果需要我可以詳細說明)

當然,像這樣工作(將播放定向到環回,輸出不會發送到您的預設播放設備,因此您在錄製時將聽不到任何聲音。無論如何,這可以通過某些特定的 alsa 配置實現。

C/讓兩個音頻都在你的耳朵裡播放並啟用錄音

警告!:這將是工作中最困難的部分,因為 alsa 配置文件總是需要一個可觀的部分……魔法。

為此,您需要從頭開始構思 /etc/asound.conf 文件(如果您的配置是系統範圍的)或 $HOME/.asoundrc (如果配置是為您的唯一使用者使用的),以便創建幾個虛擬聲音設備。

1/ 開始定義準別名

pcm.MAUDIO{
   type hw
   card M2496
   device 0
   subdevice 0
   nonblock true}

ctl.MAUDIO{
   type hw
   card M2496}

這個例子與我自己的系統有關:

  • MAUDIO(選擇您想要的任何東西)充當別名以供將來參考硬體聲音設備,
  • M2496 來自與我的首選硬體設備關聯的 CARD=M2496 用於聲音播放(您應該根據您的輸出進行調整aplay -L
  • nonblock true 因為您不希望 Alsa 鎖定與音效卡的設備驅動程序關聯的字元特殊文件 (/dev/snd/pcmwhatever)。(因此,如果需要,任何其他應用程序也可以打開它)

然後繼續使用環回設備:

pcm.loopin {
   type plug
   slave.pcm "hw:Loopback,0,0"
}

pcm.loopout {
   type plug
   slave.pcm "hw:Loopback,1,0"
}

2/ 你當然想要混音器

pcm.dmixer{
   type dmix
   ipc_key 219345
   slave{
       pcm MAUDIO
       format S32_LE
       period_size 1024
       buffer_size 4096 }}

對於ipc_key選擇任何唯一的共享記憶體密鑰(使用ipcs -ma您選擇的未使用的進行檢查)。period_size 和 buffer_size 值取決於您對延遲(值越低,延遲越低)和系統性能(值越低,XRun 機率越高)的期望

3/當然你希望一切都像以前一樣工作(沒有conf)

pcm.!default{
   type plug
   slave.pcm "dmixer"
   hint{
       show on
       description "Alsa Default Device"}}

這將在所有支持選擇音頻輸出設備的應用程序上定義 alsa 預設設備。

我們現在需要的是定義一個能夠將其輸入複製到硬體聲音設備和環回設備的偽設備。這要歸功於 alsa 的外掛。

4/ 將音頻路由到硬體聲音設備並複製到環回

pcm.multi {
   type route;
   slave.pcm {
       type multi;
       slaves.a.pcm "MAUDIO";
       slaves.b.pcm "loopin";
       slaves.a.channels 2;
       slaves.b.channels 2;
       bindings.0.slave a;
       bindings.0.channel 0;
       bindings.1.slave a;
       bindings.1.channel 1;
       bindings.2.slave b;
       bindings.2.channel 0;
       bindings.3.slave b;
       bindings.3.channel 1;
   }

   ttable.0.0 1;
   ttable.1.1 1;
   ttable.0.2 1;
   ttable.1.3 1;
}

請注意,您可能更喜歡 slaves.a.pcm “dmixer”,而不是 slaves.a.pcm “MAUDIO”

對於商品,定義一個別名:

pcm.pbnrec {
   type plug
   slave.pcm "multi"
   hint{
       show on
       description "Alsa Playback & Record"}}

D/我們走吧!

如果您選擇配置系統範圍,則關閉並重新啟動;如果您選擇配置使用者自己的 .asoundrc,則註銷登錄。從那時起,在任何允許您選擇首選音頻輸出設備的誠實音頻應用程序下,您應該能夠選擇“Alsa Playback & Record”設備,然後在命令行上開始播放:

  • “loopout”設備上的記錄
  • 如果希望重新採樣/其他文件格式,則在“loopout”設備上使用 ffmpeg。
  • 啟動任何更方便的音頻錄製桌面實用程序,例如audacity

E/哈!這適用於玩家 A、B、C,但不適用於 D、E、F 應用程序

不幸的是,許多次優應用無法讓您選擇所需的輸出設備。特別是瀏覽器。因為它們將輸出到 alsa 預設 pcm,所以您需要調整配置文件並更改 pcm.!default 描述,如上詳述,如下所示:

pcm.!default {
   type plug
   slave.pcm "pbnrec"
}

F / FTS!這仍然不適用於 Firefox 和 Chrome。

**1/**鉻

老實說……我不能說,因為我用的是。除非指定 –alsa-output-device 選項,否則 Chromium 將預設為 pulseaudio 輸出。所以,應該嘗試啟動 chrome--alsa-output-device='default'並聽聽它是否有效,它確實達到了我目前的 chromium 96

**2/**火狐

無論出於何種原因,Firefox 決定授予 pluseaudio 特權,因此 AFAIK 無法使用官方二進製文件來解決這個問題。但是,從原始碼建構 Firefox,有一些 make 選項可以建構 alsa 後端。我不知道如何在 Debian 下實現這一點,但這幾乎肯定是可能的。我只能說它適用於我目前的 91.4.0 版本。


**學分:**由於 OP 需要權威來源,因此此答案中的所有內容均來自:


選擇

聲音伺服器可以作為上述 alsa 擺弄的可行替代方案。(以犧牲一些處理能力為代價)幾十年來,首選的聲音伺服器始終是Jack Audio Connection Kit。Pulseaudio 從未設法競爭。

但是……這是另一個故事。


評論後的附加資訊

1/ 採樣率

snd-aloop 驅動程序本身不受任何固定採樣率的限制。如果需要,它的任何子設備都可以以不同的採樣率執行。

但是,第一個打開子設備的應用程序將確定交叉配對子設備的採樣率(因為沒有進行轉換)。

實際上,這意味著播放應用程序以 PBSource Hz 輸出,錄製應用程序將以 PBSource Hz 採樣率擷取樣本。

如果這不方便,需要重新採樣,它將代表錄音應用程序。

ffmpeg 可以即時實現這一點,桌面錄製應用程序也是如此(很可能要感謝 ffmpeg)

實際上,這也意味著用於將聲音推送到硬體聲音設備的偽設備將以 PBSource Hz 對其輸入進行採樣。

確實可能與聲音設備(固定)HW hz 採樣率不匹配,這會導致聲音不佳。

Alsa 提供了兩種方法來克服這個問題,或者通過:

  • 使用將強制重新採樣到給定頻率的*速率外掛。*這在某種程度上是次優的,因為 alsa 然後會系統地重新採樣。(即使源的採樣率和給定的採樣率相同)
  • 使用dmix外掛(參見上文§C-2,3),該外掛將自動重新採樣,但僅在需要時。

甚至可以通過 defaults.pcm.rate_converter 的定義來選擇首選的重採樣算法。

引用自:https://unix.stackexchange.com/questions/686940