在前面的部分,我们简要介绍过 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! ");
return -1;
}
/* display information */
g_print ("The '%s' element is a member of the category %s. "
"Description: %s ",
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在管道线程和应用程序现成间交互信息