Gstreamer應用開發手冊8 緩衝

2021-10-05 14:28:49 字數 3218 閱讀 4049

gstreamer為以下用例提供支援:

將(半)實時流快取到磁碟上的本地環形緩衝區,並在快取區域中進行查詢。這類似於類似tivo的時移。請參閱時移緩衝。

gstreamer可以為應用程式提供有關當前緩衝狀態的進度報告,還可以讓應用程式決定如何緩衝以及何時停止緩衝。

在最簡單的情況下,應用程式必須偵聽匯流排上的buffering訊息。如果buffering訊息中的百分比指示符小於100,則說明管道正在緩衝。當接收到一條訊息的百分比為100%時,緩衝完成。在緩衝狀態下,應用程式應將管道保持在paused狀態。緩衝完成後,它可以將管道(返回)置於playing狀態。

以下是訊息處理程式如何處理buffering訊息的示例。我們將在緩衝策略中看到更高階的方法。

[...]

switch (gst_message_type (message))

} else

buffering = true;

}break;

case ...

[...]

流緩衝

+---------+ +---------+ +-------+在這種情況下,我們正在從慢速網路源讀取緩衝區元件(例如queue2)。

緩衝元件具有以位元組表示的高低水印。緩衝區使用水印如下:

當解復用器以推模式執行時,可以使用此緩衝方法。定位流需要在網路源中進行定位,當不知道檔案的總持續時間時(例如在實時流**中)或不可能/不需要有效查詢時,這是最理想的。問題在於如何有效配置高低水印,這裡有一些建議:

緩衝元件可以插入管道中的任何位置。例如,您可以在解碼器之前插入緩衝元件。這將使得可以基於時間來設定低/高水印。

playbin上的緩衝標誌對已解析的資料執行緩衝。在稍後階段進行緩衝的另乙個優點是,您可以讓解復用器以拉模式執行。從速度較慢的網路驅動器(帶有filesrc)讀取資料時,這可能是一種有趣的緩衝方式。

+---------+ +----|----+ +-------+

vfile僅當客戶端可以確定伺服器上檔案的長度時,此模式才適用。

+---------+ +----|----+ +-------+

vfile-ringbuffer在實時管道中,我們通常在捕獲和回放元件之間引入一些固定的延遲。可以通過佇列(例如抖動緩衝區)或其他方式(在音訊接收器中)引入此延遲。

緩衝訊息也可以在這些活動管道中發出,並向使用者指示等待時間緩衝。應用程式通常不會對狀態更改的這些緩衝訊息作出反應。

以下是基於緩衝訊息和緩衝查詢實現不同緩衝策略的一些方法

**如下所示:

#include gststate target_state;

static gboolean is_live;

static gboolean is_buffering;

static gboolean

buffer_timeout (gpointer data)

static void

on_message_buffering (gstbus *bus, gstmessage *message, gpointer user_data)}}}

static void

on_message_async_done (gstbus *bus, gstmessage *message, gpointer user_data)

gint

main (gint argc,

gchar *ar**)

/* set up */

pipeline = gst_element_factory_make ("playbin", "pipeline");

g_object_set (g_object (pipeline), "uri", ar**[1], null);

g_object_set (g_object (pipeline), "flags", 0x697 , null);

bus = gst_pipeline_get_bus (gst_pipeline (pipeline));

gst_bus_add_signal_watch (bus);

g_signal_connect (bus, "message::buffering",

(gcallback) on_message_buffering, pipeline);

g_signal_connect (bus, "message::async-done",

(gcallback) on_message_async_done, pipeline);

gst_object_unref (bus);

is_buffering = false;

target_state = gst_state_playing;

ret = gst_element_set_state (pipeline, gst_state_paused);

switch (ret)

/* now run */

g_main_loop_run (loop);

/* also clean up */

gst_element_set_state (pipeline, gst_state_null);

gst_object_unref (gst_object (pipeline));

g_main_loop_unref (loop);

return 0;

}

Gstreamer應用開發手冊9 動態控制引數

gstreamer屬性通常是使用g object set 設定的,但是想實時地呼叫來更改流幾乎是不可能的。控制器子系統提供了一種輕量級的方法來在流執行時調整gobject屬性。控制器要考慮到時間影響,它通過gstcontrolsource控制項來修改屬性。控制源提供0.0到1.0的範圍的時間戳的值。...

深入淺出gstreamer開發

gstreamer 解決什麼問題?上層介面和應用方式的 相對穩定 與底層介面 平台環境的 多樣化。例如 codec 通用元件不靈活與需求的多變。色彩空間轉換 縮放 編譯碼等元件功能是單一的。通過對這些元件進行組合,就可以滿足多變的需求。要想擁有模組性 可移植性和通用的功能,通常是以極高的複雜性為代價...

深入淺出gstreamer開發

gstreamer 解決什麼問題?上層介面和應用方式的 相對穩定與底層介面 平台環境的 通用元件不靈活與需求的多變。色彩空間轉換 縮放 編譯碼等元件功能是單一的。通過對這些元件進行組合,就可以滿足多變的需求。要想擁有模組性 可移植性和通用的功能,通常是以極高的複雜性為代價。計算機系統的萬能解決辦法 ...