天天看點

Gstreamer-緩沖區和事件(Buffers and Events)

緩沖區和事件

流經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()是這種方法的快捷方式。這裡主要是為了展示它是如何工作的。