FFmpeg CLI-使用ZMQ(zmqsend)交换RTMP源

FFmpeg CLI-使用ZMQ(zmqsend)交换RTMP源,ffmpeg,stream,zeromq,live,rtmp,Ffmpeg,Stream,Zeromq,Live,Rtmp,我的设置如下: 带有RTMP模块的Nginx 多个RTMP流对,每个都有一个主和备份RTMP端点(因此流到rtmp://localhost/main/$STREAM_名称和名称rtmp://localhost/backup/$STREAM_NAME) 使用Nginx RTMPmodule exec_publish和exec_publish_done钩子,我将main或backup推送到FFmpeg CLI进程,该进程将其重新传输到远程RTMP端点(在本例中为Wowza服务器,但与我的问题无关)

我的设置如下:

  • 带有RTMP模块的Nginx
  • 多个RTMP流对,每个都有一个主和备份RTMP端点(因此流到rtmp://localhost/main/$STREAM_名称和名称rtmp://localhost/backup/$STREAM_NAME)
  • 使用Nginx RTMP
    module exec_publish
    exec_publish_done
    钩子,我将main或backup推送到FFmpeg CLI进程,该进程将其重新传输到远程RTMP端点(在本例中为Wowza服务器,但与我的问题无关)
我的问题是,当前,如果主流停止,我必须停止FFmpeg CLI进程,该进程将重新传输到Wowza,并使用新的输入源(备份流)启动另一个进程。这通常会导致Wowza方面的问题,所以我正在寻找一种方法来避免这种情况

经过一些研究,我发现FFmpeg封装了ZMQ支持,但文档似乎非常稀少。是否可以向正在运行的FFmpeg进程发送消息,提醒它必须将其源更改为不同的RTMP流


非常感谢,

如果有人对此感兴趣,我会用另一种方式解决我的问题。 我现在使用命名管道,如下所示:

PIPE\u FILE=/path/to/pip/FILE
mkfifo$PIPE_文件
exec 7$PIPE\u文件
ffmpeg-nostin-i/path/to/source-acodec copy-vcodec copy-vbsf h264_mp4toanexb-f mpegts pipe:1>$pipe\u文件
/path/to/source
可以是FS或RTMP流上的媒体文件

然后,我将流从管道重新传输到最终的RTMP端点:

ffmpeg-re-i$PIPE\u文件-c:v libx264-preset veryfast-r 25-g 50-f flv$RTMP\u端点
$PIPE_FILE
停止接收数据时(即,当流停止时,或者在从本地媒体文件发送数据的情况下,当达到EOF时),我会立即启动另一个FFmpeg CLI进程,并从备份媒体文件/流馈送管道数据


这使重新流式处理FFmpeg CLI过程持续启动和运行。

有趣的方法。我也有类似的东西。我使用的不是管道,而是另一个本地rtmp目的地

我有一个nginx rtmp设置,有3个应用程序。一个是主应用程序,另一个是备份应用程序,另一个是分发应用程序。 因此,我从我的流媒体软件将主流发送到主应用程序。 我有一个
ffmpeg
进程正在运行:

ffmpeg-irtmp://127.0.0.1/main/stream1 -副本rtmp://127.0.0.1/distribute/stream1

如果此过程因输入关闭而中断,我将运行类似的命令从备份中提取输入:

ffmpeg-irtmp://127.0.0.1/backup/stream1 -副本rtmp://127.0.0.1/distribute/stream1

从我的distribute应用程序,我将流式传输到外部输出

这里唯一的问题是,我在切换后得到了非单调的DTS错误,所以当从distribute流到我的输出时,我不得不添加一些标志。命令是:

ffmpeg-fflags+genpts+igndts+ignidx-避免负数为零-使用wallclock作为时间戳1-irtmp://127.0.0.1/distribute/stream1 -c:v libx264-预设veryfast-r 25-g 50-c:a aac-b:a 128k-f flv$RTMP_端点


我注意到,当我切换时,在
ffmpeg
过程中会收到一些警告,如果主流和备份流使用不同的x264配置文件,比如说,一个在高位,另一个在基线或主模式。

我自己最初采用这种方法。我用它作为起点。但是,
ffmpeg
CLI在切换时经常崩溃,而且从硬件资源的角度来看成本更高。想知道您在ffmpeg过程中是否收到有关内存管理、引用计数等的任何警告。您的输入是否使用了不同的编码配置文件?还有,当你正在向管道中写入内容,但有一段时间没有阅读时会发生什么?当你最终开始阅读时,它是否会给你当前的数据,或者是以前写的东西?最后,您是否收到任何PTS或DTS错误,因为第二个RTMP基本上再次以零时间戳开始?没有收到任何与mem管理相关的错误;你问是因为你问了吗?如果是这样的话,会出现什么样的错误?很抱歉,回复太晚了。我最初得到了非单调的DTS错误。本质上,当切换到备份流时(因为它以不同的时间戳开始),将其作为输入的ffmpeg过程会看到时间戳的突然变化。为了解决这些问题,我必须添加-fflags+genpts+igndts+ignidx-避免负的\u ts使\u为零-使用\u wallclock\u作为\u时间戳1您添加了这些吗?我真的很想删除这些,因为我不明白它们是如何工作的。此外,mem管理错误属于以下类型:非法内存管理控制操作12非法修改idc