【问题标题】:FFmpeg CLI - swap RTMP source using ZMQ (zmqsend)FFmpeg CLI - 使用 ZMQ (zmqsend) 交换 RTMP 源
【发布时间】:2020-08-03 05:57:45
【问题描述】:

我的设置如下:

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

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

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

非常感谢,

【问题讨论】:

    标签: ffmpeg stream zeromq live rtmp


    【解决方案1】:

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

    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 proc 并从备份媒体文件/流。

    这使重新流式传输的 FFmpeg CLI proc 持续启动和运行。

    【讨论】:

      【解决方案2】:

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

      我有一个带有 3 个应用程序的 nginx rtmp 设置。一个是主应用程序,另一个是备份应用程序,另一个是分发应用程序。 所以我从我的流媒体软件将主流发送到主应用程序。 我有一个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 配置文件进入,假设一个处于“高”,另一个处于“基线”或“主”。

      【讨论】:

      • 我自己最初采用的是这种方法。我以github.com/ThePooN/rtmp-fallback 为起点。但是,ffmpeg CLI 在切换时经常崩溃,而且从硬件资源的角度来看,它的成本更高。
      • 想知道如果您的输入使用不同的编码配置文件,您是否在 ffmpeg 进程中收到任何有关内存管理、引用计数等的警告?此外,当您写入管道但暂时不读取时会发生什么?当你最终开始阅读时,它会给你当前的数据,还是之前写的东西?最后,您是否收到任何 PTS 或 DTS 错误,因为第二个 RTMP 基本上又以零时间戳开始?
      • 没有收到任何与内存管理相关的错误;你问是因为你问了吗?如果是这样,什么样的错误?
      • 抱歉回复晚了。我最初得到了非单调的 DTS 错误。本质上,当转移到备份流时(因为它以不同的时间戳开始),将其作为输入的 ffmpeg 进程会看到时间戳的突然变化。为了解决这些问题,我必须添加 -fflags +genpts+igndts+ignidx -avoid_negative_ts make_zero -use_wallclock_as_timestamps 1 你添加了这些吗?我真的很想删除这些,因为我不明白它们是如何运作的。内存管理错误也是这样的:非法内存管理控制操作12非法修改_of_pic_nums_idc
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2012-01-06
      • 2021-10-06
      • 1970-01-01
      • 2013-03-21
      • 2015-05-17
      • 2018-10-07
      相关资源
      最近更新 更多