【问题标题】:ffmpeg - switch rtmp streams into a single encoded output?ffmpeg - 将 rtmp 流切换为单个编码输出?
【发布时间】:2016-01-11 16:55:03
【问题描述】:

我有1-5 输入流,每个上传的时间偏移略有不同。

使用 rtmp 和 ffmpeg,我可以可靠地将单个流编码为 HLS 播放列表,该播放列表可以在我的目标交付平台 iOS 上无缝播放。

我知道您可以在 ffmpeg 中接受多个输入流,并且我想在输入流之间切换以创建一致的、单一的、无缝的输出。

所以我想在 rtmp://localhost/live/stream1 .. rtmp://localhost/live/stream5 定期进行。有时会有多个流,有时不会。

在生成 HLS 播放列表时,ffmpeg 是否可以在输入流之间旋转?我的目标是避免出于服务器成本原因运行重复的 ffmpeg 实例,而且我认为连接不同编码的输入流进行播放即使不是不可能也很困难。

打开每个片段是理想的行为,但我还需要保持流的时间同步。这可能吗?

【问题讨论】:

    标签: ffmpeg rtmp http-live-streaming


    【解决方案1】:

    由于初始连接时间和缓冲 (rtmp_buffer),切换实时流输入可能会导致延迟。

    ffmpeg 没有直接的方法。作为一个开源项目,您可以自己添加功能。如果所有输入共享相同的编解码器、轨道数、帧大小等,这应该不会很复杂。

    Some people suggested 使用其他软件如MLT 进行切换或使用过滤器如zmq (ZeroMQ) 使ffmpeg 接受命令。

    一种方法是在本地端口上将源重新流式传输为mpgets,并在输出HLS的命令中使用本地地址作为输入:

    流切换器(每个流 60 秒,一次一个)- 您可以使用自己的逻辑制作脚本,这仅用于说明目的:

    ffmpeg -re -i rtmp://.../stream1 -t 60 -f mpegts udp://127.0.0.1:10000
    ffmpeg -re -i rtmp://.../stream2 -t 60 -f mpegts udp://127.0.0.1:10000
    [...]
    ffmpeg -re -i rtmp://.../stream5 -t 60 -f mpegts udp://127.0.0.1:10000
    

    使用本地地址作为HLS 流的源 - 如果没有输入,它将等待输入并修复您的 DTS/PTS,但您可能会在切换时引入一些延迟:

    ffmpeg -re -i udp://127.0.0.1:10000 /path/to/playlist.m3u8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2019-03-25
      • 2021-09-27
      • 2021-06-16
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多