我想通过 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 ...
在使用pavucontrol
或pamcd
选择正确的源时,或者,如果你的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
。