從 ds4.0 開始就除錯了 deepstream 動態增減源的功能,好長時間沒接觸,又生疏了。好記性不如爛筆頭,趁著今天回顧**,把過程記錄一下
我們先把他跑起來,然後我再介紹一下這**的思路,以及我除錯過程中遇到的一些問題
cd runtime_source_add_delete
make
make 完生成可執行檔案,可以使用以下邊的方式測試
$ ./deepstream-test-rt-src-add-del file:///opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_1080p_h264.mp4
執行起來後的效果是:每隔 10s 新增一路輸入,通過 tiler 模式顯示,最多增加到 4 路,然後開始每隔 10s 刪除一路,直到刪完後,結束整個程序。
在 deepstream_test_rt_src_add_del.c 中,首先會建立一條 pipeline,順序如下
uridecodebin -> streammux -> pgie -> tracker -> sgie1 -> sgie2 -> sgie3 -> tiler -> nvvideoconvert -> nvosd -> sink然後增加乙個定時函式,
g_timeout_add_seconds (10, add_sources, (gpointer) g_source_bin_list);
表示每隔 10s 執行一遍 add_sources 函式,進入該函式
static gboolean
add_sources (gpointer data)
while (g_source_enabled[source_id]);
g_source_enabled[source_id] = true;
// 建立 uridecodebin
// uridecodebin 是一種能自動識別 url 類別並對應解碼的一種source bin
g_print ("calling start %d \n", source_id);
source_bin = create_uridecode_bin (source_id, uri);
if (!source_bin)
// 更新全域性變數,儲存 source 列表
g_source_bin_list[source_id] = source_bin;
// 將生成的 source_bin 加到 pipeline 中
gst_bin_add (gst_bin (pipeline), source_bin);
// 設定新加的 source_bin 狀態為 playing,並得到狀態返回值
state_return =
gst_element_set_state (g_source_bin_list[source_id], gst_state_playing);
switch (state_return)
// 計數
g_num_sources++;
if (g_num_sources == max_num_sources)
// 返回 true,會繼續下一次定時任務
return true;
}
如**中說明的,當達到設定的最大輸入數量時,結束新增,開始刪除,也是通過 g_timeout_add_seconds 定時任務,進入 delete_source 函式來完成
delete_source 函式主要是對列表的一些判斷,真正執行刪除的是 stop_release_source 函式
static void
stop_release_source (gint source_id)
}
原理其實很簡單,關於動態替換 element 的過程,我在 gstreamer 專欄中有過介紹,可以參考《gstreamer應用開發手冊14:替換管道元件》
calling stop 3
state change success
state change success 0x7e640052c0
error from element source: unhandled error
error details: gstrtspsrc.c(6161): gst_rtspsrc_send (): /gstpipeline:dstest-pipeline/gsturidecodebin:source-bin-03/gstrtspsrc:source:
option not supported (551)
returned, stopping playback
deleting pipeline
這個問題我曾經在論壇中提問過,可惜沒得到好的解決方案
在論壇中查了一下類似的問題,大概原因是說 rtsp 輸入不支援暫停等操作,如下
這裡提供乙個「暴力」的方法,就是注釋掉 bus_call 裡邊的 g_main_loop_quit (loop) 函式,也能執行起來,但依然會輸出相關的錯誤資訊。
另外一種方法是修改 rtsp source bin 的原始碼,因為涉及的內容比較細且通用,有時間了研究下。
linux 命令系列之算術運算(50)
1.declare 宣告變數類似 格式 declare 選項 變數名 給變數設定型別屬性 這裡很不習慣 取消變數型別屬性 i 將變數宣告為整數型 integer x 將變數申明為環境變數 習慣使用export p 顯示指定變數的被宣告型別 eg 方法1 aa 11 bb 22 cc aa bb ec...
python系列教程50
宣告 在人工智慧技術教學期間,不少學生向我提一些python相關的問題,所以為了讓同學們掌握更多擴充套件知識更好的理解人工智慧技術,我讓助理負責分享這套python系列教程,希望能幫到大家!由於這套python教程不是由我所寫,所以不如我的人工智慧技術教學風趣幽默,學起來比較枯燥 但它的知識點還是講...
劍指Offer系列之題46 題50
目錄從撲克牌隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王可以看成任意數字。找出最大最小值,0的數量,判斷最大最小值的差中的空缺數是否小於等於0的個數 1.快排 快排超時,使用arrays.sort numbers pu...