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

标签 nginx video-streaming rtmp live-streaming

我需要备份发送到服务器的 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/

相关文章:

javascript - 流播放器 + RTMP

c# - 从在线视频流捕获屏幕截图

video - Youtube/Netflix 如何流式传输视频?

html - 从浏览器下载文件第一次挂起,重复工作

nginx - Docker 不会附加到图像

c++ - 只读取来自 Kafka 主题的最后一条消息

android - 如何录制已经在 onPreviewFrame 上流式传输的视频

使用android的sip进行安卓视频通话

node.js - 在没有 NginX 或 Apache 的情况下托管 Ghost 博客

nginx - Nginx中Golang App的基本配置