1

首先,你应该知道这个问题的标题是这样的,因为那是我在缩小我的问题很长一段时间后最终陷入困境。因为可能有更好的方法来解决我的问题,所以我也在下面解释我的问题以及我一直在做什么来尝试解决它。非常欢迎对其他方法提出建议。

问题

我正在使用 Android 的gstreamer端口通过 RTSP 协议(​​UDP 是传输方法)渲染来自远程摄像机的视频。

使用playbin东西工作得很好,直到它们不再用于这些相机的一个子集。

不幸的是,我无法使用相机本身,因为它们属于我们公司的客户,但我首先想到的是它们一定有问题。

然后,我们用作参考的另一个 Android 应用程序仍然能够正常播放来自这些摄像机的视频,所以我现在正尽我所能进一步调查我的问题(我们的 Android 应用程序)。

问题是相当确定的:有些相机总是出故障,有些相机总是工作。当他们失败时,有时它会reason not-linked作为原因。

当应用程序尝试从它们播放视频时,我设法转储了与这些摄像机中的每一个相关联的管道图。然后我可以注意到,对于每个发生故障的摄像机,相关的管道总是缺少一些东西。有些人只错过了 sink 元素,有些错过了 source 和 sink:

仅使用源转储管道: 仅带源

没有源或接收器的管道转储: 不带

两者的管道转储(这些是我们确实可以玩的情况): 带源和汇

这些是由playbin.

尝试的解决方案

我一直在尝试测试如果我从头开始手动构建管道会发生什么(因此它与上面第三张图片中的 playbin 构建的相同)并强制所有相机的视频都由该管道处理。由于所有相机过去都可以工作,我的猜测是某些相机的协商现在以某种方式失败,因此 playbin 没有为这些相机正确构建管道,但如果我自己组装它,最终一切都会按预期工作(我假设rtspsrcplaybinglimagesink还选择了用于从这些摄像机播放视频的管道)。

这就是我自己尝试构建此管道的方式:

priv->pipeline = gst_pipeline_new("rtspstreamer");

source = gst_element_factory_make("rtspsrc", NULL);
if (!source) {
  GST_DEBUG("Source could not be created");
}

sink = gst_element_factory_make("glimagesink", NULL);
if (!sink) {
  GST_DEBUG("Sink could not be created");
}

if (!gst_bin_add(GST_BIN(priv->pipeline), source)) {
  GST_DEBUG("Could not add source to pipeline");
}
if (!gst_bin_add(GST_BIN(priv->pipeline), sink)) {
  GST_DEBUG("Could not add sink to pipeline");
}
if (!gst_element_link(source, sink)) {
  GST_DEBUG("Source and sink could not be linked");
}

g_object_set(source, "location", uri, NULL);

因此,运行上面的代码,我收到以下错误:

Source and sink could not be linked

这就是我卡住的地方。我如何进一步调查为什么这些组件无法相互链接?我认为管道中可能应该在它们之间存在一些其他组件,但通过查看上面成功管道的转储(第三张图片),我认为情况并非如此。

提前感谢您的帮助。

4

0 回答 0