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

标签 ffmpeg rtmp http-live-streaming

我有 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/

相关文章:

ios - MPMoviePlayerController 和基于 Auth 的 HLS 后端服务器

ffmpeg 编码的 hls 使音频和视频逐渐不同步

ffmpeg "-c copy"快速视频切割的替代品

iphone - 为armv6-7构建ffmpeg失败

video - 从流站点合并 .flv block

android - WOWZA + RTMP + HTML5 播放?

javascript - 如何使用 Node 将 3GP 文件转换为 MP3?

video - 高级 ffmpeg 压缩控制

android - 如何在Android中播放RTMP的音频链接?

Nginx 只允许我的域访问视频 url