首先,你应该知道这个问题的标题是这样的,因为那是我在缩小我的问题很长一段时间后最终陷入困境。因为可能有更好的方法来解决我的问题,所以我也在下面解释我的问题以及我一直在做什么来尝试解决它。非常欢迎对其他方法提出建议。
问题
我正在使用 Android 的gstreamer端口通过 RTSP 协议(UDP 是传输方法)渲染来自远程摄像机的视频。
使用playbin
东西工作得很好,直到它们不再用于这些相机的一个子集。
不幸的是,我无法使用相机本身,因为它们属于我们公司的客户,但我首先想到的是它们一定有问题。
然后,我们用作参考的另一个 Android 应用程序仍然能够正常播放来自这些摄像机的视频,所以我现在正尽我所能进一步调查我的问题(我们的 Android 应用程序)。
问题是相当确定的:有些相机总是出故障,有些相机总是工作。当他们失败时,有时它会reason not-linked
作为原因。
当应用程序尝试从它们播放视频时,我设法转储了与这些摄像机中的每一个相关联的管道图。然后我可以注意到,对于每个发生故障的摄像机,相关的管道总是缺少一些东西。有些人只错过了 sink 元素,有些错过了 source 和 sink:
仅使用源转储管道:
没有源或接收器的管道转储:
两者的管道转储(这些是我们确实可以玩的情况):
这些是由playbin
.
尝试的解决方案
我一直在尝试测试如果我从头开始手动构建管道会发生什么(因此它与上面第三张图片中的 playbin 构建的相同)并强制所有相机的视频都由该管道处理。由于所有相机过去都可以工作,我的猜测是某些相机的协商现在以某种方式失败,因此 playbin 没有为这些相机正确构建管道,但如果我自己组装它,最终一切都会按预期工作(我假设rtspsrc
playbinglimagesink
还选择了用于从这些摄像机播放视频的管道)。
这就是我自己尝试构建此管道的方式:
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
这就是我卡住的地方。我如何进一步调查为什么这些组件无法相互链接?我认为管道中可能应该在它们之间存在一些其他组件,但通过查看上面成功管道的转储(第三张图片),我认为情况并非如此。
提前感谢您的帮助。