如果传入的 udp:// 流不活动,ffmpeg 中是否有办法显示循环视频或图像?
非常像让播放器显示等待广播开始图像/视频直到直播开始。
答案1
诀窍就在这里……FFmpeg 及其相关工具 FFserver 和 FFplay 没有任何机制可以将实时输入切换到单个正在运行的输出。它们也没有任何内置方式在 UDP 流启动时触发外部事件;至少我找不到。
为了完成你的预期行动,一解决方案是启动 FFmpeg 的一个实例,将 PSB 图像流推送到您的服务器,然后 - 一旦真正的 UDP 流开始通过 - 终止该流并使用 UDP 流的内容启动第二个流。如果指定了 UDP 流输入但未收到流,FFmpeg 和 FFplay 都会“旋转”(即处于监听状态),因此可以使用已记录的 FFplay 实例作为触发器。(在第一个实例运行时启动第二个 FFmpeg 实例只会破坏到您的服务器的流传输)。
当然,终止第一个流并启动第二个流可能并不理想,但如果可以接受 RTMP 流中的非常短暂的中断,那么它应该可以满足您的要求。如果不接受任何中断,则必须采用将 PSB 图像和 UDP 流推送到命名管道的路线,然后使用 concat 解复用器通过 FFmpeg 的第三个实例将它们推送到您的 RTMP 服务器。在这种情况下,您需要在两个初始流中使用完全匹配的视频和音频编码器才能使 concat 正常工作,并且由于您正在拉入第三方流,因此如果原始流媒体更改其设置,则可能会出现问题。
无论如何,这里有一个指向一个非常基本的 bash 脚本的链接,该脚本运行我所描述的 kill1-start2 场景。(Slexy.org 上的脚本)。我要警告你,我不是脚本专家,所以有人可能会想出更简单和/或更干净的方法来做到这一点。