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
钩子,我将main或backup推送到FFmpeg CLI进程,该进程将其重新传输到远程RTMP端点(在本例中为Wowza服务器,但与我的问题无关)exec_publish_done
非常感谢,如果有人对此感兴趣,我会用另一种方式解决我的问题。 我现在使用命名管道,如下所示:
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