Gstreamer与visual C ++ express 2010 - 教程1

时间:2013-02-17 16:31:51

标签: visual-c++ gstreamer

我是Gstreamer的新手,当我编译Gstreamer的教程1时,我遇到了问题。我正在使用Windows 7 64位与visual c ++ express 2010和Gstreamer SDK 2012.11 32位(downloaded from here)。 这是代码:

#include "stdafx.h"
#include <gst/gst.h>

int main(int argc, char *argv[]) {
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *msg;

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

  /* Build the pipeline */
  pipeline = gst_parse_launch ("playbin2 uri=file://E:/test_1.MOV", NULL);

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

第一个错误:

error C2664: 'gst_bus_timed_pop_filtered' : cannot convert parameter 3 from 'int' to 'GstMessageType'

所以我刚从代码中删除了GST_MESSAGE_ERROR。所以这条线现在是:

msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_EOS);

我遇到了与Ubuntu相同的问题。但在那之后,在Ubuntu,我可以播放视频。

第二个错误: 但是对于Windows,编译很好,但是当我尝试运行它时,我遇到了错误:

GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_element_get_bus: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_bus_timed_pop_filtered: assertion 'GST_IS_BUS <bus>' failed
GStreamer-CRITICAL **: gst_object_unref: assertion 'object=!NULL' failed
GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_object_unref: assertion 'object=!NULL' failed

我真的不明白为什么它适用于ubuntu而不适用于Windows。我真的不知道如何解决这个问题。 你能帮帮我吗?

此致

3 个答案:

答案 0 :(得分:12)

l 第一个错误

可能代码编译为C ++,在枚举中更严格一些。尝试更换: GST_MESSAGE_ERROR | GST_MESSAGE_EOS(GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)

。{

第二次错误

很可能,该行:

pipeline = gst_parse_launch ("playbin2 uri=file://E:/test_1.MOV", NULL);

返回NULL,其余的错误都是这样的结果。为什么它可以返回NULL?原因很多。也许你还没有用“playbin2”安装插件?试试这个:

  • 将指向GError结构的指针作为第二个参数传递给gst_parse_launch(它有一个message字段可以给你一些提示)
  • 在运行程序时,将--gst-debug-level=4或更高版本作为命令行参数传递。您将在控制台输出中看到许多信息,失败的原因将在那里。

答案 1 :(得分:1)

我认为您正在使用gstreamer 1.0,如果我没有错,那么尝试使用

“playbin”而不是“palybin2”

“playbin2”从gstreamer 1.0重命名为“playbin”

答案 2 :(得分:0)

第二个错误:

我想为Ubuntu 16.04 LTS用户解释这个问题。

要尝试GStreamer tutorials sections中的示例,您应该编译&amp;从源代码安装这些存储库:

gstreamer
gst-plugins-base
gst-plugins-good

原因是用于示例的版本与我使用apt安装的版本(playbin缺失)不匹配。

在从源代码编译之前,您还需要依赖项来构建vorbisvpxsouphttpsrc插件(它们是提到的存储库的一部分)。您可以通过运行来安装它们:

apt install libvorbis-dev libsoup2.4-dev libvpx-dev

要检查存储库构建中是否包含提及的插件,请参阅./configure输出。如果它们不是,那么您的系统上仍然缺少某些依赖项。输出将告诉你缺少什么。

之后你应该成功编译并运行这个例子(你应该看到一个视频播放)。

使用--gst-debug-level=4解决GStreamer初始安装问题的一般流程(如接受的答案中所述),找出缺少的插件并安装它们。