gstreamer 基础

本章将介绍GStreamer的基本概念。

理解这些概念对于你后续的学习非常重要,因为后续深入的讲解我们都假定你已经完全理解了这些概念。

 

3.1. 元件(Elements)

元件(element)是GStreamer中最重要的概念。

你可以通过创建一系列的元件(Elements),并把它们连接起来,从而让数据流在这个被连接的各个元件(Elements)之间传输。

每个元件(Elements)都有一个特殊的函数接口,对于有些元件(Elements)的函数接口它们是用于能够读取文件的数据,解码文件数据的。

而有些元件(Elements)的函数接口只是输出相应的数据到具体的设备上(例如,声卡设备)。

你可以将若干个元件(Elements)连接在一起,从而创建一个管道(pipeline)来完成一个特殊的任务,

例如,媒体播放或者录音。GStreamer已经默认安装了很多有用的元件(Elements),

通过使用这些元件(Elements)你能够构建一个具有多种功能的应用程序。

当然,如果你需要的话,你可以自己编写一个新的元件(Elements)。

对于如何编写元件(Elements)的话题在GStreamer Plugin Writer's Guide中有详细的说明。

 

3.2. 箱柜(Bins)和管道(pipelines)

箱柜(Bins)是一个可以装载元件(element)的容器。

管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element)。

因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins), 

通过这种方法可以降低你的应用程序的复杂度。你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态。

箱柜(Bins)可以发送总线消息(bus messages)给它的 子集元件(element)(这些消息包括:错误消息(error messages),

标签消息(tag messages),EOS消息(EOS messages))。

管道(pipeline)是高级的箱柜(Bins)。当你设定管道的暂停或者播放状态的时候,数据流将开始流动,

并且媒体数据处理也开始处理。一旦开始,管道将在一个 单独的线程中运行,直到被停止或者数据流播放完毕。

 

3.3. 衬垫(Pads)

衬垫(Pads)在GStreamer中被用于多个元件的链接,从而让数据流能在这样的链接中流动。 

一个衬垫(Pads)可以被看作是一个元件(element)插座或者端口,元件(element)之间的链接就是依靠着衬垫(Pads)。 

衬垫(Pads)有处理特殊数据的能力:一个衬垫(Pads)能够限制数据流类型的通过。链接成功的条件是:

只有在两个衬垫(Pads)允许通过的数据类型一致的时候才被建立。

数据类型的设定使用了一个叫做caps negotiation的方法。数据类型被为一个GstCaps变量所描述。

下面的这个比喻可能对你理解衬垫(Pads)有所帮助。一个衬垫(Pads)很象一个物理设备上的插头。 

例如一个家庭影院系统。一个家庭影院系统由一个功放(amplifier),一个DVD机,还有一个无声的视频投影组成。 

我们需要连接DVD机到功放(amplifier),因为两个设备都有音频插口;

我们还需要连接投影机到DVD机上,因为 两个设备都有视频处理插口。

但我们很难将投影机与功放(amplifier)连接起来,因为他们之间处理的是不同的 插口。

GStreamer衬垫(Pads)的作用跟家庭影院系统中的插口是一样的。

对于大部分情况,所有的数据流都是在链接好的元素之间流动。

数据向元件(element)以外流出可以通过一个或者多个 source 衬垫(Pads),

元件(element)接受数据是通过一个或者多个sink 衬垫(Pads)来完成的。

Source元件(element)和sink元件(element)分别有且仅有一个 sink 衬垫(Pads)或者source 衬垫(Pads)。

数据在这里代表的是缓冲区(buffers) (GstBuffer对象描述了数据的缓冲区(buffers)的信息)和事件(events) 

(GstEvent对象描述了数据的事件(events)信息)。 

 

II.构建一个应用程序

在这一部分,我们将讨论GStreamer中的一些基本概念以及一些常用的对 象,像元件、衬垫和缓存等。

我们给这些对象以一种形象化的描述,相信这样会对我们在后边学习到如何构建一条管道时大有帮助。

首先你会对GStreamer的API有个粗略的认识,用这些API来构建一个基于元件的应用程序已经绰绰有余。

然后你 会学习到如何构建一个简单的基于命令行的应用程序。

注意:在这部分我们会了解一些底层(low-level)的API以及GStreamer的 一些概念。

如果你立马想构建一个应用程序,你可能会使用一些高层(higher-level)的API,它们会在这手册的后部分被提到。

 

第4章. 初始化GStreamer

当你准备写一个GStreamer应用程序时,你仅需要通过包含头文件gst/gst.h 来访问库函数。

除此之外,不要忘记初始化GStreamer库。 

 

4.1. 简易初始化

在GStreamer库被使用前,主应用程序中应该先调用函数gst_init,

这个函数将会对GStreamer库做一些必要的初始化工作,

同时 也能够对GStreamer的命令行参数进行解析。

一个典型的初始化GStreamer库的代码 [1] 如下所示:

 

例4-1. 初始化GStreamer

#include <gst/gst.h>

 

int

main (int   argc,

      char *argv[])

{

  const gchar *nano_str;

  guint major, minor, micro, nano;

 

  gst_init (&argc, &argv);

 

  gst_version (&major, &minor, &micro, &nano);

 

  if (nano == 1)

    nano_str = "(CVS)";

  else if (nano == 2)

    nano_str = "(Prerelease)";

  else

    nano_str = "";

 

  printf ("This program is linked against GStreamer %d.%d.%d %s\n",

          major, minor, micro, nano_str);

 

  return 0;

}

 

你可以使用GST_VERSION_MAJOR, GST_VERSION_MINOR以及GST_VERSION_MICRO 三个宏得到你的GStreamer版本信息,

或者使用函数gst_version得到当前你所调用的程序库的版本信息。

目前GStreamer使用了一种 保证主要版本和次要版本中API-/以及ABI兼容的策略。

当命令行参数不需要被GStreamer解析的时候,你可以在调用函数gst_init时使用2个NULL参数。  

注[1] 这个例子中的代码可以直接提取出来,并在GStreamer的examples/manual目录下可以找到。

 

4.2. 使用GOption接口来初始化

你同样可以使用GOption表来初始化你的参数。例子如下: 

例4-2. 使用GOption接口来初始化

 

#include <gst/gst.h>

 

int

main (int   argc,

      char *argv[])

{

  gboolean silent = FALSE;

  gchar *savefile = NULL;

  GOptionContext *ctx;

  GError *err = NULL;

  GOptionEntry entries[] = {

    { "silent", 's', 0, G_OPTION_ARG_NONE, &silent,

      "do not output status information", NULL },

    { "output", 'o', 0, G_OPTION_ARG_STRING, &savefile,

      "save xml representation of pipeline to FILE and exit", "FILE" },

    { NULL }

  };

 

  ctx = g_option_context_new ("- Your application");

  g_option_context_add_main_entries (ctx, entries, NULL);

  g_option_context_add_group (ctx, gst_init_get_

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值