GStreamer基础教程01——Hello World

原文链接:
http://blog.csdn.net/sakulafly/article/details/19398257

目标

 对于一个软件库来说,没有比在屏幕上打印出Hello World更近直观的第一印象了。
​因为我们是在和一个多媒体的framework打交道,所以我们准备播放一段视频来代替Hello World。
​不要被下面的代码吓唬住了——真正起作用的也就四行而已。
​剩下的都是资源管理的代码,C语言嘛,就是有这个麻烦。不多说了,准备你的第一个GStreamer应用吧……


Hello World

把下面的代码copy到一个文本文件,并改名为basic-tutorial-1.c

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <gst/gst.h>  
  2.     
  3. int main(int argc, charchar *argv[]) {  
  4.   GstElement *pipeline;  
  5.   GstBus *bus;  
  6.   GstMessage *msg;  
  7.     
  8.   /* Initialize GStreamer */  
  9.   gst_init (&argc, &argv);  
  10.     
  11.   /* Build the pipeline */  
  12.   pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm"NULL);  
  13.     
  14.   /* Start playing */  
  15.   gst_element_set_state (pipeline, GST_STATE_PLAYING);  
  16.     
  17.   /* Wait until error or EOS */  
  18.   bus = gst_element_get_bus (pipeline);  
  19.   msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);  
  20.     
  21.   /* Free resources */  
  22.   if (msg != NULL)  
  23.     gst_message_unref (msg);  
  24.   gst_object_unref (bus);  
  25.   gst_element_set_state (pipeline, GST_STATE_NULL);  
  26.   gst_object_unref (pipeline);  
  27.   return 0;  
  28. }  

编译方面根据你的平台也有介绍,
​linux平台http://docs.gstreamer.com/display/GstSDK/Installing+on+Linux
​Mac平台http://docs.gstreamer.com/display/GstSDK/Installing+on+Mac+OS+X
​windows下是http://docs.gstreamer.com/display/GstSDK/Installing+on+Windows
​如果编译出错的话请检查一下报错地方的语句,如果编译通过,那么可以运行了,会弹出一个窗口,播放网络上的一个视频。
​恭喜你,第一步成功了!


代码分析

 我们看一下代码,分析一下工作流程。

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* Initialize GStreamer */  
  2. gst_init (&argc, &argv);  

      这是所有GStreamer应用的第一句,在gst_init里面做了

      +初始化所有内部数据结构

      +检查所有可用的插件

      +运行所有的命令行选项

      如果你把argc和argv传入gst_init,在处理命令行上是由好处的(在GStreamer工具里面还会讲到这个方面)。


[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* Build the pipeline */  
  2. pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm"NULL);  


这一行是这个教程最重要的部分,里面有两个非常重要的点:gst_parse_launch和playbin2


gst_parse_launch

GStreamer是设计来处理多媒体流的框架。
​媒体流经过一系列的中间element,从source element流到sink element。这些相互作用的element构成了一整个的pipeline。

使用GStreamer时你常常需要使用独立的elements来手动搭建一个pipeline,
​但是,在比较简单的情况下,我们也可以使用gst_parse_launch()。
​这个函数原本是描述一个pipeline的,但也可以很方便的用来建立一个pipeline。


playbin2

我们让gst_parse_launch()函数建立了一个怎么样的pipeline呢?
​这就是playbin2的用处了,我们建立了一个只包含playbin2的element的pipeline。


​playbin2是一个特殊的element,它既是一个source也是一个sink,同时也能处理整个pipeline的事务。
​在内部,他创建和链接了所有播放你的媒体所必须的elements,你完全不必担心。

这个element相对于纯手工搭建的pipeline来说,控制粒度没有那么好,但也有足够的可定制了。

 在这个例子中,我们仅仅解析了playbin2得一个参数——我们希望播放的URI。
​试试其他的地址,比如http://或者file://开头的URI,playbin2都能良好的工作。

如果你键入了错误的URI,或者URI不存在,或者你漏掉了某个插件,
​GStreamer提供了一些通知机制,但我们这个例子仅仅实现在出错时退出,所以就不展开了。


[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* Start playing */  
  2. gst_element_set_state (pipeline, GST_STATE_PLAYING);  
这一行代码展示了另一个需要关注的点:状态。
​每一个GStreamer的element有一个状态,你可以理解成常见的DVD播放器上得播放/暂停按钮。
​播放器必须设置pipeline为PLAYING状态才能真正开始播放,
这一行代码就是做了这件事。
[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* Wait until error or EOS */  
  2. bus = gst_element_get_bus (pipeline);  
  3. msg = 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来终止。

清理

在应用终止前,我们还有一些事情要做

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /* Free resources */  
  2. if (msg != NULL)  
  3.   gst_message_unref (msg);  
  4. gst_object_unref (bus);  
  5. gst_element_set_state (pipeline, GST_STATE_NULL);  
  6. gst_object_unref (pipeline);  
 在你使用了一个函数后,一定要记得查阅文档来确定是否需要释放资源。
​在这个例子中,gst_bus_timed_pop_filtered()会返回一个message,这个需要调用gst_message_unref()来释放(下一讲会继续介绍)。

 gst_element_get_bus()会对总线增加一个引用,所以也需要调用get_object_unref()来释放。
​设置pipeline为NULL状态会让它释放掉所有的资源,最后,释放掉pipeline自身。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值