我需要备份发送到服务器的 RTMP 流(带有 nginx-rtmp-module 的 nginx):万一其中一个失败,当我从服务器获取它时,我需要自动替换另一个。
可能吗?
最佳答案
使用 FFmpeg 和 Nginx 可以以简单、可靠且灵活的方式实现流故障转移。例如,您可能有两个流:
rtmp://ip/app/stream1
rtmp://ip/app/stream2
为了实现冗余,您通常会使用两个独立的 OBS 实例或摄像头设备,每个实例都流式传输到这些地址之一。实际的广播流将是第三个流:
rtmp://ip/app/product
您可以使用单个 FFmpeg 实例和简单的脚本在流之间切换:
while TRUE; do
ffmpeg -re -i rtmp://ip/app/stream1 -c copy -f flv rtmp://ip/app/production;
ffmpeg -re -i rtmp://ip/app/stream2 -c copy -f flv rtmp://ip/app/production;
sleep 0.5;
done
该解决方案具有高度可扩展性,例如:
- 如果流 1 和流 2 位于同一服务器上,您可以将它们分布在两个不同的服务器上以进行故障转移。
- 您可以运行多个脚本将流推送到多个生产服务器,从而提供多个可用的服务源。
- 它不仅支持 RTMP 和 Nginx,还支持其他协议(protocol),例如 SRT 和其他服务器。
该解决方案的一个弱点是切换时间和内容可能会重复或丢失。为了解决这个问题,您可以减少流延迟。例如,如果两个流的延迟都在 500 毫秒内,则观看者将感觉不到内容的变化。您可以使用 SRT 协议(protocol)来实现此目的,将所有流替换为 SRT:
srt://ip?streamid=#!::r=app/stream1,m=publish
srt://ip?streamid=#!::r=app/stream2,m=publish
srt://ip?streamid=#!::r=app/product,m=publish
您需要将 SRT 协议(protocol)转换为 RTMP 或 HLS,以便与现有系统集成。您可以使用 SRS 流媒体服务器来实现此目的,请参阅 SRS: SRT .
Note: If your device does not support SRT, you can consider using WebRTC (WHIP) by replacing the addresses with WHIP. See SRS: WHIP.
该解决方案不限于 Nginx,可以与任何支持这些协议(protocol)的流媒体服务器一起使用,因为核心功能依赖于 FFmpeg。
除了 Nginx RTMP 之外,还有另一种一键解决方案,您只需通过 RTMP、SRT 或 WHIP 发布到 SRS Stack,即可转发或提供输出流,这正是使用此 FFmpeg 解决方案,请请参阅SRS Stack: Multiple Streaming
关于nginx - 使用 nginx-rtmp-module 自定义 RTMP 推送流备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601144/