目标

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

Hello World

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

[objc] view
plain
 copy

  1. #include <gst/gst.h>
  2. int main(int argc, charchar *argv[]) {
  3. GstElement *pipeline;
  4. GstBus *bus;
  5. GstMessage *msg;
  6. /* Initialize GStreamer */
  7. gst_init (&argc, &argv);
  8. /* Build the pipeline */
  9. pipeline = gst_parse_launch ("playbin2 uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm", NULL);
  10. /* Start playing */
  11. gst_element_set_state (pipeline, GST_STATE_PLAYING);
  12. /* Wait until error or EOS */
  13. bus = gst_element_get_bus (pipeline);
  14. msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
  15. /* Free resources */
  16. if (msg != NULL)
  17. gst_message_unref (msg);
  18. gst_object_unref (bus);
  19. gst_element_set_state (pipeline, GST_STATE_NULL);
  20. gst_object_unref (pipeline);
  21. ;
  22. }

编译方面根据你的平台也有介绍,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

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

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

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

+检查所有可用的插件

+运行所有的命令行选项

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

[objc] view
plain
 copy

  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

  1. /* Start playing */
  2. gst_element_set_state (pipeline, GST_STATE_PLAYING);

这一行代码展示了另一个需要关注的点:状态。每一个GStreamer的element有一个状态,你可以理解成常见的DVD播放器上得播放/暂停按钮。播放器必须设置pipeline为PLAYING状态才能真正开始播放,这一行代码就是做了这件事。

[objc] view
plain
 copy

  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

  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自身。


【GStreamer开发】GStreamer基础教程01——Hello World的更多相关文章

  1. Android程序开发0基础教程(一)

    程序猿学英语就上视觉英语网 Android程序开发0基础教程(一)   平台简单介绍   令人激动的Google手机操作系统平台-Android在2007年11月13日正式公布了,这是一个开放源码的操 ...

  2. GStreamer基础教程01 - Hello World

    摘要 在面对一个新的软件库时,第一步通常实现一个“hello world”程序,来了解库的用法.对于GStreamer,我们可以实现一个极简的播放器,来了解GStreamer的使用. 环境配置 为了快 ...

  3. Bootstrap3基础教程 01 概述

    移动设备优先是 Bootstrap 3 的最显著的变化. 基础的页面: <!DOCTYPE html> <html> <head> <meta charset ...

  4. [ASP.NET Core开发实战]基础篇01 Startup

    Startup,顾名思义,就是启动类,用于配置ASP.NET Core应用的服务和请求管道. Startup有两个主要作用: 通过ConfigureServices方法配置应用的服务.服务是一个提供应 ...

  5. iOS开发零基础教程之生成git所需的SSH keys

    在我们github看到了一个不错的第三方库时,可能我们想把他git clone到本地,我们需要复制他的SSH URL,如下图: 复制完地址之后,我们需要打开终端,然后输入命令: git clone + ...

  6. 【GStreamer开发】GStreamer基础教程10——GStreamer工具

    目标 GStreamer提供了一系列方便使用的工具.这篇教程里不牵涉任何代码,但还是会讲一些有用的内容: 如何在命令行下建立一个pipeline--完全不使用C 如何找出一个element的Capab ...

  7. GStreamer基础教程02 - 基本概念

    摘要 在 Gstreamer基础教程01 - Hello World中,我们介绍了如何快速的通过一个字符串创建一个简单的pipeline.为了能够更好的控制pipline中的element,我们需要单 ...

  8. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  9. 【GStreamer开发】GStreamer基础教程14——常用的element

    目标 本教程给出了一系列开发中常用的element.它们包括大杂烩般的eleemnt(比如playbin2)以及一些调试时很有用的element. 简单来说,下面用gst-launch这个工具给出一个 ...

随机推荐

  1. Intel 80286 CPU

    一.80286概述 INTEL 1982年推出80286芯片,该芯片相比8086和8088有了飞跃式发展,虽然它仍是16位结构,但在CPU内部含有13.4万个晶体管,时钟频率由最初6MHz逐步提高到2 ...

  2. BZOJ 1073: [SCOI2007]kshort

    二次联通门 : BZOJ 1073: [SCOI2007]kshort /* BZOJ 1073: [SCOI2007]kshort A* k短路 但是会爆一个点, 是卡A*的 */ #include ...

  3. 【一起来烧脑】一步学会AngularJS系统

    AngularJS是一个JavaScript框架 一个用JavaScript编写的库 [外链图片转存失败(img-JUTh171K-1563341248796)(https://upload-imag ...

  4. Hadoop 机架(集群拓扑)设置

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_rack_awareness Hadoop会通过集群 ...

  5. Pytest权威教程21-API参考-06-变量及异常

    目录 特殊变量(Special Variables) collect_ignore collect_ignore_glob pytest_plugins pytest_mark PYTEST_DONT ...

  6. python 链表的反转

    code #!/usr/bin/python # -*- coding: utf- -*- class ListNode: def __init__(self,x): self.val=x self. ...

  7. 从过狗到编写tamper【转载】

    原作者:我会啊D 原文出处:https://www.t00ls.net/articles-52894.html 0x0 前言 在sql注入的时候,很可能会碰到各种厂商的waf,bypass之后,以后每 ...

  8. Compiling OpenCV: VTK Not Found on Ubuntu 16.04 LTS

    When installing OpenCV: /usr/bin/vtk not found libvtkRenderingPythonTkWidgets.so not found /usr/bin/ ...

  9. AOSP---"Android Open-Source Project"

    定义 编辑 "Android Open-Source Project"的缩写 中文意为"Android 开放源代码项目" 内容 编辑 在Android Open ...

  10. Java 自动装箱/拆箱

    自动装箱/拆箱大大方便了基本类型(8个基本类型)数据和它们包装类的使用 自动装箱 : 基本类型自动转为包装类(int >> Integer) 自动拆箱: 包装类自动转为基本类型(Integ ...