gstreamer的編程知識,gstreamer作為linux下的多媒體應用以其優良的構思
得到了極大的關注,這種編程思想和方法是非常優秀的. 對於gstreamer編程,我們一般的做
法如下:
1.用gst_element_factory_find找到一個工廠對象(factory object),比如說"mad"是用於
mp3的工廠對象,工廠對象主要用於產生元件. 我們這裡用mad工廠主要是要mp3的
decoder元件的啊~~~
2.然後用gst_element_factory_create得到element對象,element對象是gstreamer用於實
現某些特定功能的模組,比如說srcfile用於讀取location檔案,play_audio用於播放音
樂,decoder用於mp3解碼等等. 上面這兩步可以用gst_element_factory_make
("factory name","element name");來一步登天;
3.pad(襯件)基本上就是一個element的對外介面,兩個element之間需要用pad才能串連起
來,可以通過gst_element_get_pad來得到element的pad;
4.bin(箱櫃)是一個特殊的element,提供element的通道和容器. 可以容納幾個element並
且將他們串連起來,主要有兩種GstPipeLine和GstThread(用於嚴格的音視屏同步),當然
我們也可以把幾個bin串連起來,不過我們說過,要有pad才可以做link的動作,所以可以
用ghost_pad來取得bin的sub element的pad作為bin的pad
5.state,串連完成之後我們就可以通過修改bin的state來啟動資料流處理,通常的state有
這幾種: NULL,ready,parse,playing. playing就是開始處理了哦. 注意,播放完成要把
state改成NULL才能保證gstreamer釋放資源.
範常式序如下:
#include <gst/gst.h>
int main (int argc,char *argv[])
{
GstElement *pipeline,*filesrc,*decoder,*audiosink;
gst_init(&argc,&argv);
if (argc != 2) {
g_print ("usage: %s <mp3 filename>/n",argv[0]);
exit (-1);
}
/* 建立一條新的管道 */
pipeline = gst_pipeline_new ("pipeline");
/* 產生用於讀取硬碟資料的元件 */
filesrc = gst_element_factory_make ("filesrc","disk_source");
g_object_set (G_OBJECT (filesrc),"location",argv[1],NULL);
/* 建立解碼器元件 */
decoder = gst_element_factory_make ("mad","decoder");
/* 建立音頻回放元件 */
audiosink = gst_element_factory_make ("osssink","play_audio");
/* 將產生的元件添加到管道中 */
gst_bin_add_many
(GST_BIN (pipeline),filesrc,decoder,audiosink,NULL);
/* 串連各個元件 */
// 由於這些element都只有一個入口一個出口,所以可以這樣做,不需要
// 指定pad而直接連接起來
gst_element_link_many (filesrc,decoder,audiosink,NULL);
/* 開始播放 */
gst_element_set_state (pipeline,GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
/* 停止管道處理流程 */
gst_element_set_state (pipeline,GST_STATE_NULL);
/* 釋放佔用的資源 */
gst_object_unref (GST_OBJECT (pipeline));
exit (0);
}
但是這個範常式序在我的linux下找不到mad這個factory,所以不能運行...