將 ICECAST 流路由到 alsa 虛擬設備

將 ICECAST 流路由到 alsa 虛擬設備

我想透過 FFmpeg 將icecast串流傳送到udp,但是如果icecast串流被丟棄,那麼FFmpeg也會被丟棄。我想如果我可以將 Icecast 串流路由到 alsa 虛擬設備,那麼我可以透過 FFmpeg 從中取得資料。例如:

ffmpeg -f alsa -i hw:Dummy,0 -f mpegts udp://ip:port

然後,如果 Icecast 流丟失,輸出 udp 流將靜默播放並繼續播放音頻,直到該流再次可用。 (這是我的假設)。

有沒有辦法將 Icecast 串流路由到 alsa 虛擬設備?或者是否有另一種變體將icecast流路由到udp以在icecast流丟失的情況下靜默播放,然後在icecast流再次可用時自動返回正常播放?

答案1

我將您的評論解釋為“使用 Pulseaudio 來做到這一點是可以的”。我還沒有測試過這個,但我會這樣做:

首先,建立一個 Pulseaudio「空」接收器:

pacmd load-module module-null-sink sink_name=icecast sink_properties=device.description=Icecast

在 Pulseaudio 中,每個接收器都有一個關聯的.monitor來源,因此透過這種方式,您可以將聲音輸出到icecast接收器,並使用該icecast.monitor來源在其他應用程式中進行處理。

如果我理解正確的話,你想要收到您電腦上的 Icecast 串流。若要將流輸出到icecast接收器,請執行類似的操作

mplayer http://your.icecast.server -ao pulse::icecast

當icecast流結束時,mplayer也會終止,因此將其包裝在無限循環內的shell腳本中等while

我不確定我是否理解您要對“通過 ffmpeg 流到 udp”部分做什麼。無論如何,您現在可以icecast.monitor使用

ffmpeg -f alsa -i pulse ...

pavucontrol使用或pamcd選擇正確的來源時,或者,如果您ffmpeg是使用pulseaudio支援進行編譯的,則直接

ffmpeg -f pulse -i icecast.monitor ...

然而,如果想法是“我想將該icecast流分發到我的家庭網路中的其他電腦”,那麼最好使用脈衝音頻RTP模組首先作為水槽。

正如我所說,這些都沒有經過測試,您可能需要調整零件才能使其工作。

編輯

我也不確定 ALSA 虛擬設備是否能工作,據我了解,它們實際上只是「虛擬」設備,不提供環回。為此,您必須使用snd-aloop環回設備,這有點痛苦,因為您經常遇到取樣率問題等。

因此,使用 Pulseaudio 基礎設施確實會更好。

答案2

您可以使用 Loopback 裝置取代 Dummy 裝置。

預設情況下,Loopback 設備未啟用,因此您必須先載入 snd-aloop 核心模組,並使用參數指定所需的子流類型和數量:

# modprobe snd-aloop index=0 pcm_substreams=1

hw:Dummy,0然後,您可以將其路由到hw:Loopback,0,0ffmpeg 並從 中讀取該流,而不是將icecast 路由到hw:Loopback,1,0

相關內容