首页 > 解决方案 > 无法链接 Gstreamer 元素

问题描述

我是 GStreamer 的新手,我遵循GStreamer 网站上的基本教程 2并尝试使其与本地 mp4 文件一起使用。我的问题是我无法链接“uridecodebin”和“autovideosink”,这是我的相关代码:

  GstElement *pipeline, *source, *sink;
  GstBus *bus;
  GstMessage *msg;
  GstStateChangeReturn ret;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Create the elements */
  source = gst_element_factory_make ("uridecodebin", "source");
  sink = gst_element_factory_make ("autovideosink", "sink");

  /* Create the empty pipeline */
  pipeline = gst_pipeline_new ("pipeline");

  if (!pipeline || !source || !sink) {
      g_printerr ("Not all elements could be created.\n");
      return -1;
  }

  /* Build the pipeline */
  gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
  if (gst_element_link (source, sink) != TRUE) {
      g_printerr ("Elements could not be linked.\n");
      gst_object_unref (pipeline);
      return -1;
  }

它总是返回 false gst_element_link (source, sink),但如果我简单地使用gst-launch-1.0 uridecodebin uri=file://MyPathToVideo/test.mp4 ! autovideosink命令它工作得很好,我做错了什么?

非常感谢。

标签: gstreamer

解决方案


尝试使用gst_parse_launch()并给它你的管道。这种方式更短。而且我相信它会处理您的情况的一些特殊性。

您的方法不起作用的主要问题是uridecodebin它没有暴露任何垫,因为那时它对您的 MP4 文件一无所知。所以它可以包含音频、视频,两者——或其他。正确的做法是实现延迟链接。

因此,不是直接链接它,而是在以下位置实现pad-added信号uridecodebinhttps ://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c#GstElement::pad-added

然后在断开元素的情况下启动管道。

当扫描您的媒体文件并暴露可以链接的垫时,将触发此pad-added信号。uridecodebin如果它是您的视频板,您可以将其连接到autovideosink.

gst_parse_launch()如果我没记错的话,会自动为您执行此操作(至少这是gst-lauch-1.0正在做的事情 - 不确定该特定功能是否也移至该 API)。

PS你开枪了。教程 2 没有使用uridecodebin但更基本的元素。教程 3 将介绍动态管道。


推荐阅读