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