使用 nginx rtmp 在多个流输入之间切换

Posted

技术标签:

【中文标题】使用 nginx rtmp 在多个流输入之间切换【英文标题】:Switch between multiple stream inputs with nginx rtmp 【发布时间】:2015-10-06 14:44:32 【问题描述】:

我的两个同事最近开始一起流式传输到 Twitch,并希望创建一个设置,他们可以在“实时”流之间切换(例如,A 正在流式传输,想要结束,B 开始他的流式传输并且没有中断)。 Twitch 显然一次只允许一个人流式传输到特定的频道/流键并停止一个流并立即启动另一个流通常会导致大约 10 秒的“停机时间”。

出于这个原因,我考虑设置一个服务器,它们既可以流式传输到该服务器,又可以处理两个输入并将一个流推送到 Twitch 摄取服务器。为此,我查看了一些关于设置 nginx 和 rtmp 插件的教程,但是我遇到了同样的问题,即一次只有一个人能够流式传输。我想的一种可能性是在服务器上设置一个像 OBS 或 XSplit 这样的客户端流程序,然后显示来自 nginx-rtmp 输入的流并根据需要切换场景,但是这两个程序似乎都需要显卡才能进行直播“预览”,因此无法在我的服务器上运行。

是否有任何 nginx-rtmp 配置或其他客户端(最好是 linux,但也可以是 windows)解决方案我可以用来将两个输入 RTMP 流组合成一个输出流?如果需要,也可以手动切换输入,只要它“实时”工作并且不会中断输出。

提前致谢!

【问题讨论】:

【参考方案1】:

这就是我对ffmpeg 和YouTube Live Events 所做的,它也使用RTMP 输入。也可以与 Twitch 一起使用:

一次将两个流拉到您的服务器,然后以mpegts 之类的中间格式将它们推送到本地UDP 端口。就我而言,它已经是H.264/AAC

ffmpeg -re -i <source1> -c copy -bsf:v h264_mp4toannexb udp://127.0.0.1:10000

然后杀死并立即执行:

ffmpeg -re -i <source2> -c copy -bsf:v h264_mp4toannexb udp://127.0.0.1:10000  

获取本地流,编码并通过RTMP 推送。如果没有输入,它将等待并管理 PTS/DTS 中的不连续性:

ffmpeg -re -i udp://127.0.0.1:10000 -c:v libx264 -r 25 -g 100 -c:a libfdk_aac -f flv rtmp://...

【讨论】:

以上是关于使用 nginx rtmp 在多个流输入之间切换的主要内容,如果未能解决你的问题,请参考以下文章

对nginx的RTMP的推拉流测试

使用 Nginx RTMP 模块联播多个广播公司流的最佳方法是啥?考虑使用 Docker,但这似乎有点矫枉过正

使用nginx搭建RTMP服务器

ffmpeg udp 直播发布到 rtmp

Linux下使用FFmpeg将RTMP流转换为HLS

Nginx-rtmp 直播媒体实时流实现