對程序員來說,GStreamer 中最重要的一個概念就是 GstElement 對象。該對象是構建一個媒體管道的基本塊。所有上層(high-level)部件都源自GstElement對象。任何一個解碼器編碼器、分離器、視頻/音頻輸出部件實際上都是一個 GstElement對象。
對程序員來說,element就像一個黑盒子。你element的一端輸入數據,element對數據進行一些處理,然后數據從element的另一端輸出。拿一個解碼element來說,你輸入一 些有特定編碼的數據,element會輸出相應的解碼數據。
Source elements:為管道產生數據,比如從磁盤或者聲卡讀取數據。源元件不接收數據,僅產生數據。
Like Filter elements:同時擁有輸入和輸出pads , 他們對從輸入pads得到的數據進行操作,然后將數據提供給輸出pads。比如過濾器(filters)、轉換器(convertors)、分流器(demuxers)、整流器(muxers)
Recv elements : 接收element是媒體管道的末端,它接收數據但不產生任何數據。寫磁盤、利用聲卡播放聲音以及視頻輸出等都是由接收元件實現的
創建一個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'\n");
return -1;
}
printf("successful to make element...\n");
gst_object_unref (GST_OBJECT (element));
printf("destory the element...\n");
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'\n");
return -1;
}
element = gst_element_factory_create (factory, "source");
if (!element) {
g_print ("Failed to create element, even though its factory exists!\n");
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'.\n", name);
g_free (name);
gst_object_unref (GST_OBJECT (element));
return 0;
}