Linux

混合兩個音頻流的說明

  • April 12, 2017

對於廣播設置,我想將來自輸入設備的音頻與來自 .wav 文件的音頻混合。.wav 文件包含我想在廣播期間的某個時間點添加到音樂中的介紹、等待或退出音樂。

以下設置是目標: 在此處輸入圖像描述

需要多個步驟:

  1. 添加/混合兩個流
  2. 轉換為單聲道(或者這應該先完成)
  3. 為廣播流和 VU 表拆分流
  4. 將流發送到本地音頻輸出

我很確定這一定是可能的,但我在網際網路上找不到任何解決方案。探勘 alsa 的 .asoundrc 還沒有產生任何結果。似乎 alsa dmix 做了一些混合,但不是我想要的……

我真的不知道從哪裡開始。

有人可以對此有所了解嗎?部分解決方案也可以!

最簡單的方法是使用 Pulseaudio。(你可以用 ALSA 來做,但是配置起來會很痛苦。)

產生聲音的所有東西都會在目前輸出上自動混合(Pulseaudio 術語中的“接收器”),因此您不必擔心混合。您可以使用 控制音量pavucontrol,它會通過應用程序名稱記住最後一個音量。您可以使用paplay命令行播放 wav 文件,但任何其他音頻播放器也可以。

如果您的接收器是單聲道,則將自動轉換為單聲道。如果你不能為此配置本地 RaspPi 接收器(我不知道,我沒有 RaspPi),你可以添加一個“偽”接收器

pactl load-module module-null-sink sink_name=whatever

或者如果事實證明您需要在 Pulseaudio 中重新映射,module-remap-sink(見下文,我自己還沒有嘗試過)。

此接收器或本地 RaspPi 接收器將具有關聯的.monitor源,您可以使用該源將其分發到 icecast 等。

您可以將 hw:1 輸入的永久饋送設置到您選擇的接收器中

pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"

您可以列出可用的接收器名稱

pacmd list-sinks | grep name:

作為參數,使用不帶尖括號的名稱。

我認為這是基礎。閱讀可用的 Pulseaudio模組pacmd help如果您不想使用pavucontrol.

ALSA****編輯

首先,閱讀可用的外掛。您將需要一個“虛擬音效卡”將音頻路由到 darkice 等。這是一個核心模組,所以做類似的事情

sudo modprobe snd-aloop pcm_substreams=2

用於測試,並在工作時放入文件/etc/modprobe.d。說環回是hw:3,*,*.

在虛擬音效卡的輸入端,您需要類似

dmix “main_in” –> plug (slave.channels = 1) –> hw:3,0,0

然後你可以aplay -D main_in sound.wav,然後執行

alsaloop -C hw:0 -P main_in

將其連接到音頻採集器。

在虛擬音效卡的輸出端,類似

hw:3,1,0 –> dsnoop “main_out”

並再次在本地音頻輸出上對其進行監控

alsaloop -C main_out -P local_audio_out

然後,您可以darkice直接在 上執行和 VU 表main_out。順便說一句,arecord -D main_out -d 0 -vv /dev/null是一個很好的 VU 測試儀。

在上面的連結中閱讀有關語法的詳細資訊,我不打算嘗試這個。箭頭表示外掛的-->主/從關係。延遲可能會很可怕,通過核心空間進行一次環回,以及許多使用者空間應用程序。

如果 Pulseaudio 不適合您,另一種選擇是jack,但我沒有配置它的經驗。

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