GStreamer學習筆記(一)

2021-09-05 21:01:50 字數 3906 閱讀 6575

本文介紹如何使用

gstreamer

編寫乙個簡單的

***

1,需要使用

mad解碼外掛程式,因此需要先安裝

gstreamer0.10-plugins-ugly 2

,編寫***

下面來看看如何利用

gstreamer

框架提供的元件,來實現乙個簡單的

***

如果想要在程式中應用

gstreamer

提供的各種功能,首先必須在主函式中呼叫

gst_init()

來完成相應的初始化工作,以便將使用者從命令列輸入的引數傳遞給

gstreamer

函式庫。乙個典型的

gstreamer

應用程式的初始化如下所示:

#include 

<

gst/

gst.h

>

intmain (

intargc, 

char

*argv)

接下去需要建立三個元件並連線成管道,由於所有

gstreamer

元件都具有相同的基類

gstelement

,因此能夠採用如下方式進行定義:

gstelement 

*pipeline, 

*filesrc, 

*decoder, 

*audiosink;

管道在gstreamer

框架中是用來容納和管理元件的,下面的**將建立一條名為

pipeline

的新管道:

/*建立用來容納元件的新管道 

*/pipeline 

=gst_pipeline_new (

"pipeline");

資料來源元件負責從磁碟檔案中讀取資料,它具有名為

location

的屬性,用來指明檔案在磁碟上的位置。使用標準的

gobject

屬性機制可以為元件設定相應的屬性: /*

建立資料來源元件 

*/filesrc 

=gst_element_factory_make (

"filesrc", 

"disk_source");

g_object_set (g_object (filesrc), 

"location

", argv[

1], null);

過濾器元件負責完成對

***格式的資料進行解碼,最簡單的辦法是安裝

mad這一外掛程式,借助它來完成相應的解碼工作:

/*建立過濾器元件 

*/decoder 

=gst_element_factory_make (

"mad", 

"decoder

"); 

/*建立接收器元件 

*/audiosink 

=gst_element_factory_make (

"audiosink", 

"play_audio")

已經建立好的三個元件需要全部新增到管道中,並按順序連線起來:

/*新增元件到管道中 

*/gst_bin_add_many (gst_bin (pipeline), filesrc, decoder, audiosink, null);

/*通過襯墊連線元件 

*/gst_element_link_many (filesrc, decoder, audiosink, null); 

所有準備工作都做好之後,就可以通過將管道的狀態切換到

playing

狀態,來啟動整個管道的資料處理流程:

/*啟動管道 

*/gst_element_set_state (pipeline, gst_state_playing); 

這裡加入乙個訊息處理函式

bus_call

來監視產生的訊息

/*終止管道 

*/gst_element_set_state (pipeline, gst_state_null);

/*釋放資源 

*/gst_object_unref (gst_object (pipeline));

3,完整的源**如下所示:

#include 

<

gst/

gst.h

>

#include 

<

glib.h

>

//定義訊息處理函式,

static

gboolean bus_call(gstbus 

*bus,gstmessage 

*msg,gpointer data)

default

:break;}

return

true;

}int

main(

intargc,

char

*argv)

//建立管道和元件

pipeline 

=gst_pipeline_new(

"audio-player");

source 

=gst_element_factory_make(

"filesrc",

"file-source");

decoder 

=gst_element_factory_make(

"mad",

"mad-decoder");

sink 

=gst_element_factory_make(

"autoaudiosink",

"audio-output");

if(!pipeline

||!source

||!decoder

||!sink)

//設定 source的location 引數。即 檔案位址.

g_object_set(g_object(source),

"location

",argv[

1],null);

//得到 管道的訊息匯流排

bus 

=gst_pipeline_get_bus(gst_pipeline(pipeline));

//新增訊息監視器

gst_bus_add_watch(bus,bus_call,loop);

gst_object_unref(bus);

//把元件新增到管道中.管道是乙個特殊的元件,可以更好的讓資料流動

gst_bin_add_many(gst_bin(pipeline),source,decoder,sink,null);

//依次連線元件

gst_element_link_many(source,decoder,sink,null);

//gst_element_set_state(pipeline,gst_state_playing);

g_print(

"running

//開始迴圈

g_main_loop_run(loop);

g_print(

"returned,stopping playback\n");

gst_element_set_state(pipeline,gst_state_null);

gst_object_unref(gst_object(pipeline));

return0;

} 4,編譯執行

gcc -wall 

$(pkg-config --cflags --libs gstreamer-

0.10

)-g test2

.c -o test2

./test2 

/home

/phinecos

/test

.***

GStreamer學習筆記(一)

本文介紹如何使用 gstreamer 編寫乙個簡單的 1,需要使用 mad解碼外掛程式,因此需要先安裝 gstreamer0.10 plugins ugly 2 編寫 下面來看看如何利用 gstreamer 框架提供的元件,來實現乙個簡單的 如果想要在程式中應用 gstreamer 提供的各種功能,...

GStreamer學習筆記(一)

1,需要使用mad解碼外掛程式,因此需要先安裝gstreamer0.10 plugins ugly 如果想要在程式中應用gstreamer提供的各種功能,首先必須在主函式中呼叫gst init 來完成相應的初始化工作,以便將使用者從命令列輸入的引數傳遞給gstreamer函式庫。乙個典型的gstre...

GStreamer學習筆記(一)

內容 1,需要使用mad解碼外掛程式,因此需要先安裝gstreamer0.10 plugins ugly 如果想要在程式中應用gstreamer提供的各種功能,首先必須在主函式中呼叫gst init 來完成相應的初始化工作,以便將使用者從命令列輸入的引數傳遞給gstreamer函式庫。乙個典型的gs...