1)概述
管道的數據流由一組緩沖區和事件組成,緩沖區包括實際的管道數據,事件包括控制信息,如尋找信息和流的終止信號。所有這些數據流在運行的時候自動的流過管道。
2) 緩沖區(Buffers)
緩沖區包含了你創建的管道里的數據流。通常一個source element會創建一個新的緩沖區,同時element還將會把緩沖區的數據傳遞給下一個element。當使用GStreamer底層構造來創建一個媒體管道的時候,你不需要自己來處理緩沖區,element將會為你處理這些緩沖區。
一個緩沖區主要由以下一個組成:
指向某塊內存的指針
內存的大小
緩沖區的時間戳
一個引用計數,指出了緩沖區所使用的element數。沒有element可引用的時候,這個element將用於銷毀緩沖區。
這里有一個簡單的例子,我們先創建了一個緩沖區,然后為這個緩沖區分配內存,然后將數據存放在緩沖區中,並傳遞至下一個element。該element讀取數據,處理某些事件(像創建一個新的緩沖區並進行解碼),對該緩沖區解引用,這將造成數據空閑,導致緩沖區被銷毀。典型的音頻和視頻解碼器就是這樣工作的。
盡管如此,還有一些更為復雜的設定,element會適當的修改緩沖區,也就是說,不會分配一個新的緩沖區。element也可以寫入硬件內存(如視頻捕獲源)或是使用XShm從X-server分配內存。緩沖區只能讀,等等。
3)事件(Events)
事件是一系列控制粒子,隨着緩沖區被發送到管道的上游和下游。下游事件通知流狀態相同的element,可能的事件包括中斷,flush,流的終止信號等等。在應用程序與element之間的交互以及事件與事件之間的交互中,上游事件被用於改變管道中數據流的狀態,如查找。對於應用程序來說,上游事件非常重要,下游事件則是為了說明獲取更加完善的數據概念上的圖像。
由於大多數應用程序以時間為單位查找,下面的例子實現了同樣的功能:
static void seek_to_time (GstElement *element, guint64 time_ns)
{
GstEvent *event;
event = gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_TIME, time_ns);
gst_element_send_event (element, event);
}
以上代碼主要是說明其具體的工作原理,快捷算法是一個函數 gst_element_seek ()。