介紹gstreamer的基礎概念。
Elements
element是gstreamer中最重要的對象類。通常,你将建立一條由多個element連結到一起而組成的鍊路,并讓資料流從該這鍊路通過。 一個element具有一項特定功能,可以是從檔案中讀取資料,對該資料進行解碼或将該資料輸出到您的聲霸卡(或其他任何東西)。 通過将幾個這樣的element連結在一起,可以建立一個pipeline 完成特定任務(例如媒體播放或捕獲)。 預設情況下,GStreamer附帶了大量element,這使得開發各種媒體應用程式成為可能。 如果需要,您還可以編寫新的element。 該主題在《 GStreamer插件編寫者指南》中有大量說明。
Elements
element是gstreamer中最重要的對象類。通常,你将建立一條由多個element連結到一起而組成的鍊路,并讓資料流從該這鍊路通過。 一個element具有一項特定功能,可以是從檔案中讀取資料,對該資料進行解碼或将該資料輸出到您的聲霸卡(或其他任何東西)。 通過将幾個這樣的element連結在一起,可以建立一個pipeline 完成特定任務(例如媒體播放或捕獲)。 預設情況下,GStreamer附帶了大量element,這使得開發各種媒體應用程式成為可能。 如果需要,您還可以編寫新的element。 該主題在《 GStreamer插件編寫者指南》中有大量說明。
Pads
Pads是element的輸入和輸出元件,用來連接配接其他element的輸入和輸出。 它們用于協商element之間的連結和資料流。 可以将pad視為element上的“插頭”或“端口”,它可以與其它element建立連結,資料可以通過這些元素流入或流出這些元素。 pad具有特定的資料處理功能:pad可以限制流經它的資料類型。 僅當兩個pad允許的資料類型(處理能力)相容時,才允許在兩個pad之間建立連結。 資料類型在pad之間使用稱為caps negotiation的過程進行協商。 資料類型由GstCaps描述。
在這裡做個類比可能會比較容易了解。 pad似于實體裝置上的插頭或插孔。 考慮例如由音頻放大器,DVD播放器和(靜音)視訊投影儀組成的家庭影院系統。 因為兩個裝置都有音頻插孔,是以可以将DVD播放器連結到放大器;由于兩個裝置都具有相容的視訊插孔,是以可以将投影機連結到DVD播放器。 由于投影機和放大器的插孔類型不同,是以可能無法建立投影機和放大器之間的連結。 GStreamer中的pad的作用與家庭影院系統中的插孔相同。
在大多數情況下,GStreamer中的所有資料都通過element之間的連結以一種方式流動。 資料通過一個或多個source pad流出一個element,而element通過一個或多個sink pad接收輸入資料。source element 和 sink element 分别僅具有source pad 和 sink pad。 資料通常表示緩沖區(由GstBuffer對象描述)和事件(由GstEvent對象描述)。
Bins and pipelines
Bins是用于容納一組element的容器。 由于bin本身就是element的子類,是以您幾乎可以将bin當作element來進行控制,進而為應用程式抽象出很多複雜性。 例如,您可以通過更改bin本身的狀态來更改bin中所有element的狀态。 bin還會轉發其包含的子項中的總線消息(例如錯誤消息,标記消息或EOS消息)。
pipeline是頂層容器。 它為應用程式提供消息總線,并管理其所包含的element的同步。 當您将其設定為PAUSED或PLAYING狀态時,資料流将開始流動并且媒體處理也開始進行。 一旦啟動,pipeline将在單獨的線程中運作,直到您停止它們或到達資料流的末尾為止。
Communication
GStreamer提供了幾種用于在應用程式和pipeline之間進行通信和資料交換的機制。
1、buffers 是用于在pipeline中的element之間傳遞流資料的對象。buffers始終從sources移動到sinks(下遊)。
2、events 是在element之間或從應用程式發送到element的對象。events 可以在上遊和下遊傳播。下遊事件可以同步到資料流。
3、messages 是由 element 釋出到 pipeline的消息總線上的對象,這些element将在消息總線中保留以供應用程式收集。messages可以從釋出消息的element的所在的流線程上下文中同步攔截并處理,但是通常由應用程式從應用程式的主線程以異步的方式處理。messages用于以線程安全的方式将資訊(例如錯誤,标簽,狀态更改,緩沖狀态,重定向等)從element傳輸到應用程式。
4、queries允許應用程式從管道中請求諸如持續時間或目前播放位置之類的資訊。queries總是同步地應答。element還可以使用queries從其對等的element請求資訊(例如檔案大小或持續時間)。可以在pipeline中同時使用它們,但是上遊查詢更為常見。