我有1-5
个输入流,每个输入流的上传时间偏差略有不同。
使用rtmp和ffmpeg,我可以将单个流可靠地编码为HLS播放列表,该播放列表可以在我的目标交付平台iOS上无缝播放。
我知道你可以接受多个输入流到ffmpeg,我想在输入流之间切换,以创建一致,单一,无缝的输出。
所以我想切换
定期rtmp://localhost/live/stream1
.. rtmp://localhost/live/stream5
。有时会有多个流,有时会赢得。
在生成HLS播放列表时,有没有办法让ffmpeg在输入流之间轮换?我的目标是避免因服务器成本原因而运行重复的ffmpeg实例,并且我认为连接不同编码的输入流以进行回放将是困难的,如果不是不可能的话。
打开每个段是理想的行为,但我还需要保持流的时间同步。这可能吗?
答案 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