專(zhuān)利名稱(chēng)::VoIP去抖動(dòng)緩沖區(qū)的處理方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及一種VoIP去抖動(dòng)緩沖區(qū)的處理方法。
背景技術(shù):
:目前,VoIP(VoiceoverInternetProtocol)在Internet各類(lèi)應(yīng)用中占據(jù)越來(lái)越大的比重,VoIP是一種以IP電話為主,并推出相應(yīng)的增值業(yè)務(wù)的技術(shù)。它以IP分組交換網(wǎng)絡(luò)為傳輸平臺(tái),對(duì)模擬的語(yǔ)音信號(hào)進(jìn)行壓縮、打包等一系列的特殊處理,使之可以采用無(wú)連接的UDP(UserDatagramProtocol,用戶(hù)數(shù)據(jù)報(bào)協(xié)議)進(jìn)行傳輸,其最大的優(yōu)勢(shì)是能廣泛地采用Internet和全球IP互連的環(huán)境,提供比傳統(tǒng)業(yè)務(wù)更多、更好的服務(wù)。VoIP可以在IP網(wǎng)絡(luò)上傳送語(yǔ)音、傳真、視頻和數(shù)據(jù)等業(yè)務(wù),如統(tǒng)一消息、虛擬電話、虛擬語(yǔ)音/傳真郵箱、查號(hào)業(yè)務(wù)、Internet呼叫中心、Internet呼叫管理、電視會(huì)議、電子商務(wù)、傳真存儲(chǔ)轉(zhuǎn)、發(fā)和各種信息的存儲(chǔ)轉(zhuǎn)發(fā)等。VoIP的廣泛應(yīng)用,其服務(wù)質(zhì)量保證的問(wèn)題也日益為業(yè)界所關(guān)注。VoIP是典型的實(shí)時(shí)性業(yè)務(wù),對(duì)于QoS(服務(wù)質(zhì)量)有很高的要求。VoIP的實(shí)現(xiàn)是基于IP網(wǎng)絡(luò)的,IP網(wǎng)絡(luò)可以是企業(yè)內(nèi)部的局域網(wǎng)或者是互聯(lián)網(wǎng),IP網(wǎng)絡(luò)是基于盡力而為的服務(wù)體系結(jié)構(gòu),當(dāng)網(wǎng)絡(luò)負(fù)載小時(shí)服務(wù)質(zhì)量相對(duì)較高,反之負(fù)載過(guò)高時(shí)必然會(huì)出現(xiàn)網(wǎng)絡(luò)的丟包和延時(shí)抖動(dòng)等問(wèn)題。對(duì)于延時(shí)抖動(dòng)而言,在實(shí)時(shí)的VoIP語(yǔ)音網(wǎng)絡(luò)會(huì)議中,語(yǔ)音數(shù)據(jù)是經(jīng)過(guò)壓縮打包后傳輸?shù)?。每個(gè)數(shù)據(jù)包都包含壓縮后的語(yǔ)音數(shù)據(jù)以及目地IP地址信息,雖然語(yǔ)音包在發(fā)送端是按一定間隔有序發(fā)送的,但是由于網(wǎng)絡(luò)傳輸路徑可能不同,不同的數(shù)據(jù)包到達(dá)接收端的時(shí)間間隔并不一致。另外,在采用UDP進(jìn)行語(yǔ)音數(shù)據(jù)實(shí)時(shí)傳輸時(shí),到達(dá)接收端的語(yǔ)音次序也有可能發(fā)生錯(cuò)亂。這兩個(gè)現(xiàn)象就是我們通常說(shuō)的抖動(dòng)。當(dāng)網(wǎng)絡(luò)抖動(dòng)嚴(yán)重的時(shí)候,某些數(shù)據(jù)包遲到達(dá)后將被丟棄,也存在等待一段時(shí)間中沒(méi)有任何數(shù)據(jù)到達(dá),然后突然接受到很多個(gè)數(shù)據(jù)包,同時(shí)會(huì)覆蓋掉之前的數(shù)據(jù)也會(huì)造成需要播放的數(shù)據(jù)不連續(xù),導(dǎo)致語(yǔ)音回放的失真斷續(xù)。例如在一個(gè)由多人參加的VoIP音頻網(wǎng)絡(luò)會(huì)議中,劇烈的數(shù)據(jù)包抖動(dòng)會(huì)導(dǎo)致語(yǔ)音時(shí)斷時(shí)續(xù),嚴(yán)重影響參會(huì)者的語(yǔ)音實(shí)時(shí)交流。對(duì)于一般的數(shù)據(jù)業(yè)務(wù),丟失和傳輸延時(shí)都可以通過(guò)重傳或等待來(lái)彌補(bǔ),然而在音頻通話之類(lèi)的實(shí)時(shí)業(yè)務(wù)中,對(duì)時(shí)延和抖動(dòng)等有著更為苛刻的要求,所以對(duì)于實(shí)時(shí)性業(yè)務(wù)必須保障音頻數(shù)據(jù)的實(shí)時(shí)接收和回放。那么時(shí)延抖動(dòng)也成為了影響VoIP的最為重要的QoS的指標(biāo)之一。為了有效的解決抖動(dòng)問(wèn)題,通常在接收端會(huì)引入抖動(dòng)緩沖區(qū)技術(shù)來(lái)消除抖動(dòng)的影響。抖動(dòng)緩沖區(qū)(JitterBuffer),也叫做de-JitterBuffer,被用于計(jì)算時(shí)延抖動(dòng),由分組網(wǎng)絡(luò)引進(jìn),所以一個(gè)音頻(或視頻)傳輸通過(guò)網(wǎng)絡(luò)的連續(xù)播放能夠被保證。最大量的抖動(dòng)能夠被一個(gè)抖動(dòng)緩沖區(qū)計(jì)算,等同于這個(gè)緩沖延遲在開(kāi)始播放這個(gè)媒體流之前被引進(jìn)。在網(wǎng)絡(luò)電話中,抖動(dòng)緩沖區(qū)(JitterBuffer)是一個(gè)共享的數(shù)據(jù)區(qū)域,在這個(gè)數(shù)據(jù)區(qū)域中,每隔一段均勻的間隔,音頻包會(huì)被收集,存儲(chǔ)并發(fā)到音頻處理器。包到達(dá)時(shí)間的變化,稱(chēng)作抖動(dòng),這個(gè)是由于網(wǎng)絡(luò)擁塞,定時(shí)漂移或路由變更而產(chǎn)生的。抖動(dòng)緩沖區(qū)放置在音頻連接的接收端,有意地延遲到達(dá)的包,這樣終端用戶(hù)就會(huì)感受到一個(gè)清晰的,沒(méi)有什么語(yǔ)音失真的連接。常見(jiàn)的去抖動(dòng)緩沖方法有兩種靜態(tài)去抖動(dòng)緩沖控制算法的和動(dòng)態(tài)自適應(yīng)去抖動(dòng)緩沖控制算法。I)、靜態(tài)去抖動(dòng)緩沖控制算法設(shè)立固定長(zhǎng)度的抖動(dòng)緩沖區(qū)。在解碼和播放語(yǔ)音數(shù)據(jù)包之前,放入一個(gè)固定長(zhǎng)度緩沖區(qū),也就是緩沖內(nèi)的語(yǔ)音包個(gè)數(shù)是固定不變的,對(duì)于超出緩沖區(qū)范圍的數(shù)據(jù)將會(huì)丟棄。。這個(gè)算法的特點(diǎn)是該類(lèi)算法實(shí)現(xiàn)簡(jiǎn)單,運(yùn)算復(fù)雜度小,可靠性高;但是網(wǎng)絡(luò)抖動(dòng)較大時(shí),丟包數(shù)量也很高,網(wǎng)絡(luò)抖動(dòng)小時(shí),也存在固定的和較大的語(yǔ)音延時(shí),導(dǎo)致了語(yǔ)音質(zhì)量下降。2)、自適應(yīng)去抖動(dòng)緩沖控制算法設(shè)立的抖動(dòng)緩沖區(qū)中的長(zhǎng)度是可變的,即抖動(dòng)緩沖區(qū)的長(zhǎng)度根據(jù)當(dāng)前網(wǎng)絡(luò)狀況快速自適應(yīng)調(diào)整。當(dāng)網(wǎng)絡(luò)抖動(dòng)劇烈時(shí),通過(guò)插入靜音包來(lái)增加緩沖區(qū)長(zhǎng)度;當(dāng)網(wǎng)絡(luò)條件趨向于暢通時(shí),通過(guò)刪除緩沖區(qū)中最老的包來(lái)實(shí)現(xiàn)減小緩沖區(qū)長(zhǎng)度的目的。在一定范圍內(nèi)更好的解決抖動(dòng)延時(shí)的問(wèn)題,降低丟包的數(shù)量,提高音頻的質(zhì)量,并且在網(wǎng)絡(luò)抖動(dòng)較小的時(shí)候提供更低的延遲。該類(lèi)算法的實(shí)現(xiàn)難度較高,可靠性也相對(duì)會(huì)低。
發(fā)明內(nèi)容本發(fā)明的目的在于提供一種去抖動(dòng)緩沖方法,用于解決去抖動(dòng)緩沖技術(shù)中實(shí)現(xiàn)復(fù)雜度高、可靠性和穩(wěn)定性較弱的問(wèn)題。本發(fā)明提供一種VoIP去抖動(dòng)緩沖區(qū)的處理方法,包括初始化去抖動(dòng)緩沖區(qū);執(zhí)行音頻數(shù)據(jù)幀的保存操作,將接收自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)幀保存至去抖動(dòng)緩沖區(qū)中;更新突發(fā)等級(jí)狀態(tài);執(zhí)行音頻數(shù)據(jù)幀的讀取操作,從去抖動(dòng)緩沖區(qū)中將音頻數(shù)據(jù)幀讀取出;更新突發(fā)等級(jí)狀態(tài);根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí),計(jì)算出當(dāng)前的有效突發(fā)等級(jí);根據(jù)計(jì)算得到的當(dāng)前的有效突發(fā)等級(jí),調(diào)整去抖動(dòng)緩沖區(qū)的大小??蛇x地,所述初始化去抖動(dòng)緩沖區(qū)包括初始化包括緩沖能力Buff_CAP、最大突發(fā)等級(jí)Burst_Level_Max、讀取最大次數(shù)Get_Count_Max、穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max在內(nèi)的常量參數(shù)設(shè)置;初始化去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置音頻數(shù)據(jù)幀單位長(zhǎng)度;清空去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置去抖動(dòng)緩沖區(qū)的操作狀態(tài)為Status_Initailizing,突發(fā)等級(jí)Burst_Level的初始化狀態(tài)為O??蛇x地,所述執(zhí)行音頻數(shù)據(jù)幀的保存操作包括接收來(lái)自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)巾貞,計(jì)算當(dāng)前去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed;判斷去抖動(dòng)緩沖區(qū)的狀態(tài)是否為Status_Processing,并在判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)是Status_Processing時(shí),執(zhí)行音頻數(shù)據(jù)幀的保存;判斷保存的音頻數(shù)據(jù)幀是否超出設(shè)置的緩沖能力,若沒(méi)有超出緩沖能力,則成功將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中;若超出緩沖能力,則將去抖動(dòng)緩沖區(qū)的音頻數(shù)據(jù)幀列表中位于最前面的對(duì)應(yīng)長(zhǎng)度的音頻數(shù)據(jù)幀予以刪除,然后將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中;計(jì)算存儲(chǔ)當(dāng)前的音頻數(shù)據(jù)幀后去抖動(dòng)緩沖區(qū)的當(dāng)前有效巾貞數(shù)量,更新突發(fā)等級(jí)狀態(tài)Burst_Level??蛇x地,所述執(zhí)行音頻數(shù)據(jù)幀的保存操作還包括在判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)不是Status_Processing時(shí),通過(guò)去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed和突發(fā)等級(jí)Burst_Level來(lái)計(jì)算丟巾貞間隔Discard_Interval,并在當(dāng)前巾貞間隔大于等于所述計(jì)算得到的丟巾貞間隔Discard_Interval時(shí),將當(dāng)前的音頻數(shù)據(jù)巾貞丟棄??蛇x地,通過(guò)去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed和突發(fā)等級(jí)Burst_Level來(lái)計(jì)算丟巾貞間隔Discard_Interval包括Level_tmp=MAX(Burst_Level,Eff_Level),即取兩者中的較大值;Factor=BufferCountUsed/Burst_Level;(當(dāng)Burst_Level小于等于5且Factor小于3,則Factor設(shè)置為0;)若Factor等于0,則丟巾貞間隔Discard_Interval為0;若Factor等于I,則丟巾貞間隔Discard_Interval為7;若Factor等于2,則丟巾貞間隔Discard_Interval則為5;否則,丟巾貞間隔Discard_Interval則默認(rèn)為4。可選地,更新保存操作的突發(fā)等級(jí)狀態(tài)包括計(jì)算去抖動(dòng)緩沖區(qū)的當(dāng)前有效幀數(shù)量,根據(jù)如下計(jì)算公式更新突發(fā)等級(jí)狀態(tài)Burst_LevelBurst_Level+=I;*Burst_Level+=(當(dāng)前有效數(shù)量-存儲(chǔ)前數(shù)量)。可選地,更新讀取操作的突發(fā)等級(jí)狀態(tài)包括根據(jù)如下計(jì)算公式更新突發(fā)等級(jí)狀態(tài)Burst_LevelBurst_Level+=I??蛇x地,根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí)以計(jì)算出當(dāng)前的有效突發(fā)等級(jí)包括將去抖動(dòng)緩沖區(qū)的狀態(tài)改為Status_Processing,統(tǒng)計(jì)突發(fā)等級(jí)的最大值Burst_Level_Max;根據(jù)有效突發(fā)等級(jí)Eff_Level和突發(fā)等級(jí)Burst_Level重新計(jì)算得到當(dāng)前的有效突發(fā)等級(jí)Burst_Level。可選地,根據(jù)有效突發(fā)等級(jí)和突發(fā)等級(jí)的大小重新計(jì)算得到當(dāng)前的有效突發(fā)等級(jí)包括若突發(fā)等級(jí)Burst_Level大于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)突然增大,則當(dāng)前的有效突發(fā)等級(jí)Eff_Level根據(jù)如下公式得到Eff_Level=MIN(Burst_Level_Max,Buff_CAP*4/5),即取兩者中的較小值;若突發(fā)等級(jí)Burst_Level等于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)沒(méi)有改變,不作計(jì)算處理;若突發(fā)等級(jí)Burst_Level小于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)突然降低,則統(tǒng)計(jì)當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count,若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count小于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max時(shí),則不作處理;若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count大于等于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max時(shí),根據(jù)一個(gè)參考值來(lái)計(jì)算新的有效突發(fā)等級(jí)。可選地,根據(jù)一個(gè)參考值來(lái)計(jì)算新的有效突發(fā)等級(jí)包括設(shè)置最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max為0;計(jì)算得到一個(gè)參考值A(chǔ)VG,計(jì)算公式為AVG=(Eff_LeveI-Burst_Level_Max)/3;所述參考值A(chǔ)VG為大于等于I的常數(shù);根據(jù)參考值A(chǔ)VG,計(jì)算得到新的有效突發(fā)等級(jí)Eff_Level,計(jì)算公式為Eff_Level=Eff_Level_AVG。相較于現(xiàn)有技術(shù),本發(fā)明基于去抖動(dòng)緩沖區(qū)數(shù)據(jù)的存取操作和突發(fā)等級(jí)狀態(tài)來(lái)計(jì)算抖動(dòng)突發(fā)等級(jí),通過(guò)對(duì)突發(fā)等級(jí)狀態(tài)參數(shù)的不斷更新,根據(jù)有效突發(fā)等級(jí)的變化來(lái)調(diào)整去抖動(dòng)緩沖區(qū),以達(dá)到更低的延時(shí)和盡量大的自適應(yīng)去抖動(dòng)能力,不僅可以降低丟包的數(shù)量,提高音頻的質(zhì)量,更具有實(shí)現(xiàn)難度較低,可靠性較高的優(yōu)點(diǎn)。圖I為模擬實(shí)際的IP網(wǎng)絡(luò)中音頻包的時(shí)延抖動(dòng)示意圖;圖2為本發(fā)明VoIP去抖動(dòng)緩沖區(qū)的處理方法的流程示意圖;圖3為本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法中音頻數(shù)據(jù)幀的保存操作的流程示意圖;圖4為本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法中音頻數(shù)據(jù)幀的讀取操作以及當(dāng)前有效突發(fā)等級(jí)的計(jì)算的流程示意圖;圖5為采用固定長(zhǎng)度去抖動(dòng)緩沖算法的輸出結(jié)果;圖6為采用本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法的輸出結(jié)果。具體實(shí)施例方式請(qǐng)參閱圖I,其顯示了模擬實(shí)際的IP網(wǎng)絡(luò)中音頻包的時(shí)延抖動(dòng)示意圖;如圖I所示,由于數(shù)據(jù)包需在傳輸介質(zhì)中進(jìn)行傳輸,因此發(fā)送的數(shù)據(jù)包與接收的數(shù)據(jù)包之間存在一定的時(shí)延抖動(dòng)。在傳統(tǒng)的自適應(yīng)去抖動(dòng)緩沖方法中,RTP(Real-timeTransportProtocol,實(shí)時(shí)傳輸協(xié)議)頭部的時(shí)間戳提供了一種傳遞音頻流平滑信息的手段。如果不存在抖動(dòng)現(xiàn)象,則只用RTP頭部的時(shí)間戳就可以重現(xiàn)音頻流。當(dāng)存在抖動(dòng)現(xiàn)象而需要進(jìn)行抖動(dòng)緩沖設(shè)計(jì)時(shí),則應(yīng)采用如下三種時(shí)間戳RTP頭部中的時(shí)間戳、本地的到達(dá)時(shí)間戳和本地的播放時(shí)間戳。此外,應(yīng)該注意網(wǎng)絡(luò)抖動(dòng)有可能突變。一個(gè)抖動(dòng)突變意味網(wǎng)絡(luò)延遲的突然增加,增加的延遲可以是IOOms或更長(zhǎng)。抖動(dòng)突變的結(jié)果是一系列的數(shù)據(jù)包幾乎同時(shí)到達(dá)。為了處理抖動(dòng)突變,抖動(dòng)緩沖區(qū)大小一定可以是非??斓卦黾右赃m應(yīng)突然出現(xiàn)的大的抖動(dòng)。針對(duì)網(wǎng)絡(luò)抖動(dòng)的突變性問(wèn)題,同時(shí)更大的避免自適應(yīng)去抖動(dòng)緩沖方法的實(shí)現(xiàn)復(fù)雜和穩(wěn)定性的等一系列問(wèn)題,本發(fā)明采用了一種基于對(duì)去抖動(dòng)緩沖區(qū)中數(shù)據(jù)存取的統(tǒng)計(jì)和突發(fā)等級(jí)的計(jì)算結(jié)合的方法來(lái)更有效控制抖動(dòng)緩沖區(qū),以達(dá)到更低的延時(shí)和盡量大的自適應(yīng)去抖動(dòng)能力。請(qǐng)參閱圖2,其顯示了本發(fā)明VoIP去抖動(dòng)緩沖區(qū)的處理方法的流程示意圖。如圖2所示,本發(fā)明VoIP去抖動(dòng)緩沖區(qū)的處理方法包括初始化去抖動(dòng)緩沖區(qū);執(zhí)行音頻數(shù)據(jù)幀的保存操作,將接收自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)幀保存至去抖動(dòng)緩沖區(qū)中;執(zhí)行音頻數(shù)據(jù)幀的讀取操作,從去抖動(dòng)緩沖區(qū)中將音頻數(shù)據(jù)幀讀取出;根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí),計(jì)算出當(dāng)前的有效突發(fā)等級(jí);根據(jù)計(jì)算得到的當(dāng)前的有效突發(fā)等級(jí),調(diào)整去抖動(dòng)緩沖區(qū)的大小。下面對(duì)上述各個(gè)步驟進(jìn)行詳細(xì)描述。首先,初始化去抖動(dòng)緩沖區(qū)。步驟1-1,初始化包括緩沖能力Buff_Cap、最大突發(fā)等級(jí)Burst_Level_Max、讀取最大次數(shù)Get_Count_Max、穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max在內(nèi)的常量參數(shù)設(shè)置;在本實(shí)施例中,設(shè)置讀取最大次數(shù)Get_Count_Max為常數(shù)25,穩(wěn)定狀態(tài)次數(shù)StabIe_Count_Max為常數(shù)20。步驟1-2,初始化去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置音頻數(shù)據(jù)幀單位長(zhǎng)度;、步驟1-3,清空去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置去抖動(dòng)緩沖區(qū)的操作狀態(tài)為Status_Initailizing,突發(fā)等級(jí)Burst_Level的初始化狀態(tài)為O。在本實(shí)施例中,去抖動(dòng)緩沖區(qū)的操作狀態(tài)包括Status_Initailizing(初始化狀態(tài))和Status_Processing(處理狀態(tài))。然后,執(zhí)行音頻數(shù)據(jù)幀的保存操作,將接收自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)幀保存至去抖動(dòng)緩沖區(qū)中。圖3即顯示了本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法中音頻數(shù)據(jù)幀的保存操作的流程示意圖。如圖3所示,在去抖動(dòng)緩沖區(qū)執(zhí)行完初始化操作(具體詳見(jiàn)前述的步驟1-1至步驟1-4的內(nèi)容)后,處于初始化狀態(tài)。步驟2-1,判斷是否有新的音頻數(shù)據(jù)幀需要保存,若是有新的音頻數(shù)據(jù)幀,則進(jìn)至步驟2-2;反之,若沒(méi)有新的音頻數(shù)據(jù)幀,則空閑等待。、步驟2-2,計(jì)算當(dāng)前去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed;步驟2-3,判斷去抖動(dòng)緩沖區(qū)的狀態(tài)是否為Status_Processing,若判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)是Status_Processing時(shí),則進(jìn)至步驟2_4,開(kāi)始執(zhí)行音頻數(shù)據(jù)巾貞的保存;反之,若判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)不是Status_Processing時(shí),則進(jìn)至步驟2_5;步驟2-5,計(jì)算丟巾貞間隔Discard_Interval。在本實(shí)施例中,是利用去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed和突發(fā)等級(jí)Burst_Level來(lái)計(jì)算丟巾貞間隔Discard_Interval。具體地,計(jì)算方法如下公式Level_tmp=MAX(Burst_Level,Eff_Level),即取兩者中的較大值;Factor=BufferCountUsed/Burst_Level;(當(dāng)Burst_Level小于等于5且Factor小于3,則Factor設(shè)置為0;)若Factor等于0,則丟巾貞間隔Discard_Interval為0;若Factor等于I,則丟巾貞間隔Discard_Interval為I;若Factor等于2,則丟巾貞間隔Discard_Interval則為5;否則,丟巾貞間隔Discard_Interval則默認(rèn)為4。步驟2-6,判斷是否需要丟巾貞,即當(dāng)前巾貞間隔delta等于當(dāng)前巾貞序號(hào)(cur_frame_index)減去上一次丟包的巾貞序號(hào)(last_discard_index),若丟巾貞間隔Discard_Interval不等于0,且當(dāng)前巾貞間隔delta大于等于丟巾貞間隔Discard_Interval時(shí),則認(rèn)為當(dāng)前巾貞必須丟棄。若判斷需要丟幀,則進(jìn)至步驟2-7,丟棄當(dāng)前音頻數(shù)據(jù)幀,并設(shè)置當(dāng)前音頻數(shù)據(jù)中貞為丟棄音頻數(shù)據(jù)巾貞類(lèi)型Discarded_Frame_Type;反之,若判斷不需要丟巾貞,則進(jìn)至步驟2-4,開(kāi)始執(zhí)行音頻數(shù)據(jù)幀的保存。步驟2-8,判斷需要保存的當(dāng)前音頻數(shù)據(jù)幀是否超出設(shè)置的去抖動(dòng)緩沖區(qū)的緩沖能力,若沒(méi)有超出去抖動(dòng)緩沖區(qū)的緩沖能力,則進(jìn)至步驟2-9,成功將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中,設(shè)置當(dāng)前音頻數(shù)據(jù)幀為正常音頻數(shù)據(jù)幀類(lèi)型N0rmal_Frame_Type;若超出去抖動(dòng)緩沖區(qū)的緩沖能力,則進(jìn)至步驟2-10。步驟2-10,計(jì)算超出緩沖區(qū)上限的幀數(shù)量,并進(jìn)至步驟2-11。步驟2-11,則將去抖動(dòng)緩沖區(qū)的音頻數(shù)據(jù)幀列表中位于最前面的對(duì)應(yīng)長(zhǎng)度的音頻數(shù)據(jù)幀予以刪除,然后將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中。步驟2-12,計(jì)算去抖動(dòng)緩沖區(qū)的當(dāng)前有效幀數(shù)量,更新突發(fā)等級(jí)狀態(tài)Burst_Level。Burst_Level+=I;或Burst_Level+=(當(dāng)前有效數(shù)量_存儲(chǔ)前數(shù)量)步驟2-13,判斷Last_0P是否等于Put_0P,若Last_0P等于Put_0P,于步驟2-14,將突發(fā)等級(jí)Burst_Level設(shè)置為0;若Last_0P不等于Put_0P,于步驟2-15,設(shè)置Last_0P等于Put_0P,將突發(fā)等級(jí)Burst_Level設(shè)置為O。后續(xù),繼續(xù)執(zhí)行下一幀音頻數(shù)據(jù)的處理。接著,執(zhí)行音頻數(shù)據(jù)幀的讀取操作,從去抖動(dòng)緩沖區(qū)中將音頻數(shù)據(jù)幀讀取出;根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí),計(jì)算出當(dāng)前的有效突發(fā)等級(jí)。圖4即顯示了本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法中音頻數(shù)據(jù)幀的讀取操作以及當(dāng)前有效突發(fā)等級(jí)的計(jì)算的流程示意圖。如圖4所示,在去抖動(dòng)緩沖區(qū)執(zhí)行完初始化操作(具體詳見(jiàn)前述的步驟1-1至步驟1-4的內(nèi)容)后,處于初始化狀態(tài)。步驟3-1,判斷是否有新的音頻數(shù)據(jù)幀需要保存,若是有新的音頻數(shù)據(jù)幀,則進(jìn)至步驟3-2;反之,若沒(méi)有新的音頻數(shù)據(jù)幀,則播放靜音數(shù)據(jù)。步驟3-2,從去抖動(dòng)緩沖區(qū)音頻數(shù)據(jù)幀列表中讀取一幀音頻數(shù)據(jù),計(jì)算當(dāng)前去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed;步驟3-3,判斷音頻數(shù)據(jù)幀讀取是否成功,若讀取失敗,則進(jìn)至步驟3-4,將當(dāng)前音頻數(shù)據(jù)幀類(lèi)型設(shè)置為空音頻數(shù)據(jù)幀類(lèi)型Empty_Frame_Type,并設(shè)置數(shù)據(jù)長(zhǎng)度為0;若讀取成功,則進(jìn)至步驟3-5。步驟3-5,讀取得到一幀音頻數(shù)據(jù),確定當(dāng)前音頻數(shù)據(jù)幀的類(lèi)型;步驟3-6,更新突發(fā)等級(jí)Burst_Level,其中,Burst_Level+=I。步驟3-7,判斷下述各條件是否符合Last_0P是否等于Get_0P,緩沖區(qū)操作狀態(tài)是否為初始化狀態(tài)Status_Initializing,讀取次數(shù)GetCount是否大于等于最大讀取次數(shù)Get_Count_MaXo若不符合上述條件,則進(jìn)至步驟3-8,設(shè)置Last_0P等于Get_0P,將突發(fā)等級(jí)Burst_LeVel設(shè)置為0;若符合上述條件,進(jìn)至步驟3-9,將去抖動(dòng)緩沖區(qū)操作狀態(tài)改為運(yùn)行狀態(tài)Status_Processing,統(tǒng)計(jì)突發(fā)等級(jí)的最大值Burst_Level_Max。步驟3-10,根據(jù)有效突發(fā)等級(jí)Eff_Level和突發(fā)等級(jí)Burst_Level重新計(jì)算得到當(dāng)前的有效突發(fā)等級(jí)Burst_Level。在步驟3-10中,當(dāng)前的有效突發(fā)等級(jí)Burst_Level的計(jì)算包括a)、若突發(fā)等級(jí)Burst_Level大于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)突然增大,則當(dāng)前的有效突發(fā)等級(jí)Eff_Level根據(jù)如下公式得到Eff_Level=MIN(Burst_Level_Max,Buff_CAP*4/5),即取兩者中的較小值;b)、若突發(fā)等級(jí)Burst_Level等于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)沒(méi)有改變,不作計(jì)算處理c)、若突發(fā)等級(jí)Burst_Level小于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)突然降低,則統(tǒng)計(jì)當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count,若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count小于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max時(shí),則不作處理;若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count大于等于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max時(shí),根據(jù)一個(gè)參考值來(lái)計(jì)算新的有效突發(fā)等級(jí)Eff_Level。具體地設(shè)置最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max為0;根據(jù)公式AVG=(Eff_Level_Burst_Level_Max)/3,計(jì)算得到一個(gè)參考值A(chǔ)VG,所述參考值A(chǔ)VG為大于等于I的常數(shù);根據(jù)參考值A(chǔ)VG,計(jì)算得到新的有效突發(fā)等級(jí)EfT_LeVel,計(jì)算公式為Eff_Level=EfT_Level_AVG。步驟3-11,判斷讀取出的音頻數(shù)據(jù)幀類(lèi)型是否為正常音頻數(shù)據(jù)幀類(lèi)型Normal_Frame_Type,若是正常音頻數(shù)據(jù)巾貞類(lèi)型Normal_Frame_Type,將當(dāng)前音頻數(shù)據(jù)巾貞予以播放;若不是正常音頻數(shù)據(jù)巾貞類(lèi)型Normal_Frame_Type,則繼續(xù)讀取下一巾貞音頻數(shù)據(jù)。請(qǐng)?jiān)賲㈤唸D5和圖6,其中圖5為采用固定長(zhǎng)度去抖動(dòng)緩沖算法的輸出結(jié)果,圖6為采用本發(fā)明去抖動(dòng)緩沖區(qū)的處理方法的輸出結(jié)果。兩相對(duì)照,可以發(fā)現(xiàn),通過(guò)直觀的對(duì)比輸出文件波形,可以清楚看到本發(fā)明的方法輸出的波形更加完整,丟幀數(shù)量更少,并且輸出的延時(shí)相對(duì)更短。上述實(shí)施例僅列示性說(shuō)明本發(fā)明的原理及功效,而非用于限制本發(fā)明。任何熟悉此項(xiàng)技術(shù)的人員均可在不違背本發(fā)明的精神及范圍下,對(duì)上述實(shí)施例進(jìn)行修改。因此,本發(fā)明的權(quán)利保護(hù)范圍,應(yīng)如權(quán)利要求書(shū)所列。權(quán)利要求1.一種VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,包括初始化去抖動(dòng)緩沖區(qū);執(zhí)行音頻數(shù)據(jù)幀的保存操作,將接收自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)幀保存至去抖動(dòng)緩沖區(qū)中;更新保存操作的突發(fā)等級(jí)狀態(tài);執(zhí)行音頻數(shù)據(jù)幀的讀取操作,從去抖動(dòng)緩沖區(qū)中將音頻數(shù)據(jù)幀讀取出;更新讀取操作的突發(fā)等級(jí)狀態(tài);根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí),計(jì)算出當(dāng)前的有效突發(fā)等級(jí);根據(jù)計(jì)算得到的當(dāng)前的有效突發(fā)等級(jí),調(diào)整去抖動(dòng)緩沖區(qū)的大小。2.根據(jù)權(quán)利要求I所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,所述初始化去抖動(dòng)緩沖區(qū)包括初始化包括緩沖能力Buf_CCap、最大突發(fā)等級(jí)Burst_Level_Max、讀取最大次數(shù)Get_Count_Max、穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max在內(nèi)的常量參數(shù)設(shè)置;初始化去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置音頻數(shù)據(jù)幀單位長(zhǎng)度;清空去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀列表,設(shè)置去抖動(dòng)緩沖區(qū)的操作狀態(tài)為Status_Initailizing,突發(fā)等級(jí)Burst_Level的初始化狀態(tài)為O。3.根據(jù)權(quán)利要求2所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,所述執(zhí)行音頻數(shù)據(jù)幀的保存操作包括接收來(lái)自遠(yuǎn)端傳輸過(guò)來(lái)的新的音頻數(shù)據(jù)幀,計(jì)算當(dāng)前去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed;判斷去抖動(dòng)緩沖區(qū)的狀態(tài)是否為Status_Processing,并在判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)是Status_Processing時(shí),執(zhí)行音頻數(shù)據(jù)巾貞的保存;判斷保存的音頻數(shù)據(jù)幀是否超出設(shè)置的緩沖能力,若沒(méi)有超出緩沖能力,則成功將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中;若超出緩沖能力,則將去抖動(dòng)緩沖區(qū)的音頻數(shù)據(jù)幀列表中位于最前面的對(duì)應(yīng)長(zhǎng)度的音頻數(shù)據(jù)幀予以刪除,然后將當(dāng)前音頻數(shù)據(jù)幀保存到去抖動(dòng)緩沖區(qū)中;計(jì)算存儲(chǔ)當(dāng)前的音頻數(shù)據(jù)幀后去抖動(dòng)緩沖區(qū)的當(dāng)前有效幀數(shù)量,更新突發(fā)等級(jí)狀態(tài)Burst_Level。4.根據(jù)權(quán)利要求3所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,所述執(zhí)行音頻數(shù)據(jù)巾貞的保存操作還包括在判斷得到去抖動(dòng)緩沖區(qū)的狀態(tài)不是Status_Processing時(shí),通過(guò)去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed和突發(fā)等級(jí)Burst_Level來(lái)計(jì)算丟中貞間隔Discard_Interval,并在當(dāng)前巾貞間隔大于等于所述計(jì)算得到的丟巾貞間隔Discard_Interval時(shí),將當(dāng)前的音頻數(shù)據(jù)巾貞丟棄。5.根據(jù)權(quán)利要求4所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,通過(guò)去抖動(dòng)緩沖區(qū)的已使用長(zhǎng)度BufferCountUsed和突發(fā)等級(jí)Burst_Level來(lái)計(jì)算丟巾貞間隔Discard_Interval包括Level_tmp=MAX(Burst_Level,Eff_Level),即取兩者中的較大值;Factor=BufferCountUsed/Burst_Level;(當(dāng)Burst_Level小于等于5且Factor小于3,則Factor設(shè)置為0;)若Factor等于0,則丟巾貞間隔Discard_Interval為0;若Factor等于I,則丟巾貞間隔Discard_Interval為I;若Factor等于2,則丟巾貞間隔Discard_Interval則為5;否則,丟巾貞間隔Discard_Interval則默認(rèn)為4。6.根據(jù)權(quán)利要求I所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,更新保存操作的突發(fā)等級(jí)狀態(tài)包括計(jì)算去抖動(dòng)緩沖區(qū)的當(dāng)前有效巾貞數(shù)量,根據(jù)如下計(jì)算公式更新突發(fā)等級(jí)狀態(tài)Burst_LevelBurst_Level+=I;或Burst_Level+=(當(dāng)前有效數(shù)量_存儲(chǔ)前數(shù)量)。7.根據(jù)權(quán)利要求I所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,更新讀取操作的突發(fā)等級(jí)狀態(tài)包括根據(jù)如下計(jì)算公式更新突發(fā)等級(jí)狀態(tài)Burst_LevelBurst_Level+=I。8.根據(jù)權(quán)利要求3或4所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí)以計(jì)算出當(dāng)前的有效突發(fā)等級(jí)包括將去抖動(dòng)緩沖區(qū)的狀態(tài)改為Status_Processing,統(tǒng)計(jì)突發(fā)等級(jí)的最大值Burst_Level_Max;根據(jù)有效突發(fā)等級(jí)Eff_Level和突發(fā)等級(jí)Burst_Level重新計(jì)算得到當(dāng)前的有效突發(fā)等級(jí)Burst_Levelo9.根據(jù)權(quán)利要求8所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,根據(jù)有效突發(fā)等級(jí)和突發(fā)等級(jí)的大小重新計(jì)算得到當(dāng)前的有效突發(fā)等級(jí)包括若突發(fā)等級(jí)Burst_Level大于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)突然增大,則當(dāng)前的有效突發(fā)等級(jí)Eff_Level根據(jù)如下公式得到Eff_Level=MIN(Burst_Level_Max,Buff_CAP*4/5),即取兩者中的較小值;若突發(fā)等級(jí)Burst_Level等于有效突發(fā)等級(jí)Eff_Level,表示抖動(dòng)沒(méi)有改變,不作計(jì)算處理;若突發(fā)等級(jí)BurSt_Level小于有效突發(fā)等級(jí)EfT_LeVel,表示抖動(dòng)突然降低,則統(tǒng)計(jì)當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count,若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count小于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max時(shí),則不作處理;若當(dāng)前穩(wěn)定狀態(tài)次數(shù)Stable_Count大于等于所允許的最大穩(wěn)定狀態(tài)次數(shù)Stable_C0unt_MaX時(shí),根據(jù)一個(gè)參考值來(lái)計(jì)算新的有效突發(fā)等級(jí)。10.根據(jù)權(quán)利要求9所述的VoIP去抖動(dòng)緩沖區(qū)的處理方法,其特征在于,根據(jù)一個(gè)參考值來(lái)計(jì)算新的有效突發(fā)等級(jí)包括設(shè)置最大穩(wěn)定狀態(tài)次數(shù)Stable_Count_Max為0;計(jì)算得到一個(gè)參考值A(chǔ)VG,計(jì)算公式為AVG=(Eff_Level-Burst_Level_Max)/3;所述參考值A(chǔ)VG為大于等于I的常數(shù);根據(jù)參考值A(chǔ)VG,計(jì)算得到新的有效突發(fā)等級(jí)EfT_LeVel,計(jì)算公式為Eff_Level=EfT_Level_AVG0全文摘要本發(fā)明提供一種VoIP去抖動(dòng)緩沖區(qū)的處理方法,包括初始化去抖動(dòng)緩沖區(qū);執(zhí)行音頻數(shù)據(jù)幀的保存操作;更新突發(fā)等級(jí)狀態(tài);執(zhí)行音頻數(shù)據(jù)幀的讀取操作;更新突發(fā)等級(jí)狀態(tài);根據(jù)對(duì)去抖動(dòng)緩沖區(qū)中音頻數(shù)據(jù)幀進(jìn)行的保存操作和讀取操作以及突發(fā)等級(jí),計(jì)算出當(dāng)前的有效突發(fā)等級(jí);根據(jù)計(jì)算得到的當(dāng)前的有效突發(fā)等級(jí),調(diào)整去抖動(dòng)緩沖區(qū)的大小。相較于現(xiàn)有技術(shù),本發(fā)明基于緩沖區(qū)數(shù)據(jù)的存取操作和突發(fā)等級(jí)狀態(tài)來(lái)計(jì)算抖動(dòng)突發(fā)等級(jí),通過(guò)對(duì)突發(fā)等級(jí)狀態(tài)參數(shù)的不斷更新,根據(jù)有效突發(fā)等級(jí)的變化來(lái)調(diào)整去抖動(dòng)緩沖區(qū),以達(dá)到更低的延時(shí)和盡量大的自適應(yīng)去抖動(dòng)能力,降低丟包的數(shù)量,提高音頻的質(zhì)量,具有實(shí)現(xiàn)難度較低,可靠性較高的優(yōu)點(diǎn)。文檔編號(hào)H04M7/00GK102739503SQ201110082510公開(kāi)日2012年10月17日申請(qǐng)日期2011年4月1日優(yōu)先權(quán)日2011年4月1日發(fā)明者劉睿,周小川,熊模昌申請(qǐng)人:華平信息技術(shù)股份有限公司