GStreamer學習5----probe數據探測

參考資料:

gstreamer中如何使用probe(探針)獲取幀數據_gstreamer 視頻編碼時獲取視頻關鍵幀信息-CSDN博客

Gstreamer中可以使用AppSink作為一個分支來查看管線中的數據,還可以使用probe去處理。

在GStreamer中,probe是一種強大的機制,用于在管道(pipeline)的不同點上檢查、修改或攔截數據流。當數據流經管道中的元素時,probe允許開發者在特定的pad(輸入或輸出端口)上設置監聽器,從而可以捕獲或處理正在通過的數據。

GStreamer提供了幾種不同類型的probe:

  1. Buffer Probe (GST_PAD_PROBE_TYPE_BUFFER): 這是最常見的類型,它會在緩沖區(buffer)到達指定pad時被觸發。緩沖區通常包含了一幀音頻或視頻數據。

  2. Event Probe (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAMGST_PAD_PROBE_TYPE_EVENT_UPSTREAM): 這種probe會在事件(event)通過pad時觸發。事件可以是各種各樣的信號,如標記(mark)、緩沖區開始(buffer start)或結束(buffer end)等。

  3. Block Probe (GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAMGST_PAD_PROBE_TYPE_BLOCK_UPSTREAM): 這種probe可以阻止數據流,直到回調函數返回一個非阻塞的狀態。

  4. Latency Probe (GST_PAD_PROBE_TYPE_LATENCY): 這種probe用于測量數據從進入管道到離開管道所花費的時間。

  5. Buffer List Probe (GST_PAD_PROBE_TYPE_BUFFER_LIST): 類似于Buffer Probe,但可以處理多個連續的緩沖區。

為了在GStreamer中添加probe,你需要調用gst_pad_add_probe()函數,傳入你想要監控的pad以及一個回調函數,當probe被觸發時將執行此回調。回調函數的原型通常如下:

 

C

深色版本

1gboolean probe_callback (GstPad *pad,
2                         GstPadProbeInfo *info,
3                         gpointer user_data);

在回調函數中,你可以訪問和操作GstPadProbeInfo結構,這包含了觸發probe的數據(如緩沖區或事件)。你可以選擇是否讓數據繼續通過管道,或者修改數據并讓它通過,甚至完全阻止數據。

例如,一個簡單的Buffer Probe回調函數可能如下所示:

 

C

深色版本

1static GstPadProbeReturn
2cb_have_data (GstPad *pad,
3              GstPadProbeInfo *info,
4              gpointer data)
5{
6  GstBuffer *buf;
7
8  /* Cast the info to a buffer probe info */
9  buf = GST_PAD_PROBE_INFO_BUFFER (info);
10
11  /* Do something with the buffer here... */
12
13  /* Let the buffer pass through */
14  return GST_PAD_PROBE_OK;
15}

通過使用probe,開發者可以在不打斷數據流的情況下進行調試、性能分析或實時數據處理,這在開發復雜的流媒體應用程序時非常有用。

一個例子

添加probe

? //date probe
? GstPad* pad = gst_element_get_static_pad(videosink, "sink");
? gst_pad_add_probe(pad, GST_PAD_PROBE_TYPE_BUFFER,
? ? (GstPadProbeCallback)cb_have_data, NULL, NULL);
? gst_object_unref(pad);

回調方法


static GstPadProbeReturn
cb_have_data(GstPad* pad,
? GstPadProbeInfo* info,
? gpointer user_data) {

? GstBuffer* buffer = NULL;
? GstMapInfo map_info;
? GstStructure* s;
? gint width, height;?? ?//圖片的尺寸

? GstCaps* sink_caps = gst_pad_get_current_caps(pad);
? s = gst_caps_get_structure(sink_caps, 0);

? gboolean res;
? res = gst_structure_get_int(s, "width", &width);?? ??? ?//獲取圖片的寬
? res |= gst_structure_get_int(s, "height", &height);?? ?//獲取圖片的高
? if (!res) {
? ? g_print("gst_structure_get_int fail\n");

? ? return GST_PAD_PROBE_DROP;
? }
? g_print("width=%d, height=%d \n", width, height);
? return GST_PAD_PROBE_OK;
}
?

完整例子


static GstPadProbeReturn
cb_have_data(GstPad* pad,GstPadProbeInfo* info,gpointer user_data) {GstBuffer* buffer = NULL;GstMapInfo map_info;GstStructure* s;gint width, height;	//圖片的尺寸GstCaps* sink_caps = gst_pad_get_current_caps(pad);s = gst_caps_get_structure(sink_caps, 0);gboolean res;res = gst_structure_get_int(s, "width", &width);		//獲取圖片的寬res |= gst_structure_get_int(s, "height", &height);	//獲取圖片的高if (!res) {g_print("gst_structure_get_int fail\n");return GST_PAD_PROBE_DROP;}g_print("width=%d, height=%d \n", width, height);return GST_PAD_PROBE_OK;
}

從打印結果中,可以看到,回調方法被調用了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42415.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LayerNorm Plugin的使用與說明

目錄 前言0. 簡述1. Layernorm Plugin的使用1.1 源碼下載1.2 模型下載和修改1.3 環境配置1.4 編譯1.4 engine生成和執行(trtexec)1.5 enging生成和執行(C API) 2. 補充說明2.1 RTMO顯存占用問題2.2 插件找不到的說明2.3 LayerNorm plugin封裝的嘗試2.4 layerNorm plugin核函數實…

拉曼光譜入門:3.拉曼光譜的特征參數與定量定性分析策略

1.特征參數 1.1 退偏振率 退偏振率(p)是一個衡量拉曼散射光偏振狀態的參數,它描述了拉曼散射光的偏振方向與入射光偏振方向之間的關系。退偏振率定義為垂直偏振方向的拉曼散射強度與平行偏振方向的拉曼散射強度之比。退偏振率(p&…

禁用windows的語音識別快捷鍵win+ctrl+s

win11組合鍵winctrls會彈出語音識別提示,即使到設置里禁用了語音識別也沒用 解決辦法:安裝PowerToys,通過“鍵盤管理器”-“重新映射快捷鍵”禁用 PowerToys是微軟自己的工具,不用擔心安全問題,下載地址:h…

系統設計題-簡易數據庫系統

一、設計一個簡易數據庫系統,包含create,insert,select三個指令。 create(int tableId,int colNum,String key):創建表,其id為tableId,如果該表已存在,則不做任何處理。colNum為表中列的數量&a…

洛谷 P3008 [USACO11JAN] Roads and Planes G

題意 有一張 n n n 點 ( m 1 m 2 ) (m_1m_2) (m1?m2?) 邊的無向圖,其中 m 1 m_1 m1? 條為無向邊,另外 m 2 m_2 m2? 條為有向邊, 無向邊的邊權可以為負。求 s s s 到其他每個點的最短路。 思路 使用 SPFA 會 T 掉一兩個點&#x…

第10章:網絡與信息安全

目錄 第10章:網絡與信息安全 網絡概述 計算機網絡概念 計算機網絡的分類 網絡的拓撲結構 ISO/OSI網絡體系結構 網絡互聯硬件 物理層互聯設備 數據鏈路層互聯設備 網絡層互聯設備 應用層互聯設備 網絡的協議與標準 網絡標準 TCP/IP協議族 網絡接口層協…

GCC擴展功能、函數,預處理命令

文章目錄 前言一、GCC C語言擴展聲明函數屬性變量屬性內斂匯編與原子操作相關的內建函數內存模型感知原子操作的內置函數使用溢出檢查執行算術的內置函數 - xxx 二、GCC C語言擴展interface和 pragmasTemplate 二、預處理過程及其指令預處理過程1. 字符集轉換2. Initial proces…

實現基于Spring Cloud的事件驅動微服務

實現基于Spring Cloud的事件驅動微服務 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 事件驅動架構在現代微服務架構中越來越受歡迎,它通過事件的…

【JAVA多線程】線程池概論

目錄 1.概述 2.ThreadPoolExector 2.1.參數 2.2.新任務提交流程 2.3.拒絕策略 2.4.代碼示例 1.概述 線程池的核心: 線程池的實現原理是個標準的生產消費者模型,調用方不停向線程池中寫數據,線程池中的線程組不停從隊列中取任務。 實現…

最新版Python安裝教程

一、安裝Python 1.下載Python 訪問Python官網: https:/www.oython.orgl 點擊downloads按鈕,在下拉框中選擇系統類型(windows/Mac OS./Linux等) 選擇下載最新穩定版本的Python 以下內容以演示安裝Windows操作系統64位的python 左邊是穩定發布版本Stabl…

python網絡編程-TCP/IP

鏈路層 幀組成(按順序): 目標MAC:6B 源MAC:6B 類型:2B 數據:46B-1500B CRC:4B 其中,源MAC為主機網卡地址,類型為來源網絡層的數據類型,ipv…

Self-Instruct構造Prompt的例子

人工構造一批Prompt做種子。(Starting with a small seed set of human-written tasks)每次把一些種子后來生成的Prompt,放到Input里做few-shot examples,用LLM生成更多的Prompt;(Using the LLM to generat…

PyTorch學習之torch.transpose函數

PyTorch學習之torch.transpose函數 一、簡介 torch.transpose 函數我們用于交換張量的維度。 二、語法 torch.transpose 函數用于交換給定張量的兩個維度,其語法如下: torch.transpose(input, dim0, dim1)三、參數 input:待交換維度的張…

kotlin 基礎

文章目錄 1、安裝 Java 和 Kotlin 環境2、程序代碼基本結構3、變量的聲明與使用4、數據類型5、數字類型的運算1)布爾類型2)字符類型3)字符串類型 6、 選擇結構1)(if - else)2) 選擇結構(when&am…

useImperativeHandle淺談

useImperativeHandle 是 React Hooks 提供的一個高級功能,它允許你在函數式組件中自定義并暴露特定的實例值或方法給父組件。主要的作用是: 自定義對外暴露的實例值或方法: 通常情況下,函數式組件內部的實例值或方法對外是不可見的&#xff0…

如何有效管理你的Facebook時間線?

Facebook作為全球最大的社交平臺之一,每天都有大量的信息和內容在用戶的時間線上展示。有效管理你的Facebook時間線,不僅可以提升用戶體驗,還能夠幫助你更好地控制信息流和社交互動。本文將探討多種方法和技巧,幫助你有效管理個人…

分班結果老師怎么發給家長?

分班結果老師怎么發給家長? 隨著新學期的腳步漸近,老師們的工作也變得愈發繁忙。從準備教學計劃到整理課程材料,每一項任務都不容小覷。而其中,分班結果的告知工作,更是讓不少老師頭疼不已。傳統的分班通知方式&#…

7、Redis主從復制過程

Redis主從復制過程 ? 當一個Redis節點(Slave節點)接受到類似slaveof 127.0.0.1 6380的指令直到其可以從master持續復制數據,大致經歷如下過程: 1、保存master地址 ? 當slave接收到slaveof命令后,slave會立即將新的…

Python爬蟲與數據可視化:構建完整的數據采集與分析流程

Python爬蟲技術概述 Python爬蟲是一種自動化的數據采集工具,它可以模擬瀏覽器行為,訪問網頁并提取所需信息。Python爬蟲的實現通常涉及以下幾個步驟: 發送網頁請求:使用requests庫向目標網站發送HTTP請求。獲取網頁內容&#xf…

.gitignore 的奧秘:前端開發者必須了解的文件忽略規則(二).gitignore 匹配規則

.gitignore 匹配規則 Git 版本管理在開發中場景,其中.gitignore也是Git中必不可少的配置文件,.gitignore 文件用于告訴 Git 哪些文件或目錄應該被忽略,即不被版本控制系統跟蹤和提交。 系列文章,上一篇介紹了:.gitigno…