在前面的部分,我们简要介绍过 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. 阿里云PolarDB及其共享存储PolarFS技术实现分析(下)

    上篇介绍了PolarDB数据库及其后端共享存储PolarFS系统的基本架构和组成模块,是最基础的部分.本篇重点分析PolarFS的数据IO流程,元数据更新流程,以及PolarDB数据库节点如何适配Po ...

  2. Python第三方库之openpyxl(8)

    Python第三方库之openpyxl(8) 饼图 饼图将数据绘制成一个圆片,每个片代表整体的百分比.切片是按顺时针方向绘制的,0在圆的顶部.饼图只能取一组数据.该图表的标题将默认为该系列的标题. 2 ...

  3. 如何使用百度地图API

    一.申请密钥 1.先用eclipse创建一个Android工程 2.在百度api官网上申请一个密钥,链接:http://lbsyun.baidu.com/apiconsole/key 二.工程配置 1 ...

  4. ajax 原生 post

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. nginx报错 too many open files in system

    系统进不去了,用ssh连接服务器也非常慢,负载均衡显示后端连接异常,重启mysql数据库,发现经常重启,或者直接关机,访问页面也访问不到. http://www.51testing.com/html/ ...

  6. linux移动硬盘unmount报错处理

    备份数据用的移动硬盘unmount时报: 通过fuser命令来kill掉设备进程,再unmount移动设备 先看fuser命令帮助信息: [root@athenadb2 ~]# fuser -help ...

  7. 给localhost加一个域名

    在C:\Windows\System32\drivers\etc目录下有个文件: hosts 打开后如此加上: localhost name resolution is handled within ...

  8. BZOJ 2190仪仗队【欧拉函数】

    问题的唯一难点就是如何表示队长能看到的人数?如果建系,队长所在的点为(0,0)分析几组数据就一目了然了,如果队长能看到的点为(m,n),那么gcd(m,n)=1即m n 互质或者是(0,1),(1,0 ...

  9. request,response,session,cookie,application

    A:request 客服端向服务器端请求 JAVA讲究封装,所以Request也是某个东西的封装,到底是什么东西呢? 按字面意思:请求! 从Http协议说起,当你发一个请求到服务端的时候,你会把一些信 ...

  10. EC++学习笔记(五) 实现

    条款26:尽可能延后变量定义式的出现时间 尽可能延后变量的定义,知道非得使用该变量的前一刻为止方法A: Widget W; ; i < n; ++i) { W = ... } 方法B: ; i ...