在前面的部分,我们简要介绍过 GstElementFactory 可以用来创建一个element的实例,但是GstElementFactory不仅仅只能做这件事,GstElementFactory作为在 GStreamer 注册系统中的一个基本类型,它可以描述所有的插件(plugins)以及由GStreamer创建的element。这意味着GstElementFactory可以应用于一些自动element实例, 像自动插件(autopluggers); 或者创建一个可用element列表,像管道对应用程序的类似操作(像GStreamer Editor) 。

 

1.通过GstElementFactory得到element的信息

像gst-inspect 这样的工具可以给出一个element的概要: 插件(plugin)的作者、描述性的element名称(或者简称)、element的等级(rank)以及element的类别(category)。类别可以用来得到一个element的类型,这个类型是在使用GstElementFactory创建该element时做创建的。例如类别可以是 Codec/Decoder/Video(视频解码器)、Source/Video(视频发生器)、Sink/Video(视频输出器)。音频也有类似的类别。同样还存在 Codec/Demuxer和Codec/Muxer,甚至更多的类别。Gst-inspect将会列出当前所有的Factory对象,gst-inspect <factory-name> 将会列出特定Factory对象的所有概要信息。

 

将会列出特定factory对象的所有概要信息。

#include <gst/gst.h>

int main (int   argc,  char *argv[])

{

  GstElementFactory *factory;

  /* init GStreamer */

  gst_init (&argc, &argv);

  /* get factory */

  factory = gst_element_factory_find ("audioconvert");

  if (!factory) {

    g_print ("You don't have the 'audioconvert' element installed!\n");

    return -1;

  }

  /* display information */

  g_print ("The '%s' element is a member of the category %s.\n"

           "Description: %s\n",

           gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)),

           gst_element_factory_get_klass (factory),

           gst_element_factory_get_description (factory));

  return 0;

}

2.找出element所包含的pads

GstElementFactory最有用处的功能可能是它包含了对element所能产生的pads的一个详细描述,以及这些pads的功能(以行外话讲: 就是指这些pads所支持的媒体类型),而得到 这些信息是不需要将所有的插件(plugins)都装载到内存中。这可用来给一个编码器提供一个编码列表,或在多媒体播放器自动加载插件时发挥作用。目前 所有基于 GStreamer 的多媒体播放器以及自动加载器(autoplugger)都是以上述方式工作。

 

3.链接element

通过将一个source element,零个或多个like filter element,和一个recv element链接在一起,你可以建立起一条媒体管道。数据将在这些element间流过。这是 GStreamer 中处理媒体的基本概念。

 

 

通过链接这三个element,我们创建了一条简单的element链。element链中source element("element1")的输出将会是like filter element ("element2")的输入。like filter element将会对数据进行某些操作,然后将数据输出给最终的recv element("element3")。

 

4.element状态

一个element在被创建后,它不会执行任何操作。所以你需要改变element的状态,使得它能够做某些事情。 Gstreamer中,元件有四种状态,每种状态都有其特定的意义。这四种状态为:

1) GST_STATE_NULL: 默认状态。该状态将会回收所有被该element占用的资源。

2) GST_STATE_READY: 准备状态。element会得到所有所需的全局资源,这些全局资源将被通过该element的数据流所使用。例如打开设备、分配缓存等。但在这种状态下,数据流仍未开始被处 理,所以数据流的位置信息应该自动置0。如果数据流先前被打开过,它应该被关闭,并且其位置信息、特性信息应该被重新置为初始状态。

3) GT_STATE_PAUSED: 在这种状态下,element已经对流开始了处理,但此刻暂停了处理。因此该状态下element可以修改流的位置信息,读取或者处理流数据,以及一旦状态变为 PLAYING,流可以重放数据流。这种情况下,时钟是禁止运行的。总之, PAUSED 状态除了不能运行时钟外,其它与 PLAYING 状态一模一样。处于 PAUSED 状态的element会很快变换到 PLAYING 状态。举例来说,视频或音频输出element会等待数据的到来,并将它们压入队列。一旦状态改变,element就会处理接收到的数据。同样,视频接收element能够播放数据的第 一帧。(因为这并不会影响时钟)。自动加载器(Autopluggers)可以对已经加载进管道的插件进行这种状态转换。其它更多的像codecs或者 filters这种element不需要在这个状态上做任何事情。

4) GT_STATE_PLAYING: PLAYING 状态除了当前运行时钟外,其它与 PAUSED 状态一模一样。你可以通过函数gst_element_set_state()来改变一个element的状态。你如果显式地改变一个element的状态,GStreamer可能会 使它在内部经过一些中间状态。例如你将一个element从 NULL 状态设置为 PLAYING 状态,GStreamer在其内部会使得element经历过 READY 以及 PAUSED 状态。

 

 

当处于GST_STATE_PLAYING 状态,管道会自动处理数据。它们不需要任何形式的迭代。 GStreamer 会开启一个新的线程来处理数据。GStreamer 同样可以使用 GstBus在管道线程和应用程序现成间交互信息

openwrt gstreamer实例学习笔记(三.深入了解gstreamer 的 Element)的更多相关文章

  1. openwrt gstreamer实例学习笔记(一.初始化gstreamer)

    GStreamer 是一个非常强大而且通用的流媒体应用程序框架. GStreamer所具备的很多优点来源于其框架的模块化: GStreamer能够无缝的合并新的插件. 但是, 由于追求模块化和高效率, ...

  2. openwrt gstreamer实例学习笔记(六. gstreamer Pads及其功能)

    一:概述 如我们在Elements一章中看到的那样,Pads是element对外的接口.数据流从一个element的source pad到另一个element的sink pad.pads的功能(cap ...

  3. openwrt gstreamer实例学习笔记(五. gstreamer BUS)

    1)概述 BUS(总线) 是一个简单的系统,它采用自己的线程机制将一个管道线程的消息分发到一个应用程序当中.总线的优势是:当使用GStreamer的时候,应用程序不需要线程识别,即便GStreamer ...

  4. openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

    1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包 ...

  5. openwrt gstreamer实例学习笔记(四. gstreamer Bins)

    1)概述 Bins是一种容器element.你可以往Bins中添加element.由于Bins本身也是一种element,所以你可以像普通element一样 操作Bins.因此,先前关element的 ...

  6. openwrt gstreamer实例学习笔记(二.gstreamer 的 Element)

    对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象.该对象是构建一个媒体管道的基本块.所有上层(high-level)部件都源自GstElement对象.任何一个解码 ...

  7. gstreamer应用笔记

    gstreamer官网 https://gstreamer.freedesktop.org/ 应用手册 https://gstreamer.freedesktop.org/documentation/ ...

  8. [Openwrt 项目开发笔记]:USB挂载& U盘启动(三)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一篇中,我结合Netgear Wndr370 ...

  9. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

随机推荐

  1. C语言常见的函数调用

    C语言常见的函数调用 isatty,函数名,主要功能是检查设备类型,判断文件描述词是否为终端机. 函数名: isatty 用 法: int isatty(int desc); 返回值:如果参数desc ...

  2. BZOJ 3611 [Heoi2014]大工程 ——虚树

    虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include < ...

  3. BZOJ3473 字符串 【广义后缀自动机】

    题目 给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 输入格式 第一行两个整数n,k. 接下来n行每行一个字符串. 输出格式 一行n个整数,第i个整数表 ...

  4. C++ 中的 C_str() 函数用法

    转中转 ~\(≧▽≦)/~ :http://blog.csdn.net/nancy_m/article/details/7583550 语法: const char *c_str(); c_str() ...

  5. Annual Congress of MUD

    Annual Congress of MUD 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Multiuser dungeon games, also called MUD games ...

  6. Andrew Stankevich's Contest (21) J dp+组合数

    坑爹的,,组合数模板,,, 6132 njczy2010 1412 Accepted 5572 MS 50620 KB C++ 1844 B 2014-10-02 21:41:15 J - 2-3 T ...

  7. 转载自csdn http://blog.csdn.net/ithomer/article/details/6035627 Vim的分屏功能

    Vim的分屏功能 目录(?)[+] 本篇文章主要教你如何使用 Vim 分屏功能 分屏启动Vim 使用小写的o参数来上下分屏(横向分屏). vim -on file1 file2 ... 使用大写的O参 ...

  8. java对接网银支付案例

    =================提交表单jsp,http://www.cnblogs.com/qgc88================================ <%@page con ...

  9. Unity3D 对象池思想 在游戏开发中的运用

    分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...

  10. 关于button中设置文字不显示的问题

    这个因为使用的image加载方式是setimage而不是setbackgroundimage导致文字始终出不来.