gstreamer1 0動態替換element

2021-10-21 02:38:31 字數 1315 閱讀 6387

pipeline處於playing狀態時,如果要動態替換element元件,而又不從新停止pipeline,開始pipeline,則會用到下面的動態替換element元件。

element元件包括ending element和filter element,所以包括如下2類:

一、filter element替換:

【原理】 處於非ending point的element元件,在替換某元件時,在unlink舊的元件,link新的元件之前,需要新增probe eos探針,eos訊號給被替換元件的sinkpad,srcpad獲取eos訊號後才能進行element的remove.

具體的**上面的鏈結中也給出了。

具體意思就是:通過g_timeout_add_seconds()函式新增定時器,每秒實現effect裡面的element的元件替換。

二、ending element替換:

ending point element元件替換,包括src element和sink element元件。這裡以src element元件為例說明:

「imxv4l2videosrc device=/dev/video1 ! overlaysink show-preroll-frame=false」     

我想動態修改imxv4l2videosrc的屬性,crop-meta-width和crop-meta-height,以實現電子倍焦的功能。但是自己通過g_object_set()的方式修改playing狀態下的該屬性,不能work。

(後面通過閱讀imxv4l2videosrc的該外掛程式原始碼,知道了crop-meta-width和crop-meta-height在init的時候約定了mem_pool的大小,後面playing後沒有作用)

所以只能通過replace imxv4l2videosrc的crop-meta-width=xx crop-meta-height=xx來實現該效果。

【原理】 

(1)、gst_element_set_state(pipeline, gst_state_paused);

(2)、gst_pad_add_probe(element, probe_type_block_downstream) ==> 阻塞element的src-pad 

(3)、remove_element()    ==>unlink_element()   remove_element()

(4)、create_element()    ==> create_element() gst_bin_add_element()

(5)、gst_element_set_state(data->src, gst_state_playing);

【**】

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

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

外掛程式的「動態替換」

assembly.loadfrom addinfilepath 現在,我們需要轉個彎 assembly asm null 先將外掛程式拷貝到記憶體緩衝 byte addinstream null if filehelper.readfiletobuff addinfilepath outaddins...

c excel vsto 批註公式動態替換

設定注釋公式賦給作價表 public static void setcommentformula worksheet worksheet regexoptions.ignorecase matchcollection matches regex.matches comtext var result ...