我的设置如下:
具有RTMP module
module exec_publish和exec_publish_done挂钩),我将main或backup推送到FFmpeg CLI proc,后者将其重新流到远程RTMP端点(在这种情况下,Wowza服务器,尽管与我的问题不太相关)。
我的问题是,当前,如果主流被停止,我必须停止FFmpeg CLI进程,该进程将重新流到Wowza,并使用一个新的输入源(备份流)启动另一个。这经常会引起Wowza方面的问题,所以我正在寻找一种避免这种情况的方法。
经过一些研究,我发现FFmpeg封装了ZMQ支持,但文档似乎非常稀少。是否可以向正在运行的FFmpeg进程发送消息,以警告它必须将其源更改为不同的RTMP流?
非常感谢,
发布于 2020-04-30 12:52:55
万一有人感兴趣,我用不同的方式解决了我的问题。我现在使用命名管道,如下所示:
PIPE_FILE= /path/to/pip/file
mkfifo $PIPE_FILE
exec 7<>$PIPE_FILE
ffmpeg -nostdin -i /path/to/source -acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts pipe:1 > $PIPE_FILE/path/to/source可以是FS上的媒体文件,也可以是RTMP流。
然后,我从管道重新流到最终的RTMP端点:
ffmpeg -re -i $PIPE_FILE -c:v libx264 -preset veryfast -r 25 -g 50 -f flv $RTMP_ENDPOINT当$PIPE_FILE停止接收数据(即当流停止时,或者在从本地媒体文件发送数据时,到达EOF时),我立即启动一个不同的FFmpeg CLI,并从备份媒体文件/流中输入管道数据。
这使重新流的FFmpeg CLI进程不断地启动和运行。
发布于 2020-07-16 12:23:20
有趣的方法。我也有类似的东西。我使用的不是管道,而是另一个本地rtmp目的地。
我有一个nginx设置与3个应用程序。一个是主应用,另一个是备份应用,另一个是分发应用。所以我从我的流媒体软件中把主流发送到主应用程序。我有一个ffmpeg进程正在运行:
ffmpeg -i rtmp://127.0.0.1/main/stream1 -c copy rtmp://127.0.0.1/distribute/stream1
如果此进程由于输入关闭而中断,则运行一个类似的命令从备份中提取输入:
ffmpeg -i rtmp://127.0.0.1/backup/stream1 -c copy rtmp://127.0.0.1/distribute/stream1
从我的分发应用程序,我流到我的外部输出。
这里唯一的问题是,在切换之后,我得到了非单调的DTS错误,所以当从分发流流到我的输出时,我不得不添加一些标志。该命令是:
ffmpeg -fflags +genpts+igndts+ignidx -avoid_negative_ts make_zero -use_wallclock_as_timestamps 1 -i rtmp://127.0.0.1/distribute/stream1 -c:v libx264 -preset veryfast -r 25 -g 50 -c:a aac -b:a 128k -f flv $RTMP_ENDPOINT
我已经注意到,当我切换时,我在ffmpeg进程中会收到一些警告,如果主流和备份流具有不同的x264配置文件,那么假设其中一个在x264上,另一个在基线或Main上。
https://stackoverflow.com/questions/61327423
复制相似问题