01-Hello World

代码示例

下面的代码copy到一个文本文件,并改名为basic-tutorial-1.c
#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 ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", 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;
}
编译:
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
运行:
./basic-tutorial-1
运行该程序将会播放一段来自于网络的视频,正如前面安装教程中的示例是一样的。

工作流程

/* Initialize GStreamer */ 
gst_init (&argc, &argv);
这是所有GStreamer应用的第一句,在gst_init里面做了:
  • 初始化所有内部数据结构
  • 检查所有可用的插件
  • 运行所有的命令行选项
如果你把argc和argv传入gst_init,在处理命令行上是由好处的。
/* Build the pipeline */ 
pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);

自动创建简单的pipeline,这一行包含了两个重要概念:gst_parse_launch() and playbin。

gst_parse_launch
      GStreamer是设计来处理多媒体流的框架。媒体流经过一系列的中间element,从source element流到sink element。这些相互作用的element构成了一整个的pipeline。
      使用GStreamer时你常常需要使用独立的elements来手动搭建一个pipeline,在比较简单的情况下,我们也可以使用gst_parse_launch()。这个函数原本是描述一个pipeline的,但也可以很方便的用来建立一个pipeline。
playbin
      我们让gst_parse_launch()函数建立了一个怎么样的pipeline呢?这就是playbin的用处了,我们建立了一个只包含playbin的element的pipeline。
      playbin是一个特殊的element,它既是一个source也是一个sink,同时也能处理整个pipeline的事务。在内部,他创建和链接了所有播放媒体所必须的elements。
      这个element相对于纯手工搭建的pipeline来说,控制粒度没有那么好,但也有足够的可定制了。
      在这个例子中,我们仅仅解析了playbin的一个参数——我们希望播放的URI。在此可以尝试使用其他的URL地址。
      如果你键入了错误的URI,或者URI不存在,或者你漏掉了某个插件,GStreamer提供了一些通知机制,但我们这个例子仅仅实现在出错时退出,所以就不展开了。
/* Start playing */ 
gst_element_set_state (pipeline, GST_STATE_PLAYING);
element的状态设置,这一行代码展示了另一个需要关注的点:状态。每一个GStreamer的element都有一个状态,你可以理解成常见的DVD播放器上的播放/暂停按钮。播放器必须设置pipeline为PLAYING状态才能真正开始播放,这一行代码就是做了这件事。
/* Wait until error or EOS */ 
bus = gst_element_get_bus (pipeline);
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
等待错误或者流播放结束,这几行是在等待发生一个错误或者流已经播放结束。gst_element_get_bus()会得到pipeline的总线,然后gst_bus_timed_pop_filtered()会阻塞直到你遇到一个错误或者流播放结束。
就这样了,GStreamer处理了所有的事情,这个例子会在流播放结束或播放出错时停止,当然,任何时候你都可以用Ctrl+C来终止。
/* 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);
清理,在应用终止前,我们还有一些事情要做:
      在你使用了一个函数后,一定要记得查阅文档来确定是否需要释放资源。在这个例子中,gst_bus_timed_pop_filtered()会返回一个message,这个需要调用gst_message_unref()来释放。
      gst_element_get_bus()会对总线增加一个引用,所以也需要调用get_object_unref()来释放。设置pipeline为NULL状态会让它释放掉所有的资源,最后,释放掉pipeline自身。 
posted @ 2018-08-04 13:24  刘-皇叔  阅读(507)  评论(0)    收藏  举报