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

对程序员来说,GStreamer 中最重要的一个概念就是 GstElement 对象。该对象是构建一个媒体管道的基本块。所有上层(high-level)部件都源自GstElement对象。任何一个解码器编码器、分离器、视频/音频输出部件实际上都是一个 GstElement对象。

对程序员来说,element就像一个黑盒子。你element的一端输入数据,element对数据进行一些处理,然后数据从element的另一端输出。拿一个解码element来说,你输入一 些有特定编码的数据,element会输出相应的解码数据。

Source elements:为管道产生数据,比如从磁盘或者声卡读取数据。源元件不接收数据,仅产生数据。

wpsAC69.tmp

Like Filter elements:同时拥有输入和输出pads , 他们对从输入pads得到的数据进行操作,然后将数据提供给输出pads。比如过滤器(filters)、转换器(convertors)、分流器(demuxers)、整流器(muxers)

wpsAC5B.tmp

wpsD0DC.tmp

Recv  elements : 接收element是媒体管道的末端,它接收数据但不产生任何数据。写磁盘、利用声卡播放声音以及视频输出等都是由接收元件实现的

wps130.tmp

创建一个GstElement对象: 创建一个element的最简单的方法是通过函数gst_element_factory_make (), 你不再需要一个元件时,你需要使用 gst_object_unref ()来对它进行解引用.

下面的例子显示了如果通过一个fakesrc工厂对象来创建一个名叫source的元件。程序会检查元件是否创建成功。检查完毕后,程序会销毁元件.

#include <gst/gst.h>
int main (int   argc,
      char *argv[])
{
  GstElement *element;

  /* init GStreamer */
  gst_init (&argc, &argv);

  /* create element */
  element = gst_element_factory_make ("fakesrc", "source");
  if (!element) {
    g_print ("Failed to create element of type 'fakesrc' ");
    return -1;
  }
  printf("successful to make element... ");

  gst_object_unref (GST_OBJECT (element));

  printf("destory the element... ");

  return 0;

}

gst_element_factory_make其实是 gst_element_factory_find ()gst_element_factory_create()两个函数的合体。

gst_element_factory_find ():获得一个唯一的工厂对象 GstElementFactory对象

gst_element_factory_create() :使用element工厂并根据给定的名字来创建一个element对象。

#include <gst/gst.h>

int main (int   argc,

      char *argv[])

{

  GstElementFactory *factory;

  GstElement * element;

  /* init GStreamer */

  gst_init (&argc, &argv);

  /* create element, method #2 */

  factory = gst_element_factory_find ("fakesrc");

  if (!factory) {

    g_print ("Failed to find factory of type 'fakesrc' ");

    return -1;

  }

  element = gst_element_factory_create (factory, "source");

  if (!element) {

    g_print ("Failed to create element, even though its factory exists! ");

    return -1;

  }

  gst_object_unref (GST_OBJECT (element));

  return 0;

}

GstElement的属性大多通过标准的 GObject 对象实现的。使用 GObject 的方法可以对GstElement实行查询、设置、获取属性的值。同样 GParamSpecs 也被支持。

每个 GstElement 都从其基类 GstObject 继承了至少一个“名字”属性。这个名字属性将在函数gst_element_factory_make ()或者函数gst_element_factory_create ()中使用到。

你可通过函数 gst_object_set_name 设置该属性,通过 gst_object_get_name 得到一个对象的名字属性。你也可以通过下面的方法来得到一个对象的名字属性。

#include <gst/gst.h>

int main (int argc,  char *argv[])
{
  GstElement *element;
  gchar *name;

  /* init GStreamer */
  gst_init (&argc, &argv);

  /* create element */
  element = gst_element_factory_make ("fakesrc", "source");

  /* get name */
  g_object_get (G_OBJECT (element), "name", &name, NULL);
  g_print ("The name of the element is '%s'. ", name);
  g_free (name);

  gst_object_unref (GST_OBJECT (element));

  return 0;

}

原文地址:https://www.cnblogs.com/xuyh/p/4561589.html