ffmpeg - 将rtmp流切换为单个编码输出?

时间:2015-10-13 19:35:48

标签: ffmpeg rtmp http-live-streaming hls

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

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

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

所以我想切换 定期rtmp://localhost/live/stream1 .. rtmp://localhost/live/stream5。有时会有多个流,有时会赢得。

在生成HLS播放列表时,有没有办法让ffmpeg在输入流之间轮换?我的目标是避免因服务器成本原因而运行重复的ffmpeg实例,并且我认为连接不同编码的输入流以进行回放将是困难的,如果不是不可能的话。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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但是您可能会在切换时引入一些延迟:< / p>

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