我有 1-5
个输入流,每个输入流的上传时间略有不同。
借助 rtmp 和 ffmpeg,我可以可靠地将单个流编码到 HLS 播放列表中,该播放列表可以在我的目标交付平台 iOS 上无缝播放。
我知道您可以接受 ffmpeg 中的多个输入流,并且我想在输入流之间切换以创建一致、单一、无缝的输出。
所以我想在之间切换
rtmp://localhost/live/stream1
.. rtmp://localhost/live/stream5
定期。有时会有多个流,有时不会。
有什么方法可以让 ffmpeg 在生成 HLS 播放列表时在输入流之间旋转吗?我的目标是避免出于服务器成本原因运行 ffmpeg 的重复实例,并且我认为连接不同编码的输入流进行播放即使不是不可能,也是很困难的。
打开每个分段是理想的行为,但我还需要保持流时间同步。这可能吗?
最佳答案
由于初始连接时间和缓冲 (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
关于ffmpeg - 将 rtmp 流切换为单个编码输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33111156/