一、**流(streams )
流線程中包含事件和快取如下:
-events
-new_segment (ns)
-eos (eos) *
-tag (t)
-buffers (b) *
其中標* 號的需要同時鐘進行同步。
典型的流如圖1 所示:
圖1 **流組成圖
(1 )new_segment,rate, start/stop, time
包括了有效的時間戳範圍(start/stop );stream_time; 需要的回放率以及已經應用的回放率。
(2 )buffers
只有處於new_segment 的start 和stop 之間的buffers 是可以被顯示的,否則將被丟棄或者裁剪。
running_time 的計算:
if(ns.rate > 0.0)
running_time= (b.timestamp - ns.start) / ns.abs_rate + ns.accum
else
running_time= (ns.stop - b.timestamp) / ns.abs_rate + ns.accum
stream_time 的計算:
(3 )eos
資料的結束。
圖2 gstreamer時鐘和變數圖(引自gstreamer文件)
由此可以得出:
running_time = clock_time - base_time;
如果**流按照同一頻率從開始到結束執行,那麼running_time == stream_time;
running time的詳細計算:
running_time是基於管道所選的時鐘的,它代表了**處於playing狀態的總時間,如表1所示。
表1 running_time的計算表
管道狀態
running_time
null/ready
undefined
paused
暫停時的時間
playing
absolute_time - base_time
flushing seek
0四、延遲(latency)的計算與實現
1、延遲的引入
管道中元素與時鐘的同步僅僅發生在各個sink中,如果其他元素對buffer沒有延遲的話,那麼延遲就為0。延遲的引入主要是基於這樣的考 慮,buffer從source推送到sink會花費一定的時間,從而可能導致buffer被丟棄。這個問題一般發生在活動管道,sink被設定為 playing並且buffer沒有被預送(preroll)至sink。
2、延遲的實現
一般的解決方案是在被預送(preroll)之前所有的sink都不能設定為playing狀態。為了達到這樣的目的,管道需要跟蹤所有需要預送的元素 (就是在狀態改變後返回async的元素),這些元素傳送乙個async_start訊息,當元素進行預送,便把狀態設定為paused,同時傳送乙個 async_done訊息,該訊息恰好與之前的async_start相對應。當管道收集了所有的與async_start訊息對應的 async_done訊息以後便可以開始計算全域性延遲了。
3、延遲的計算
延遲的計算方法如圖3所示。
圖3 延遲的計算
管道通過傳送乙個latency事件給管道中的所有sink來給管道設定延遲,該事件為sinks配置總的延遲,延遲對所有的sink來說都是相同的,這樣sink在提交資料時可以保持相對的同步。
data structure 樹的一些基本概念
定義 乙個樹,每個內部節點,最多只有兩個子節點,每個節點的子節點是有序的,一般稱為left child和right child。遞迴的定義 乙個樹有乙個單個根節點,或者乙個樹其根節點有兩個有序的子節點,每個節點又是乙個二叉樹的根節點。對於非空二叉樹t,n 0 為葉子節點數,而 n 2 是度2節點數,...
Oracle Inventory裡的一些概念
事務處理 transaction 是指物料移入庫存 在庫存內移動以及移出庫存.物料搬運單 move order 是在乙個組織內對物料進行移動的請求.保留 reservation 是 與需求 之間的關聯。保留將在 與需求 之間建立乙個永久的資料關聯,代表指定需求 的乙個可靠的物料分配。現有量 on h...
FreeSWITCH與人工智慧一些基本概念
ai是artificial intelligence的縮寫,也就是我們所說的人工智慧。freeswitch很早的版本就有asr和tts介面。是的,freeswitch本身其實並不做asr和tts。asr的全稱是automatic speech recognition,即自動語音識別。tts的全稱是t...