使用 nginx-rtmp-module 自定义 RTMP 推送流备份

问题描述 投票:0回答:2

我需要备份发送到服务器的 RTMP 流(带有 nginx-rtmp-module 的 nginx):万一其中一个失败,当我从服务器获取它时,我需要自动替换另一个。

可以吗?

nginx video-streaming rtmp live-streaming
2个回答
1
投票

我想出了一个有点棘手的方法来做到这一点,并将解决方案放在 Github 上

它是一堆 Shell 脚本,允许您执行以下操作(假设您的服务器有 DNS

yourserver.ex

:

将主码流发送至

rtmp://yourserver.ex/main/somekey

,将备份码流发送至 
rtmp://yourserver.ex/backup/somekey
,并在 
rtmp://yourserver.ex/out/somekey
 上观看结果。 (更多说明参见Github)

切换流可能会有轻微延迟,但是总比没有好。


0
投票
使用 FFmpeg 和 Nginx 可以以简单、可靠且灵活的方式实现流故障转移。例如,您可能有两个流:

  • rtmp://ip/app/stream1
    
    
  • rtmp://ip/app/stream2
    
    
为了实现冗余,您通常会使用两个独立的 OBS 实例或摄像头设备,每个实例都流式传输到这些地址之一。实际的广播流将是第三个流:

  • rtmp://ip/app/production
    
    
您可以使用单个 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
该解决方案具有高度可扩展性,例如:

    如果stream1和stream2都在同一台服务器上,您可以将它们分布在两个不同的服务器上以进行故障转移。
  • 您可以运行多个脚本将流推送到多个生产服务器,为服务提供多个可用来源。
  • 它不仅支持RTMP和Nginx,还支持其他协议,如SRT和其他服务器。
该方案的一个弱点是切换时间和内容可能重复或丢失。为了解决这个问题,您可以减少流延迟。例如,如果两个流的延迟都在 500 毫秒内,则观看者将感觉不到内容的变化。您可以使用 SRT 协议来实现此目的,将所有流替换为 SRT:

  • srt://ip?streamid=#!::r=app/stream1,m=publish
    
    
  • srt://ip?streamid=#!::r=app/stream2,m=publish
    
    
  • srt://ip?streamid=#!::r=app/production,m=publish
    
    
您需要将 SRT 协议转换为 RTMP 或 HLS,以与现有系统集成。为此,您可以使用 SRS 流媒体服务器,请参阅

SRS:SRT

注意:如果您的设备不支持 SRT,您可以考虑使用 WebRTC (WHIP),将地址替换为 WHIP。请参阅

SRS:鞭打

该解决方案不限于 Nginx,可以与任何支持这些协议的流媒体服务器一起使用,因为核心功能依赖于 FFmpeg。

© www.soinside.com 2019 - 2024. All rights reserved.