现在的位置: 首页 > 综合 > 正文

gstreamer 之 GstElementFactory ,元件 ,元件状态

2018年02月23日 ⁄ 综合 ⁄ 共 1817字 ⁄ 字号 评论关闭

GstElementFactory AGstElementFactory can be added
to aGstPlugin as it is also aGstPluginFeature.

创建GstElement对象,最简单的方法是工厂对象GstElementFactory的gst_element_factory_make()。这个函数使用一个已存在的工厂对象和一个新的元件名来创建元件,Gstreamer对应地提供了多种类型的GstElementFactory对象,它们是通过特定的工厂名称来进行区分的。

代码实例:

GstElement*element;
element= gst_element_factory_make ("fakesrc", "source");

GstElement 是一个必须理解的概念,因为它是组成管道的基本构件,也是框架中所有可用组件的基础作。从 GStreamer 自身的观点来看,GstElement 可以描述为一个具有特定属性的黑盒子,它通过连接点(link point)与外界进行交互,向框架中的其余部分表征自己的特性或者功能.

通过gst_element_factory_find()函数获得了一个名为haha的工厂对象,使用唯一的工厂名字来访问

GstElementFactory *factory;     
factory = gst_element_factory_find ("haha");

不再使用元件时,可以解引用 ,对应的函数为gst_object_unref();

ps:通过

gst_registry_pool_feature_list()

可以找到所有在Gstreamer中注册过的工厂元件。
成功获得工厂对象之后,接下来就可以通过gst_element_factory_create()函数来创建特定的GstElement对象了,该函数 在调用时有两个参数,分别是需要用到的工厂对象,以及即将创建的元件名称。元件名称可以用查询的办法获得,也可以通过传入空指针(NULL)来生成工厂对象的默认元件。比如我们创建一个decoder元件

GstElement *element;
element = gst_element_factory_create (factory, "decoder");

以下内容摘自gstreamer官方开发手册:

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

  • GST_STATE_NULL:默认状态。该状态将会回收所有被该元件占用的资源。

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

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

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

当处于GST_STATE_PLAYING状态,管道会自动处理数据。它们不需要任何形式的迭代。

抱歉!评论已关闭.