无法链接Gstreamer元素

无法链接Gstreamer元素,gstreamer,Gstreamer,我是GStreamer的新手,我遵循了,并试图使它与本地mp4文件一起工作。 我的问题是无法链接“uridecodebin”和“autovideosink”,以下是我的相关代码: GstElement *pipeline, *source, *sink; GstBus *bus; GstMessage *msg; GstStateChangeReturn ret; /* Initialize GStreamer */ gst_init (&argc, &

我是GStreamer的新手,我遵循了,并试图使它与本地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;
  }
它总是使用
gst\u元素\u链接(源、接收器)
返回false,但如果我只使用
gst-launch-1.0 uridecodebin uri,它工作得很好=file://MyPathToVideo/test.mp4 ! autovideosink
命令,我做错了什么


非常感谢。

尝试使用
gst\u parse\u launch()
并为其提供管道。这样比较短。我相信它考虑到了你的一些特殊情况

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

因此,您没有直接链接它,而是在
uridecodebin
上实现
pad added
信号:

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

uridecodebin
扫描您的媒体文件并暴露可链接的焊盘时,会触发此
pad added
信号。如果是您的视频板,您可以将其连接到
自动视频接收器

gst\u parse\u launch()
如果我没有弄错的话,它会自动为您提供这一功能(至少这是
gst-lauch-1.0
正在做的事情-不确定该特定功能是否也移动到该API)


还有,你越狱了。教程2使用的不是
uridecodebin
,而是更多的基本元素。教程3将介绍动态管道。

尝试使用
gst\u parse\u launch()
并为其提供管道。这样比较短。我相信它考虑到了你的一些特殊情况

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

因此,您没有直接链接它,而是在
uridecodebin
上实现
pad added
信号:

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

uridecodebin
扫描您的媒体文件并暴露可链接的焊盘时,会触发此
pad added
信号。如果是您的视频板,您可以将其连接到
自动视频接收器

gst\u parse\u launch()
如果我没有弄错的话,它会自动为您提供这一功能(至少这是
gst-lauch-1.0
正在做的事情-不确定该特定功能是否也移动到该API)


还有,你越狱了。教程2使用的不是
uridecodebin
,而是更多的基本元素。教程3将介绍动态管道。

谢谢!我真的太匆忙了。我的简单示例现在可以使用了!顺便说一句,我目前正在做一个已有的项目,它使用了
gst\u parse\u launch
filesrc location=/home/root/test.mp4!德克宾!qvconv!视频/x-raw,格式=(字符串)NV12,帧速率=1/1!队列appsink name=cameraFrameSink
作为状态,是否可以动态更改文件位置而不是创建新管道?当然可以,问题是,由于介质可能完全不同,下游会发生什么。也许你想看看
multifilesrc
。谢谢!我真的太匆忙了。我的简单示例现在可以使用了!顺便说一句,我目前正在做一个已有的项目,它使用了
gst\u parse\u launch
filesrc location=/home/root/test.mp4!德克宾!qvconv!视频/x-raw,格式=(字符串)NV12,帧速率=1/1!队列appsink name=cameraFrameSink
作为状态,是否可以动态更改文件位置而不是创建新管道?当然可以,问题是,由于介质可能完全不同,下游会发生什么。也许您想看看
multifilesrc