1

我正在使用以下配置的管道工作几天: - 2 个实时输入流 (RTMP) - 进入一个合成器 - 输出到另一个 RTMP 流

中间有一些转换器、队列等,它工作得很好。

但我的问题是其中一个 RTMP 输入可能在启动时不可用,因此管道无法启动,崩溃并出现以下错误: - 错误:无法从流中读取任何数据 - 错误:内部数据流错误

什么是使这项工作的正确方法,即使用第一个输入启动流,即使第二个输入还没有准备好?

我尝试了几种方法:动态更改管道,使用垫探针播放,收听错误消息,..但到目前为止我无法让它工作。

谢谢, PL

4

1 回答 1

0

由于您没有发布任何代码,我想您可以接受概念性答案..

rtspsrc 很少有选项可以用来控制它何时失败 - 关于超时或超过最大试验次数。这些是(不确定是否全部):

retry - this may be not very useful if it deals only with ports ..
timeout - if you want to try with UDP some longer time you can enlarge this one
tcp-timeout - this is important, try to play with it - make it much larger
connection-speed - maybe it will help to make smaller this one
protocols - I have experience that for bad streams TCP was much better for me

实际概念(我不是专家,将其作为问题的另一种观点):

您可以创建两个箱 - 每个流一个。我将使用 rtspsrc 和 decodebin 并阻止 decodebin 的输出焊盘,直到我拥有所有焊盘,然后我将连接到合成器。

当您收到任何错误(应该是在等待所有垫的阶段)时,您会将 bin 置于 NULL 状态(我的意思是 GStreamer 状态称为 NULL)并再次播放/暂停.. 那么您必须使用垫问题正确(不知道那是什么:D)..您可以发布有关此的代码吗?也许尝试丢弃错误消息以不分解管道..

另外,你只有视频输入吗?我猜不,你可以使用 audiomixer 来播放音频。。合成器也有很好的 OpenGL 版本,它的调用速度要快得多glvideomixer。但它可能会引入另一个与 OpenGL 相关的问题。如果你有英特尔 GPU,那么你可能是安全的。

于 2016-07-04T07:18:32.250 回答