为了支持多流容错,有一些解决方案:
- 服务器解决方案:发布同名流,只播放一个流。
- 服务器解决方案:发布不同名称的流,只播放一个流。
- 客户端解决方案:发布不同名称的流,播放流列表。
客户端解决方案
这是最简单的解决方案,例如,假设发布两个流:
-
streamArtmp://xxx/app/streamA
-
streamBrtmp://xxx/app/streamB
播放器从您的后端服务器获取播放列表:
-
streamArtmp://xxx/app/streamA
-
streamBrtmp://xxx/app/streamB
如果serverA 不可用,用户将切换到streamB。强烈推荐这个解决方案,因为它简单而健壮,并且不需要对流媒体系统进行任何更改。
注意:播放器也可以播放 HTTP-FLV/HLS 或 WebRTC,请阅读this post
服务器解决方案:多个 URL
如果发布多个流,每个流都有其 URL,如下所示:
-
streamArtmp://xxx/app/streamA
-
streamBrtmp://xxx/app/streamB
媒体服务器会将merge这些网址转为一个网址,在流不可用时自动切换,让播放器始终使用一个网址播放流:
-
streamrtmp://xxx/app/stream
注意:播放器也可以播放 HTTP-FLV/HLS 或 WebRTC,请阅读this post
对于SRS,这个功能被命名为Alias for Stream,目前不支持(2022.01),但是有一个解决方法,使用FFmpeg将streamA转换为stream:
ffmpeg -f flv rtmp://xxx/app/streamA -c copy -f flv rtmp://xxx/app/stream
如果streamA不可用,管理员应该在杀死之前的FFmpeg进程后,通过启动一个新的FFmpeg cli切换到streamB:
killall -9 ffmpeg
ffmpeg -f flv rtmp://xxx/app/streamB -c copy -f flv rtmp://xxx/app/stream
这个解决方案很简单,不需要对流媒体系统和播放器做任何事情,它应该可以完美运行。
服务器解决方案:一个 URL
如果使用相同的 URL 发布多个流:
-
streamArtmp://xxx/app/stream
-
streamBrtmp://xxx/app/stream
需要媒体服务器或集群支持此功能。 SRS 没有这方面的计划,因为它比以前的解决方案不够简单。
不过,部分视频云平台已经支持此功能,如Tencent Cloud Streaming Services。
其他问题
如果在流之间切换,总会出现一些问题,例如内容重复或滞后。想想第一个解决方案,播放器播放一个播放列表有两个流,如果切换到另一个,不可能播放相同的时间戳,因为它是实时流。
您可以尝试 HLS,在流之间切换,并从另一个流的下一个 ts 文件播放,但我不确定它是否有效。
我认为当流切换时,这意味着网络故障或设备损坏等一些大问题,除非流不可用,否则似乎没问题。