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

标签 ffmpeg stream zeromq live rtmp

我的设置如下:

  • 带有 RTMP 模块的 Nginx
  • 多个 RTMP 流对,每个流对都有一个主要和备用 RTMP 端点(因此流式传输到 rtmp://localhost/main/$STREAM_NAME 和 rtmp://localhost/backup/$STREAM_NAME)
  • 使用 Nginx RTMP module exec_publishexec_publish_done Hook ,我将主或备份推送到 FFmpeg CLI 过程,该过程将其重新流式传输到远程 RTMP 端点(Wowza 服务器中的这个案例,虽然与我的问题不太相关)

我的问题是,目前,如果主流停止,我必须停止重新流式传输到 Wowza 的 FFmpeg CLI 进程,并使用新的输入源(备份流)启动另一个进程。这通常会导致 Wowza 方面出现问题,因此我正在寻找一种方法来避免这种情况。

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

非常感谢,

最佳答案

如果有人感兴趣,我用不同的方式解决了我的问题。 我现在使用命名管道,如下所示:

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 过程持续启动并运行。

关于FFmpeg CLI - 使用 ZMQ (zmqsend) 交换 RTMP 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61327423/

相关文章:

visual-studio - 将 ffmpeg/avcodec 与 Visual Studio 2015 链接时无法解析的外部符号?

c# - 另一个进程正在使用文件流

c++ - 从 IIS 7.5 Web 应用程序调用 Win32 CreateEvent() 失败

batch-file - 批量读取输出

c++ - 将静音音频数据写入文件ffmpeg C++

FFMpeg 的分流器

c++ - std::stringstream - 丢弃一个值

android-streaming mp3 文件到其他设备

java - 如何使用 ZeroMQ 将字节数组发送到套接字?

c++ - 当我尝试编译 zeromq 源代码时出现错误 LNK2019