DeepStream5 0系列之動態增減輸入源

2021-10-13 09:51:26 字數 2669 閱讀 3252

從 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...