專利名稱:用rtp數(shù)據(jù)包的序號(hào)進(jìn)行排序以消除其抖動(dòng)延時(shí)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及IP技術(shù),更具體地說(shuō),涉及一種用RTP數(shù)據(jù)包的序號(hào)進(jìn)行排序以消除其抖動(dòng)延時(shí)的方法。
背景技術(shù):
VoIP(Voice Over IP,即IP語(yǔ)音技術(shù))技術(shù)的出現(xiàn)給傳統(tǒng)的話音業(yè)務(wù)帶來(lái)了巨大的沖擊,它使得話音可以在基于分組的數(shù)據(jù)網(wǎng)絡(luò)上傳輸,不僅有效地降低了通信雙方的費(fèi)用而且能為用戶提供新的應(yīng)用和服務(wù)。但是基于分組的數(shù)據(jù)網(wǎng)絡(luò)畢竟不同于傳統(tǒng)的PSTN網(wǎng)絡(luò),在IP網(wǎng)絡(luò)中,語(yǔ)音的實(shí)時(shí)數(shù)據(jù)都通過(guò)封裝在UDP(用戶數(shù)據(jù)報(bào)協(xié)議)數(shù)據(jù)包中的RTP(Realtime Transport Protocol,實(shí)時(shí)傳輸協(xié)議)來(lái)傳輸。使用UDP傳輸數(shù)據(jù),就可能產(chǎn)生亂序和收到重復(fù)包。為了使語(yǔ)音能在數(shù)據(jù)網(wǎng)絡(luò)上有效地傳輸并保證其通話質(zhì)量,就必須考慮網(wǎng)絡(luò)延時(shí)、網(wǎng)絡(luò)延時(shí)抖動(dòng)、丟包、亂序、重復(fù)包等因素所帶來(lái)的不利影響。
除了語(yǔ)音數(shù)據(jù)以外,圖象等實(shí)時(shí)數(shù)據(jù)在分組網(wǎng)絡(luò)上傳輸時(shí),同樣需要去除網(wǎng)絡(luò)側(cè)帶來(lái)的抖動(dòng)。根據(jù)模擬網(wǎng)絡(luò)環(huán)境的測(cè)試,在抖動(dòng)較大或是亂序的情況下,語(yǔ)音和圖象的質(zhì)量都有非常明顯的下降,甚至使語(yǔ)音或是圖象的質(zhì)量無(wú)法容忍。
為了解決網(wǎng)絡(luò)抖動(dòng)問(wèn)題,通常采用jitter buffer(抖動(dòng)緩沖存儲(chǔ)器),并配合適當(dāng)?shù)姆椒ㄒ韵W(wǎng)絡(luò)抖動(dòng)。jitter buffer的實(shí)質(zhì)思想是以在接收端增加延時(shí)為代價(jià)消除網(wǎng)絡(luò)側(cè)的抖動(dòng),引入延時(shí)的大小決定了去除網(wǎng)絡(luò)抖動(dòng)的能力。但并不是引入的延時(shí)越大越好,這是因?yàn)闃O大的延時(shí)會(huì)降低電話接聽(tīng)著的舒適度。如圖1所示,其中橫向表示時(shí)間軸,上半部分示出網(wǎng)絡(luò)側(cè)數(shù)據(jù)包的到達(dá)時(shí)間是不均勻的,數(shù)據(jù)包2的到達(dá)時(shí)間比正常值略早,而數(shù)據(jù)包3的到達(dá)時(shí)間比正常值略晚;下半部分則示出經(jīng)過(guò)jitter buffer處理之后,所有數(shù)據(jù)包都以固定的間隔向外部發(fā)送,相應(yīng)地的引入了一段延時(shí)??梢?jiàn),在引入jitter buffer之后,即使數(shù)據(jù)包發(fā)生延遲,仍然能夠正常地發(fā)送給下一處理模塊。但是如果數(shù)據(jù)包的抖動(dòng)超過(guò)了一定時(shí)間同樣會(huì)當(dāng)作丟包處理,否則在發(fā)生了網(wǎng)絡(luò)丟包或是大延時(shí)抖動(dòng)的情況下,數(shù)據(jù)的實(shí)時(shí)性不能保證,這對(duì)語(yǔ)音或是圖象的傳輸是致命的。
在抖動(dòng)緩沖存儲(chǔ)器中,目前通常使用先入先出(FIFO)隊(duì)列或時(shí)戳排序隊(duì)列進(jìn)行處理。
其中,采用先入先出隊(duì)列方式時(shí),對(duì)所收到的數(shù)據(jù)包并不進(jìn)行重新排序,只是讓其在按緩沖隊(duì)列中緩存一段時(shí)間之后,再按先入先出方式下發(fā),抖動(dòng)小的數(shù)據(jù)包緩存時(shí)間較長(zhǎng),抖動(dòng)大的數(shù)據(jù)包緩存時(shí)間較小,以此實(shí)現(xiàn)消除網(wǎng)絡(luò)抖動(dòng)的影響。這種方式雖然可以在一定程度上減小網(wǎng)絡(luò)側(cè)抖動(dòng)給系統(tǒng)帶來(lái)的影響,但是卻無(wú)法消除亂序和重復(fù)包。
時(shí)戳排序的實(shí)現(xiàn)相對(duì)而言比較復(fù)雜,在收到數(shù)據(jù)包之后,根據(jù)RTP數(shù)據(jù)包的時(shí)戳確定入隊(duì)位置,而不是根據(jù)數(shù)據(jù)包達(dá)到的先后順序進(jìn)行排序。這樣做的好處主要是能夠解決數(shù)據(jù)包亂序和重復(fù)包兩個(gè)問(wèn)題。這種方式的缺點(diǎn)是無(wú)法準(zhǔn)確得到靜音的時(shí)長(zhǎng),無(wú)法準(zhǔn)確發(fā)現(xiàn)丟包。
另一方面,目前的jitter buffer都采用的是固定延時(shí),也就是屬于靜態(tài)的jitterbuffer。但是網(wǎng)絡(luò)的抖動(dòng)情況相差很大,如何選取能同時(shí)兼顧消除網(wǎng)絡(luò)抖動(dòng)和小延時(shí)非常困難。在網(wǎng)絡(luò)情況較好時(shí),如果引入的延時(shí)較大,則會(huì)影響話音或圖象的舒適度;在網(wǎng)絡(luò)情況較差時(shí),如果引入的延時(shí)較小,則不能消除網(wǎng)絡(luò)側(cè)的延時(shí)抖動(dòng),很難得到一個(gè)經(jīng)典的延時(shí)值。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)的上述缺陷,本發(fā)明要同時(shí)解決IP技術(shù)中由于網(wǎng)絡(luò)延時(shí)抖動(dòng)、丟包、亂序、重復(fù)包等因素所帶來(lái)的不利影響,將實(shí)時(shí)RTP數(shù)據(jù)包以正確的順序和均勻的速度傳遞給下一級(jí)的語(yǔ)音或是圖象編解碼器,以提高RTP語(yǔ)音數(shù)據(jù)包的傳輸質(zhì)量。
本明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是提供一種消除RTP數(shù)據(jù)包抖動(dòng)的方法,其特征在于,采用緩沖存儲(chǔ)隊(duì)列從IP網(wǎng)絡(luò)中接收RTP數(shù)據(jù)包,并按預(yù)定時(shí)鐘周期重復(fù)執(zhí)行以下步驟
(1)數(shù)據(jù)入隊(duì),根據(jù)每一個(gè)數(shù)據(jù)包的序號(hào)依次確定其在緩沖隊(duì)列中的存儲(chǔ)地址,并將該數(shù)據(jù)包存入其存儲(chǔ)地址,同時(shí)啟動(dòng)與其存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器;(2)數(shù)據(jù)出隊(duì),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查所述緩沖隊(duì)列中當(dāng)前存儲(chǔ)的所有數(shù)據(jù)包中,是否有一個(gè)數(shù)據(jù)包所對(duì)應(yīng)的計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值(timer(i))與該數(shù)據(jù)包的序號(hào)(seq(i))之和(timer(i)+seq(i)),正好等于該緩沖隊(duì)列中當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)(min_seq)與該緩沖隊(duì)列的緩存?zhèn)€數(shù)(n)之和(min_seq+n),如果有則再檢查所述最小數(shù)據(jù)包序號(hào)(min_seq)所對(duì)應(yīng)的緩沖隊(duì)列存儲(chǔ)地址中是否有數(shù)據(jù)包,如果有則將其中的數(shù)據(jù)包輸出到下一接口,并將其所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零。
在本發(fā)明所述方法的數(shù)據(jù)入隊(duì)步驟(1)中,具體包括以下步驟(1-1)當(dāng)收到第一個(gè)正常達(dá)到的數(shù)據(jù)包之后,將其存入緩沖隊(duì)列的起始地址,并以該數(shù)據(jù)包的序號(hào)作為基準(zhǔn)序號(hào)(base_seq),同時(shí)啟動(dòng)與起始地址對(duì)應(yīng)的計(jì)數(shù)器,然后在下一時(shí)鐘周期到達(dá)時(shí)執(zhí)行步驟(1-2);(1-2)檢查是否又收到一個(gè)數(shù)據(jù)包,是則執(zhí)行步驟(1-3),否則等待下一個(gè)時(shí)鐘周期;(1-3)以該數(shù)據(jù)包的序號(hào)減去所述基準(zhǔn)序號(hào)所得之差值(seq(i)-(base_seq))再除以緩沖隊(duì)列緩存?zhèn)€數(shù)(n)之后所得之余數(shù)作為該數(shù)據(jù)包在緩沖隊(duì)列中的存儲(chǔ)地址,并將該數(shù)據(jù)包存入該存儲(chǔ)地址,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(1-2)。
在本發(fā)明所述方法的數(shù)據(jù)出隊(duì)步驟(2)中,具體包括以下步驟(2-1)以基準(zhǔn)序號(hào)作為最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,檢查是否有一個(gè)數(shù)據(jù)包滿足所述條件(timer(i)+seq(i))=(min_seq+n),是則將第一個(gè)正常到達(dá)的數(shù)據(jù)包輸出到下一接口,將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,并將該存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零,然后在下一時(shí)鐘周期到達(dá)時(shí)執(zhí)行步驟(2-2);(2-2)以所述最小數(shù)據(jù)包序號(hào)加1之和(min_seq+1)作為新的最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查是否有一個(gè)數(shù)據(jù)包滿足所述條件(timer(i)+seq(i))=(min_seq+n),是則執(zhí)行步驟(2-3),否則跳到步驟(2-4);
(2-3)檢查所述最小數(shù)據(jù)包序號(hào)所對(duì)應(yīng)的緩沖隊(duì)列存儲(chǔ)地址中是否有數(shù)據(jù)包,是則執(zhí)行步驟(2-4),否則跳到步驟(2-5);(2-4)將所述存儲(chǔ)地址中的數(shù)據(jù)包輸出到下一接口,并將其所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零,將其存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,同時(shí)將丟包計(jì)數(shù)器清零,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2);(2-5)檢查丟包計(jì)數(shù)器是否計(jì)滿到第二預(yù)定數(shù)值,是則執(zhí)行步驟(2-6),否則跳到步驟(2-7);(2-6)此時(shí)丟包計(jì)數(shù)器計(jì)滿,需發(fā)送非傳輸幀指示,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2);(2-7)此時(shí)丟包計(jì)數(shù)器未計(jì)滿,需發(fā)送一個(gè)丟包指示,并將丟包計(jì)數(shù)器加1,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2)。
在本發(fā)明所述的方法中,還包括以下動(dòng)態(tài)調(diào)整步驟根據(jù)緩沖隊(duì)列所收到的每一個(gè)數(shù)據(jù)包的時(shí)戳(ts)和到達(dá)時(shí)間(time),以及第一個(gè)正常達(dá)到的數(shù)據(jù)包的時(shí)戳(base_ts)和到達(dá)時(shí)間(base_time),計(jì)算出該數(shù)據(jù)包的抖動(dòng)延時(shí)(jitter=abs((time-base_time)-(ts-base_ts)));根據(jù)緩沖隊(duì)列的當(dāng)前延時(shí)深度(depth)和該數(shù)據(jù)包的抖動(dòng)延時(shí)(jitter),計(jì)算出緩沖隊(duì)列的臨時(shí)延時(shí)深度(tem_depth=depth*第一系數(shù)(A)+jitter*第二系數(shù)(B));檢查所述臨時(shí)延時(shí)深度是否大于當(dāng)前延時(shí)深度,是則以所述當(dāng)前延時(shí)深度加上一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)之和作為緩沖隊(duì)列的新延時(shí)深度(new_depth),相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將加1;檢查所述臨時(shí)延時(shí)深度是否小于當(dāng)前延時(shí)深度,是則以所述當(dāng)前延時(shí)深度減去一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)之差作為緩沖隊(duì)列的新延時(shí)深度,相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將減1。
其中,所述第一系數(shù)(A)的取值范圍為1/2<=A<1;所述第二系數(shù)(B)的取值范圍為0<B<=1/2。
與現(xiàn)有技術(shù)相比,本發(fā)明的方法中使用數(shù)據(jù)包的序號(hào)進(jìn)行排序,通過(guò)上述入隊(duì)及出隊(duì)處理,可以有效解決網(wǎng)絡(luò)側(cè)的亂序和重復(fù)包兩個(gè)問(wèn)題;在靜音期間引入了適當(dāng)?shù)奶幚泶胧?,可以有效克服序?hào)排序所存在的固有缺陷;可根據(jù)網(wǎng)絡(luò)情況的好壞,自適應(yīng)調(diào)整緩沖隊(duì)列的延時(shí)深度,將延時(shí)深度合理化,可兼顧消除網(wǎng)絡(luò)抖動(dòng)和小延時(shí)深度兩方面的要求,最終提高了RTP語(yǔ)音數(shù)據(jù)包的傳輸質(zhì)量。
下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明,附圖中圖1是緩沖隊(duì)列接收及發(fā)出的數(shù)據(jù)包的示意圖;圖2是本發(fā)明一個(gè)優(yōu)選實(shí)施例中數(shù)據(jù)包入隊(duì)時(shí)的流程圖;圖3是本發(fā)明中與圖2配合的數(shù)據(jù)包出隊(duì)時(shí)的流程圖;圖4是本發(fā)明中與圖2和圖3配合的延時(shí)深度動(dòng)態(tài)調(diào)整的流程圖。
具體實(shí)施例方式
本發(fā)明的一個(gè)優(yōu)選實(shí)施例如圖2、圖3和圖4所示,主要包括數(shù)據(jù)包入隊(duì)、數(shù)據(jù)包出隊(duì)、動(dòng)態(tài)調(diào)整三大部分。其中,數(shù)據(jù)入隊(duì)和出隊(duì)相互配合,以完成緩沖存儲(chǔ)之功能;動(dòng)態(tài)調(diào)整則是一個(gè)補(bǔ)充部分,可進(jìn)一步優(yōu)化本發(fā)明的方案,對(duì)于緩沖存儲(chǔ)功能來(lái)說(shuō),并不是必須的。
一、數(shù)據(jù)入隊(duì)其流程如圖2所示,通道打開(kāi)后,將第一個(gè)正常達(dá)到的數(shù)據(jù)包存入緩沖隊(duì)列的起始地址(地址0),并以該數(shù)據(jù)包的序號(hào)作為基準(zhǔn)序號(hào)(base_seq),并將起始地址標(biāo)識(shí)位設(shè)為有效。然后按預(yù)定時(shí)鐘周期重復(fù)執(zhí)行以下步驟,這里的預(yù)定時(shí)鐘周期也就是一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng),本實(shí)施例中為10ms,即每隔10ms執(zhí)行一次圖2中的流程。
完成上述步驟之后,再檢查是否又收到一個(gè)數(shù)據(jù)包,如果未收到則等待一下時(shí)鐘周期。
如果又收到一個(gè)數(shù)據(jù)包,則先檢查其合法性,具體方法是用該數(shù)據(jù)包的序號(hào)seq(i)減去該緩沖隊(duì)列中當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)(min_seq),看所得的差值(seq(i)-min_seq)是否小于緩沖隊(duì)列的緩存?zhèn)€數(shù)(n);如果是,說(shuō)明該數(shù)據(jù)包的序號(hào)是合法的,否則表示該數(shù)據(jù)包為非法,應(yīng)將其丟棄。假設(shè)緩沖隊(duì)列的緩存?zhèn)€數(shù)(即當(dāng)前可緩存的數(shù)據(jù)包個(gè)數(shù))n=6,當(dāng)前隊(duì)列中存儲(chǔ)的最小數(shù)據(jù)包序號(hào)為32,如果接下來(lái)收到了一個(gè)序號(hào)為39的數(shù)據(jù)包,則可能是產(chǎn)生了較大的亂序或丟包現(xiàn)象,該數(shù)據(jù)包39將被判為非法而被丟棄。
對(duì)于合法的數(shù)據(jù)包,根據(jù)其序號(hào)確定其在緩沖隊(duì)列中的存儲(chǔ)地址,具體做法是以每一個(gè)數(shù)據(jù)包的序號(hào)減去上述基準(zhǔn)序號(hào)所得之差值(seq(i)-(base_seq))再除以緩沖隊(duì)列緩存?zhèn)€數(shù)(n)之后所得之余數(shù),作為該數(shù)據(jù)包在緩沖隊(duì)列中的存儲(chǔ)地址。假設(shè)緩沖隊(duì)列的緩存?zhèn)€數(shù)n=6,基準(zhǔn)序號(hào)為2,現(xiàn)收到一個(gè)序號(hào)為32的數(shù)據(jù)包,(32-2)/6的余數(shù)為0,所以該數(shù)據(jù)包應(yīng)放入地址0;如果數(shù)據(jù)包的序號(hào)為34,(34-2)/6的余數(shù)為2,則該數(shù)據(jù)包應(yīng)放入地址2。
確定了存儲(chǔ)地址之后,還要判斷該數(shù)據(jù)包是否為重復(fù)包,具體做法是用存儲(chǔ)地址的標(biāo)識(shí)位來(lái)表示其中是否有數(shù)據(jù)包,當(dāng)標(biāo)識(shí)位為有效時(shí)表示有數(shù)據(jù)包,為無(wú)效時(shí)則表示其中無(wú)數(shù)據(jù)包;所以在存入前先檢查其存儲(chǔ)地址的標(biāo)識(shí)位的狀態(tài),當(dāng)標(biāo)識(shí)位為無(wú)效時(shí),才將該數(shù)據(jù)包存入該存儲(chǔ)地址,存入之后,再將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為有效;當(dāng)標(biāo)識(shí)位為有效時(shí),說(shuō)明其中已有數(shù)據(jù)包,則剛收到的這個(gè)數(shù)據(jù)包將被判為重復(fù)包而丟棄。在后面的數(shù)據(jù)出隊(duì)步驟中,在將數(shù)據(jù)包輸出到下一接口之后,相應(yīng)設(shè)有將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效的步驟。
在將數(shù)據(jù)包存入其存儲(chǔ)地址,并將標(biāo)識(shí)位設(shè)置為有效之后,還要啟動(dòng)與其存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器,該計(jì)數(shù)器將用于后面的數(shù)據(jù)出隊(duì)步驟。
在完成上述步驟之后,還要執(zhí)行以下操作,以計(jì)算出每一個(gè)數(shù)據(jù)包的臨時(shí)延時(shí)深度,為執(zhí)行后面的動(dòng)態(tài)調(diào)整步驟作準(zhǔn)備,如果不進(jìn)行動(dòng)態(tài)調(diào)整,則不必執(zhí)行以下計(jì)算步驟。
先根據(jù)緩沖隊(duì)列所收到的每一個(gè)數(shù)據(jù)包的時(shí)戳(ts)和到達(dá)時(shí)間(time),以及第一個(gè)正常達(dá)到的數(shù)據(jù)包的時(shí)戳(base_ts)和到達(dá)時(shí)間(base_time),計(jì)算出該數(shù)據(jù)包的抖動(dòng)延時(shí)jitter=abs((time-base_time)-(ts-base_ts))再根據(jù)緩沖隊(duì)列的當(dāng)前延時(shí)深度(depth)和該數(shù)據(jù)包的抖動(dòng)延時(shí)(jitter),計(jì)算出緩沖隊(duì)列的臨時(shí)延時(shí)深度tem_depth=depth*A+jitter*B。
其中,1/2<=A<1;0<B<=1/2。本實(shí)施例中可取A=0.8,B=0.4。也就是說(shuō),每收到一個(gè)數(shù)據(jù)包,都算出其臨時(shí)延時(shí)深度,以用于后面的動(dòng)態(tài)調(diào)整步驟。
從圖2中可以看出,第一次循環(huán)只執(zhí)行步驟101和102,此后則是每一個(gè)時(shí)鐘同期重復(fù)執(zhí)行一次步驟103及其后面的相應(yīng)步驟。
二、數(shù)據(jù)出隊(duì)其流程如圖3所示,先以基準(zhǔn)序號(hào)作為最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1(如果某一地址內(nèi)沒(méi)有數(shù)據(jù)包,則其計(jì)數(shù)器未啟動(dòng),不會(huì)對(duì)其進(jìn)行加1操作),檢查是否有一個(gè)數(shù)據(jù)包滿足所述條件(timer(i)+seq(i))=(min_seq+n),是則將第一個(gè)正常到達(dá)的數(shù)據(jù)包輸出到下一接口,將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,并將該存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零。
然后,以所述最小數(shù)據(jù)包序號(hào)加1之和(min_seq+1)作為新的最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查緩沖隊(duì)列中當(dāng)前存儲(chǔ)的所有數(shù)據(jù)包中,是否有一個(gè)數(shù)據(jù)包滿足條件(timer(i)+seq(i))=(min_seq+n)其中,seq(i)為該數(shù)據(jù)包的序號(hào),timer(i)為該數(shù)據(jù)包所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器的當(dāng)前計(jì)算值,n為緩沖隊(duì)列當(dāng)前可緩存的數(shù)據(jù)包個(gè)數(shù),min_seq為當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)。由上述說(shuō)明中可以看出,這里的‘當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)’,是推算出來(lái)的,該序號(hào)的數(shù)據(jù)包可能已存儲(chǔ)在緩沖隊(duì)列中,或者因發(fā)生亂序、丟包而未存儲(chǔ)在緩沖隊(duì)列中。假設(shè)剛發(fā)出一個(gè)序號(hào)為33的數(shù)據(jù)包,而隊(duì)列中實(shí)際存儲(chǔ)的最小序號(hào)為數(shù)據(jù)包35,沒(méi)有數(shù)據(jù)包34,仍然會(huì)以34作為隊(duì)列中的最小數(shù)據(jù)包序號(hào)。
從圖3中可以看出,只要有一個(gè)數(shù)據(jù)包滿足條件timer(i)+seq(i)=min_seq+n,則再檢查該最小數(shù)據(jù)包序號(hào)(min_seq)所對(duì)應(yīng)的存儲(chǔ)地址的標(biāo)識(shí)位是否為有效;如果為有效,則表示其中有數(shù)據(jù)包,此時(shí)將其中的數(shù)據(jù)包輸出到下一接口,并將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,還要將該存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零,在數(shù)據(jù)入隊(duì)步驟中該存儲(chǔ)地址再收到一個(gè)數(shù)據(jù)包時(shí),又會(huì)啟動(dòng)該計(jì)數(shù)器??梢?jiàn),本發(fā)明中并不是當(dāng)某一個(gè)數(shù)據(jù)包的計(jì)數(shù)器計(jì)滿時(shí)才將其輸出,而是用整個(gè)緩沖隊(duì)列中的數(shù)據(jù)包的計(jì)數(shù)器的計(jì)數(shù)值來(lái)進(jìn)行判斷。假設(shè)緩沖隊(duì)列的緩存?zhèn)€數(shù)為6,某一數(shù)據(jù)包計(jì)數(shù)滿6之后當(dāng)然要下發(fā)。如果該數(shù)據(jù)包產(chǎn)生了延時(shí),與其后的數(shù)據(jù)包同時(shí)到來(lái),則經(jīng)過(guò)一段時(shí)間之后,兩者都計(jì)數(shù)滿5,此時(shí)序號(hào)最小的數(shù)據(jù)包并未計(jì)滿6,但仍然要將其下發(fā),否則下一次就會(huì)發(fā)現(xiàn)有兩個(gè)數(shù)據(jù)包計(jì)數(shù)滿6。
從圖3中可以看出,如果沒(méi)有一個(gè)數(shù)據(jù)包滿足條件timer(i)+seq(i)=min_seq+n,或者雖然滿足該條件,但是最小數(shù)據(jù)包序號(hào)(min_seq)所對(duì)應(yīng)的存儲(chǔ)地址的標(biāo)識(shí)位為無(wú)效,則需檢查丟包計(jì)數(shù)器是否計(jì)滿到第二預(yù)定數(shù)值(該值與具體的編碼解碼算法、緩沖隊(duì)列的緩存?zhèn)€數(shù)等有關(guān),本領(lǐng)域的技術(shù)人員可根據(jù)具體情況得出經(jīng)驗(yàn)值)。這里的丟包計(jì)數(shù)器用于對(duì)連續(xù)發(fā)出的丟包指示進(jìn)行計(jì)數(shù),每發(fā)出一個(gè)丟包指示,計(jì)數(shù)器加1,本實(shí)施例中,所述第二預(yù)定數(shù)值為3。如果該計(jì)數(shù)器未計(jì)滿,則表示發(fā)生丟包或亂序,此時(shí)需發(fā)送一個(gè)丟包指示,并將該計(jì)數(shù)器加1。如果該計(jì)數(shù)器計(jì)滿到3,表示已連續(xù)發(fā)了3個(gè)丟包指示,此時(shí)將認(rèn)為網(wǎng)絡(luò)側(cè)發(fā)來(lái)的是非傳輸幀,所以發(fā)送非傳輸幀指示。通過(guò)上述步驟,可在后面的數(shù)據(jù)包到達(dá)之前,正確區(qū)分出是發(fā)生了網(wǎng)絡(luò)丟包,還中正常的非傳輸幀。
從圖3中可以看出,在將數(shù)據(jù)包輸出到下一接口,并將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效之后,同時(shí)將該存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零后,還要將丟包計(jì)數(shù)器清零。從而與上述步驟相配合,保證丟包計(jì)數(shù)器只對(duì)連續(xù)的發(fā)出的丟包指示進(jìn)行計(jì)數(shù)。
從圖3中可以看出,第一次循環(huán)只執(zhí)行步驟201、201和203,此后則是每一個(gè)時(shí)鐘同期重復(fù)執(zhí)行一次步驟204及其后面的相應(yīng)步驟。
三、動(dòng)態(tài)調(diào)整從圖4中可以看出,本發(fā)明中動(dòng)態(tài)調(diào)整的具體做法是,先檢查是否有連續(xù)預(yù)定個(gè)數(shù)據(jù)包(例如5個(gè))的臨時(shí)延時(shí)深度都大于當(dāng)前延時(shí)深度,如果是,則以當(dāng)前延時(shí)深度加上一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)(本實(shí)施例中為10ms)之和(depth+10ms)作為緩沖隊(duì)列的新延時(shí)深度,即以調(diào)大后的新延時(shí)深度代替其當(dāng)前延時(shí)深度,相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將加1,然后發(fā)出一個(gè)丟包指示??梢?jiàn),本發(fā)明中,當(dāng)數(shù)據(jù)包的抖動(dòng)延時(shí)可能引起緩沖隊(duì)列延時(shí)深度變化時(shí),并不是立即進(jìn)行調(diào)整,而是要等一段時(shí)間,持續(xù)有這種變化趨勢(shì)時(shí),才進(jìn)行調(diào)整。其中采用了相應(yīng)的第三計(jì)數(shù)器來(lái)進(jìn)行計(jì)數(shù),該計(jì)數(shù)器計(jì)到第三預(yù)定值為計(jì)滿,該第三預(yù)定值與具體的編碼解碼算法、緩沖隊(duì)列的緩存?zhèn)€數(shù)等有關(guān),本領(lǐng)域的技術(shù)人員可根據(jù)具體情況得出經(jīng)驗(yàn)值。
如果不滿足上述條件,則再檢查是否有連續(xù)預(yù)定個(gè)數(shù)據(jù)包(例如5個(gè))的臨時(shí)延時(shí)深度都小于當(dāng)前延時(shí)深度,如果是,則以當(dāng)前延時(shí)深度減去一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)之差(depth-10ms)作為緩沖隊(duì)列的新延時(shí)深度,即以調(diào)小后的新延時(shí)深度代替其當(dāng)前延時(shí)深度,相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將減1,此時(shí)還需要再回到圖3中的步驟204,多執(zhí)行一次204之后的相應(yīng)后續(xù)步驟。從圖4中可以看出,其中采用了相應(yīng)的第四計(jì)數(shù)器來(lái)對(duì)臨時(shí)延時(shí)深度都小于當(dāng)前延時(shí)深度的數(shù)據(jù)包進(jìn)行連續(xù)計(jì)數(shù),該計(jì)數(shù)器計(jì)到第四預(yù)定值為計(jì)滿,該第四預(yù)定值與具體的編碼解碼算法、緩沖隊(duì)列的緩存?zhèn)€數(shù)等有關(guān),本領(lǐng)域的技術(shù)人員可根據(jù)具體情況得出經(jīng)驗(yàn)值。
權(quán)利要求
1.一種消除RTP數(shù)據(jù)包抖動(dòng)的方法,其特征在于,采用緩沖存儲(chǔ)隊(duì)列從IP網(wǎng)絡(luò)中接收RTP數(shù)據(jù)包,并按預(yù)定時(shí)鐘周期重復(fù)執(zhí)行以下步驟(1)數(shù)據(jù)入隊(duì),根據(jù)每一個(gè)數(shù)據(jù)包的序號(hào)依次確定其在緩沖隊(duì)列中的存儲(chǔ)地址,并將該數(shù)據(jù)包存入其存儲(chǔ)地址,同時(shí)啟動(dòng)與其存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器;(2)數(shù)據(jù)出隊(duì),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查所述緩沖隊(duì)列中當(dāng)前存儲(chǔ)的所有數(shù)據(jù)包中,是否有一個(gè)數(shù)據(jù)包所對(duì)應(yīng)的計(jì)數(shù)器的當(dāng)前計(jì)數(shù)值(timer(i))與該數(shù)據(jù)包的序號(hào)(seq(i))之和(timer(i)+seq(i)),正好等于該緩沖隊(duì)列中當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)(min_seq)與該緩沖隊(duì)列的緩存?zhèn)€數(shù)(n)之和(min_seq+n),如果有則再檢查所述最小數(shù)據(jù)包序號(hào)(min_seq)所對(duì)應(yīng)的緩沖隊(duì)列存儲(chǔ)地址中是否有數(shù)據(jù)包,如果有則將其中的數(shù)據(jù)包輸出到下一接口,并將其所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述數(shù)據(jù)入隊(duì)步驟(1)中,具體包括以下步驟(1-1)當(dāng)收到第一個(gè)正常達(dá)到的數(shù)據(jù)包之后,將其存入緩沖隊(duì)列的起始地址,并以該數(shù)據(jù)包的序號(hào)作為基準(zhǔn)序號(hào)(base_seq),同時(shí)啟動(dòng)與起始地址對(duì)應(yīng)的計(jì)數(shù)器,然后在下一時(shí)鐘周期到達(dá)時(shí)執(zhí)行步驟(1-2);(1-2)檢查是否又收到一個(gè)數(shù)據(jù)包,是則執(zhí)行步驟(1-3),否則等待下一個(gè)時(shí)鐘周期;(1-3)以該數(shù)據(jù)包的序號(hào)減去所述基準(zhǔn)序號(hào)所得之差值(seq(i)-(base_seq))再除以緩沖隊(duì)列緩存?zhèn)€數(shù)(n)之后所得之余數(shù)作為該數(shù)據(jù)包在緩沖隊(duì)列中的存儲(chǔ)地址,并將該數(shù)據(jù)包存入該存儲(chǔ)地址,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(1-2)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,在所述數(shù)據(jù)入隊(duì)步驟(1-1)中,在將數(shù)據(jù)包存入其存儲(chǔ)地址之后,還包括將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為有效的步驟;在所述數(shù)據(jù)入隊(duì)步驟(1-3)中,在將數(shù)據(jù)包存入其存儲(chǔ)地址之前,還包括檢查該存儲(chǔ)地址的標(biāo)識(shí)位狀態(tài)的步驟,當(dāng)標(biāo)識(shí)位為無(wú)效時(shí),才將該數(shù)據(jù)包存入該存儲(chǔ)地址;在將數(shù)據(jù)包存入其存儲(chǔ)地址之后,還包括將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為有效的步驟,然后才在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(1-2);相應(yīng)地,在所述數(shù)據(jù)出隊(duì)步驟(2)中,在將數(shù)據(jù)包輸出到下一接口之后,還包括將其存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效的步驟。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述數(shù)據(jù)入隊(duì)步驟(1-3)中,還包括判斷該數(shù)據(jù)包的序號(hào)seq(i)減去該緩沖隊(duì)列中當(dāng)前應(yīng)當(dāng)存儲(chǔ)的序號(hào)最小的數(shù)據(jù)包的序號(hào)(min_seq)所得的差值(seq(i)-min_seq)是否小于緩沖隊(duì)列的緩存?zhèn)€數(shù)(n)的步驟,如果是才根據(jù)該數(shù)據(jù)包的序號(hào)確定其存儲(chǔ)地址,再將該數(shù)據(jù)包存入其存儲(chǔ)地址。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,在所述數(shù)據(jù)出隊(duì)步驟(2)中,當(dāng)所述最小數(shù)據(jù)包序號(hào)(min_seq)所對(duì)應(yīng)的緩沖隊(duì)列存儲(chǔ)地址中沒(méi)有數(shù)據(jù)包時(shí),還包括以下步驟檢查是否已連續(xù)發(fā)送了第二預(yù)定數(shù)值個(gè)丟包指示,是則發(fā)送非傳輸幀指示,否則再發(fā)送一個(gè)丟包指示。
6.根據(jù)權(quán)利要求3所述的方法,其特征在于,在所述數(shù)據(jù)出隊(duì)步驟(2)中,具體包括以下步驟(2-1)以基準(zhǔn)序號(hào)作為最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,檢查是否有一個(gè)數(shù)據(jù)包滿足所述條件(timer(i)+seq(i))=(min_seq+n),是則將第一個(gè)正常到達(dá)的數(shù)據(jù)包輸出到下一接口,將該存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,并將該存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零,然后在下一時(shí)鐘周期到達(dá)時(shí)執(zhí)行步驟(2-2);(2-2)以所述最小數(shù)據(jù)包序號(hào)加1之和(min_seq+1)作為新的最小數(shù)據(jù)包序號(hào),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查是否有一個(gè)數(shù)據(jù)包滿足所述條件(timer(i)+seq(i))=(min_seq+n),是則執(zhí)行步驟(2-3),否則跳到步驟(2-4);(2-3)檢查所述最小數(shù)據(jù)包序號(hào)所對(duì)應(yīng)的緩沖隊(duì)列存儲(chǔ)地址中是否有數(shù)據(jù)包,是則執(zhí)行步驟(2-4),否則跳到步驟(2-5);(2-4)將所述存儲(chǔ)地址中的數(shù)據(jù)包輸出到下一接口,并將其所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零,將其存儲(chǔ)地址的標(biāo)識(shí)位設(shè)置為無(wú)效,同時(shí)將丟包計(jì)數(shù)器清零,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2);(2-5)檢查丟包計(jì)數(shù)器是否計(jì)滿到第二預(yù)定數(shù)值,是則執(zhí)行步驟(2-6),否則跳到步驟(2-7);(2-6)此時(shí)丟包計(jì)數(shù)器計(jì)滿,需發(fā)送非傳輸幀指示,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2);(2-7)此時(shí)丟包計(jì)數(shù)器未計(jì)滿,需發(fā)送一個(gè)丟包指示,并將丟包計(jì)數(shù)器加1,然后在下一時(shí)鐘周期到達(dá)時(shí)回到步驟(2-2)。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,還包括以下動(dòng)態(tài)調(diào)整步驟根據(jù)緩沖隊(duì)列所收到的每一個(gè)數(shù)據(jù)包的時(shí)戳(ts)和到達(dá)時(shí)間(time),以及第一個(gè)正常達(dá)到的數(shù)據(jù)包的時(shí)戳(base_ts)和到達(dá)時(shí)間(base_time),計(jì)算出該數(shù)據(jù)包的抖動(dòng)延時(shí)(jitter=abs((time-base_time)-(ts-base_ts)));根據(jù)緩沖隊(duì)列的當(dāng)前延時(shí)深度(depth)和該數(shù)據(jù)包的抖動(dòng)延時(shí)(jitter),計(jì)算出緩沖隊(duì)列的臨時(shí)延時(shí)深度(tem_depth=depth*第一系數(shù)(A)+jitter*第二系數(shù)(B));檢查所述臨時(shí)延時(shí)深度是否大于當(dāng)前延時(shí)深度,是則以所述當(dāng)前延時(shí)深度加上一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)之和作為緩沖隊(duì)列的新延時(shí)深度(new_depth),相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將加1;檢查所述臨時(shí)延時(shí)深度是否小于當(dāng)前延時(shí)深度,是則以所述當(dāng)前延時(shí)深度減去一個(gè)數(shù)據(jù)包的打包時(shí)長(zhǎng)之差作為緩沖隊(duì)列的新延時(shí)深度,相應(yīng)地,緩沖隊(duì)列的緩存?zhèn)€數(shù)將減1。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述第一系數(shù)(A)的取值范圍為1/2<=A<1;所述第二系數(shù)(B)的取值范圍為0<B<=1/2。
9.根據(jù)權(quán)利要求7所述的方法,其特征在于,在所述動(dòng)態(tài)調(diào)整步驟中,當(dāng)檢查到連續(xù)預(yù)定個(gè)數(shù)據(jù)包的臨時(shí)延時(shí)深度都大于當(dāng)前延時(shí)深度時(shí),才將緩沖隊(duì)列的緩存?zhèn)€數(shù)加1,并發(fā)出一個(gè)丟包指示;當(dāng)檢查到連續(xù)預(yù)定個(gè)數(shù)據(jù)包的臨時(shí)延時(shí)深度都小于當(dāng)前延時(shí)深度時(shí),才將緩沖隊(duì)列的緩存?zhèn)€數(shù)減1,并再執(zhí)行一次步驟(2-2)到(2-6)之間的相應(yīng)步驟。
全文摘要
本發(fā)明涉及一種用RTP數(shù)據(jù)包的序號(hào)進(jìn)行排序以消除其抖動(dòng)延時(shí)的方法,其中采用緩沖存儲(chǔ)隊(duì)列從IP網(wǎng)絡(luò)中接收RTP數(shù)據(jù)包,數(shù)據(jù)入隊(duì)時(shí)根據(jù)數(shù)據(jù)包序號(hào)確定其在緩沖隊(duì)列中的存儲(chǔ)地址并將該數(shù)據(jù)包存入其存儲(chǔ)地址,同時(shí)啟動(dòng)對(duì)應(yīng)的計(jì)數(shù)器;數(shù)據(jù)出隊(duì)時(shí),將緩沖隊(duì)列中各個(gè)存有數(shù)據(jù)包的存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器分別加1,再檢查緩沖隊(duì)列中當(dāng)前存儲(chǔ)的所有數(shù)據(jù)包中,是否有一個(gè)數(shù)據(jù)包滿足輸出條件timer(i)+seq(i)=min_seq+n,如果有則再檢查最小數(shù)據(jù)包序號(hào)所對(duì)應(yīng)的存儲(chǔ)地址中是否有數(shù)據(jù)包,有則將其中的數(shù)據(jù)包輸出到下一接口,并將其所在存儲(chǔ)地址對(duì)應(yīng)的計(jì)數(shù)器清零。本發(fā)明中還根據(jù)數(shù)據(jù)包的抖動(dòng)延時(shí),對(duì)緩沖隊(duì)列的延時(shí)深度進(jìn)行動(dòng)態(tài)調(diào)整。最終可大大提高RTP語(yǔ)音數(shù)據(jù)包的傳輸質(zhì)量。
文檔編號(hào)H04L12/24GK1549535SQ0312510
公開(kāi)日2004年11月24日 申請(qǐng)日期2003年5月9日 優(yōu)先權(quán)日2003年5月9日
發(fā)明者葉錦華, 白文翔 申請(qǐng)人:華為技術(shù)有限公司