将 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“null”接收器:

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 ...

在使用pavucontrolpamcd选择正确的源时,或者,如果你的ffmpeg编译支持 pulseaudio,则直接

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

但是,如果想法是“我想将该 icecast 流分发到家庭网络中的其他计算机”,最好使用Pulseaudio RTP 模块首先作为水槽。

正如我所说,这些都没有经过测试,您可能需要调整部分才能使其正常工作。

编辑

我也不确定 ALSA 虚拟设备是否能正常工作,据我所知,它们实际上只是“虚拟”设备,不提供回送。您必须使用snd-aloop回送设备来实现这一点,而这有点麻烦,因为您会不断遇到采样率问题等。

因此,使用 Pulseaudio 基础设施确实更好。

答案2

您可以使用 Loopback 设备代替 Dummy 设备。

默认情况下,Loopback 设备未启用,因此您必须首先加载 snd-aloop 内核模块并使用参数指定所需的子流类型和数量:

# modprobe snd-aloop index=0 pcm_substreams=1

然后,您不必将 icecast 路由到hw:Dummy,0,而是可以将其路由到hw:Loopback,0,0,并从 中读取 ffmpeg 中的流hw:Loopback,1,0

相关内容