緩沖區和事件
流經pipeline的資料由緩沖區和事件的組合構成。緩沖區包含實際的媒體資料。事件包含控制資訊 ,例如seeking 資訊和end-of-stream通知。在pipeline運作時,所有這些都是自動流經pipeline。本章主要是為了向您解釋這個概念;你不需要為此做任何事情。
緩沖區
緩沖區包含将流經您建立的pipeline的資料。source element通常會建立一個新的緩沖區,并将其通過 pad 傳遞到鍊中的下一個element 。使用 GStreamer 基礎架建構立媒體pipeline時,您不必自己處理緩沖區;elements 會為你做到這一點。
除其他外,緩沖區包括:
- 指向記憶體對象的指針。記憶體對象封裝記憶體中的一個區域。
- 緩沖區的時間戳。
- 一個引用計數,訓示有多少elements正在使用此緩沖區。當沒有element引用緩沖區時,此引用計數将用于銷毀緩沖區。
- 緩沖區标志。
簡單的情況是建立一個緩沖區,配置設定記憶體,将資料放入其中,然後傳遞給下一個element。該element讀取資料,執行某些操作(例如建立新緩沖區并對其進行解碼),并取消引用緩沖區。這會導緻資料被釋放并銷毀緩沖區。典型的視訊或音頻解碼器是這樣工作的。
不過,還有更複雜的場景。Elements可以就地修改緩沖區,即無需配置設定新緩沖區。Elements還可以寫入硬體記憶體(例如來自video-capture sources)或從 X-server 配置設定的記憶體(使用 XShm)。緩沖區可以是隻讀的,等等。
事件
事件是與緩沖區一起在pipeline中向上遊和向下遊發送的控制粒子。下遊事件通知流狀态的其他elements。可能的事件包括seeking, flushes, end-of-stream等。上遊事件用于application-element互動以及element-element互動以請求更改流狀态,例如seeks。對于應用程式,隻有上遊事件是重要的。對下遊事件的解釋隻是為了更全面地了解資料概念。
由于大多數應用程式以時間機關進行seek ,我們下面的示例也是這樣做的:
static void
seek_to_time (GstElement *element,
guint64 time_ns)
{
GstEvent *event;
event = gst_event_new_seek (1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_NONE,
GST_SEEK_METHOD_SET, time_ns,
GST_SEEK_TYPE_NONE, G_GUINT64_CONSTANT (0));
gst_element_send_event (element, event);
}
函數gst_element_seek()是這種方法的快捷方式。這裡主要是為了展示它是如何工作的。