專利名稱:一種減小數(shù)據(jù)包播放延時的方法
技術領域:
本發(fā)明涉及多媒體通信技術領域,尤其涉及一種減小數(shù)據(jù)包播放延時的方法。
背景技術:
當前,基于網(wǎng)絡的多媒體通信已經(jīng)越來越多的應用到各個領域。以音頻通信為例,多采用Windows操作系統(tǒng)提供的多媒體軟件開發(fā)包(SDK)來實現(xiàn)端到端的語音通信。在實現(xiàn)過程中,語音通信的發(fā)送端利用SDK的應用編程接口(API)函數(shù)waveInStart獲取語音,并將該語音以打包時長為單位切割為語音包,然后通過應用程序依次將各個語音包發(fā)送給語音通信的接收端;語音通信接收端接收到各個語音包之后,首先利用抖動緩存(JB)隊列緩存接收到的語音包,以消除由于網(wǎng)絡抖動而造成的語音包亂序或延時差異,該JB隊列的出隊線程以打包時長為間隔將各個緩存的數(shù)據(jù)包依次出隊,每個數(shù)據(jù)包一旦出隊,則立刻調用API函數(shù)waveOutWrite,將該數(shù)據(jù)包村放到系統(tǒng)提供的播放緩存中,以等待播放,播放緩存最終按照固定的時間間隔將各個數(shù)據(jù)包依次播放。
上述現(xiàn)有技術雖然能夠實現(xiàn)端到端的語音通信,但是,其具有以下缺點在采用SDK實現(xiàn)語音通信的過程中,語音通信發(fā)送端處理語音的速度通常快于語音通信接收端實際播放語音的速度,也就是說,語音通信發(fā)送端以打包時長為間隔向語音通信接收端發(fā)送各個語音包,而語音通信接收端的播放緩存只能夠以比打包時長稍長的時間作為時間間隔來播放各個語音包,這樣,經(jīng)過一段時間的累積,會在語音通信接收端的播放緩存中堆積過多的語音包,從而增大端到端語音通信的數(shù)據(jù)包播放延時,影響語音通信的服務質量(QOS)。
以采樣率為8KHz,打包時長為60毫秒的語音通信為例,在該于語音通信持續(xù)進行15分鐘之后,會出現(xiàn)將近2秒的數(shù)據(jù)包播放延時,從而嚴重影響了語音通信的QOS。
在采用SDK實現(xiàn)的其它多媒體通信中,由于通信發(fā)送端和接收端處理多媒體數(shù)據(jù)的速度不一致,因此,也會導致如上所述的數(shù)據(jù)包在通信接收端的播放延時問題。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種減小數(shù)據(jù)包播放延時的方法,以減小由于通信發(fā)送端和接收端處理數(shù)據(jù)速度不一致而導致的數(shù)據(jù)包播放延時問題。
為實現(xiàn)上述目的,本發(fā)明提供了一種減小數(shù)據(jù)包播放延時的方法,該方法包括步驟a獲取當前數(shù)據(jù)流的打包時長,根據(jù)該打包時長,計算與數(shù)據(jù)包在通信接收端最大播放延時相對應的數(shù)據(jù)包個數(shù);步驟b數(shù)據(jù)包接收端按照數(shù)據(jù)包發(fā)送時間間隔依次接收數(shù)據(jù)包并將接收到的數(shù)據(jù)包依次緩存到播放緩存中,播放緩存按照實際播放時間間隔實際播放數(shù)據(jù)包,根據(jù)緩存到播放緩存中的數(shù)據(jù)包個數(shù)以及播放緩存實際播放的數(shù)據(jù)包個數(shù),判斷播放緩存中當前所緩存的數(shù)據(jù)包個數(shù)是否已經(jīng)大于或等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,否則,執(zhí)行所述將當前接收到的數(shù)據(jù)包依次緩存到播放緩存中的步驟。
其中,在步驟b之前,設置一個空閑隊列,并為該空閑隊列申請空閑緩存單元,所申請的空閑緩存單元總數(shù)與所述與最大播放延時相對應的數(shù)據(jù)包個數(shù)相等,步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b11通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;
步驟b12判斷空閑隊列中的當前緩存單元個數(shù)是否大于等于0,如果是,則執(zhí)行步驟b13,否則,執(zhí)行步驟b14;步驟b13對空閑隊列中的一個空閑緩存單元執(zhí)行出隊操作,將出隊的空閑緩存單元分配給當前接收到的數(shù)據(jù)包,播放緩存利用為數(shù)據(jù)包所分配的空閑緩存單元,按照數(shù)據(jù)包到達順序,緩存當前接收到的數(shù)據(jù)包;步驟b14丟棄當前接收到的數(shù)據(jù)包,返回步驟b11;和,在通信接收端播放數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b20按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b21判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,執(zhí)行步驟b22,否則,返回本步驟;步驟b22將當前實際播放的數(shù)據(jù)包所對應的空閑緩存返回該空閑隊列。
其中,在執(zhí)行步驟b12之后且執(zhí)行步驟b13之前,該方法進一步包括步驟b131判斷空閑隊列當前是否處于操作狀態(tài),如果不是,則將空閑隊列置為操作狀態(tài),和,執(zhí)行所述步驟b13,否則,返回步驟b131;執(zhí)行步驟b13之后,該方法進一步包括將空閑隊列置為非操作狀態(tài);在執(zhí)行步驟b21之后且執(zhí)行步驟b22之前,該方法進一步包括步驟b221判斷空閑隊列當前是否處于操作狀態(tài),如果不是,則將空閑隊列置為操作狀態(tài),和,執(zhí)行所述步驟b22,否則,返回步驟b221;執(zhí)行步驟b22之后,該方法進一步包括將空閑隊列置為非操作狀態(tài)。
其中,所述將空閑隊列置為操作狀態(tài)為獲取空閑隊列的互斥信號量;所述將空閑隊列置為非操作狀態(tài)為釋放空閑隊列的互斥信號量;
所述判斷空閑隊列是否處于操作狀態(tài)為判斷是否能夠獲取該空閑隊列的互斥信號量,如果是,則判斷得到空閑隊列處于非操作狀態(tài),否則,判斷得到空閑隊列處于操作狀態(tài)。
其中,所述將空閑隊列置為操作狀態(tài)為將空閑隊列操作狀態(tài)變量置為1;所述將空閑隊列置為非操作狀態(tài)為將空閑隊列操作狀態(tài)變量置為0;所述判斷空閑隊列是否處于操作狀態(tài)為判斷空閑隊列操作狀態(tài)變量當前值是否為1,如果是,則判斷得到空閑隊列處于操作狀態(tài),否則,判斷得到空閑隊列處于非操作狀態(tài)。
其中設置一個播放緩存數(shù)據(jù)包個數(shù)變量,用于表示播放緩存中當前緩存的數(shù)據(jù)包個數(shù),在執(zhí)行步驟b之前,將該變量初始為0;步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b31通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟b32判斷播放緩存數(shù)據(jù)包個數(shù)變量的當前值是否大于等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟b31,否則,將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將播放緩存數(shù)據(jù)包個數(shù)變量的當前值加1,然后返回步驟b31;在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟b40按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b41判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則將播放緩存數(shù)據(jù)包個數(shù)變量的當前值減1,然后返回步驟b40,否則,返回本步驟。
其中設置一個播放緩存數(shù)據(jù)包個數(shù)變量,用于表示與最大延時對應的數(shù)據(jù)包個數(shù)同播放緩存中當前數(shù)據(jù)包個數(shù)的差值,在執(zhí)行步驟b之前,該差值變量初始值為與最大延時對應的數(shù)據(jù)包個數(shù);步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b51通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟b52判斷差值變量的當前值是否小于等于0,如果是,則丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟b51,否則,將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將差值變量的當前值減1,然后返回步驟b51;在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟b60按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b61判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則將差值變量的當前值加1,然后返回步驟b60,否則,返回本步驟。
其中,所述判斷當前是否有數(shù)據(jù)包實際播放播放為判斷是否收到WOM_DONE消息,如果是,則判斷得到當前有數(shù)據(jù)包實際播放播放,否則,判斷得到當前沒有數(shù)據(jù)包實際播放。
其中,所述數(shù)據(jù)包為語音包。
可見,本發(fā)明在判斷得到緩存在播放緩存中的數(shù)據(jù)包個數(shù)超過與最大播放延時相對應的數(shù)據(jù)包個數(shù)時,主動丟棄當前接收到的數(shù)據(jù)包,從而使得該數(shù)據(jù)包之后的數(shù)據(jù)包能夠相應地提前播放,從而減小了數(shù)據(jù)包的播放延時,能夠保證例如語音通信等數(shù)據(jù)包通信的服務質量。
圖1為本發(fā)明一實施例中,通信接收端接收數(shù)據(jù)包一側的流程圖。
圖2為本發(fā)明一實施例中,通信接收端播放數(shù)據(jù)包一側的流程圖。
圖3為本發(fā)明另一實施例中,通信接收端接收數(shù)據(jù)包一側的流程圖。
圖4為本發(fā)明另一實施例中,通信接收端播放數(shù)據(jù)包一側的流程圖。
圖5為本發(fā)明再一實施例中,通信接收端接收數(shù)據(jù)包一側的流程圖。
圖6為本發(fā)明再一實施例中,通信接收端播放數(shù)據(jù)包一側的流程圖。
具體實施例方式
本發(fā)明為一種減小數(shù)據(jù)包播放延時的方法,該方法判斷播放緩存中所緩存的數(shù)據(jù)包個數(shù)是否已經(jīng)達到或超過與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則通過丟棄當前接收到的數(shù)據(jù)包,使得后續(xù)數(shù)據(jù)包能夠提前播放,從而減小數(shù)據(jù)包播放延時。
下面對本發(fā)明進行詳細描述。
實現(xiàn)本發(fā)明需要以下步驟步驟a獲取當前數(shù)據(jù)流的打包時長,根據(jù)該打包時長,計算與數(shù)據(jù)包在通信接收端最大播放延時相對應的數(shù)據(jù)包個數(shù);步驟b數(shù)據(jù)包接收端按照數(shù)據(jù)包發(fā)送時間間隔依次接收數(shù)據(jù)包并將接收到的數(shù)據(jù)包依次緩存到播放緩存中,播放緩存按照實際播放時間間隔實際播放數(shù)據(jù)包,根據(jù)緩存到播放緩存中的數(shù)據(jù)包個數(shù)以及播放緩存實際播放的數(shù)據(jù)包個數(shù),判斷播放緩存中當前所緩存的數(shù)據(jù)包個數(shù)是否已經(jīng)大于或等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,否則,執(zhí)行所述將當前接收到的數(shù)據(jù)包依次緩存到播放緩存中的步驟。
其中,在所述步驟a中,還可以根據(jù)播放需要,進一步更改所述最大播放延時,并利用步驟a計算得到更改后最大播放延時所對應的數(shù)據(jù)包個數(shù),并不影響本發(fā)明的實現(xiàn)。
下面,結合具體實例,對步驟b的具體實現(xiàn)進行詳細描述在本發(fā)明一實施例中,設置一個空閑隊列,利用該空閑隊列實現(xiàn)步驟b所述的內(nèi)容,在接收數(shù)據(jù)流之前,首先根據(jù)所述與最大播放延時相對應的數(shù)據(jù)包個數(shù)對該空閑隊列進行初始化,具體包括
為該空閑隊列申請空閑緩存單元,所申請的空閑緩存單元總數(shù)與所述與最大播放延時相對應的數(shù)據(jù)包個數(shù)相等,并且,初始化該空閑隊列的兩個參數(shù)空閑隊列緩存單元最大個數(shù)MaxFreeQueueLen以及空閑隊列當前緩存單元個數(shù)CurrFreeQueueLen,MaxFreeQueueLen的初始值為所述與最大播放延時相對應的數(shù)據(jù)包個數(shù),CurrFreeQueueLen的初始值與MaxFreeQueueLen相等;對空閑隊列進行初始化之后,可利用圖1和圖2所示的步驟實現(xiàn)步驟b參見圖1,在通信接收端接收數(shù)據(jù)包一側,具體執(zhí)行以下步驟步驟101通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟102判斷CurrFreeQueueLen是否大于等于0,如果不是,說明空閑隊列中已經(jīng)沒有剩余的空閑緩存單元可供數(shù)據(jù)包使用,進一步說明播放緩存中所緩存的數(shù)據(jù)包個數(shù)已經(jīng)達到了與最大播放延時相對應的數(shù)據(jù)包個數(shù),為避免進一步增大播放延時,不應該再向播放緩存中緩存數(shù)據(jù)包,并且,為了減小播放延時,應當通過丟包使得當前接收的數(shù)據(jù)包的后續(xù)數(shù)據(jù)包能夠提前播放,則執(zhí)行步驟109;否則,說明空閑隊列中仍有空閑緩存單元可供數(shù)據(jù)包使用,相應地,播放緩存中所緩存的數(shù)據(jù)包個數(shù)也沒有達到與最大播放延時相對應的數(shù)據(jù)包個數(shù),當前的播放延時并沒有超過最大播放延時的限制,從而,可以繼續(xù)向播放緩存中緩存數(shù)據(jù)包,則執(zhí)行步驟103及其后續(xù)步驟;步驟103判斷空閑隊列當前是否處于操作狀態(tài),如果不是,則執(zhí)行步驟104,否則,返回步驟103,直至空閑隊列處于非操作狀態(tài);其中,由于圖1所示的步驟105和步驟106以及圖2所示的步驟203和步驟204均會對空閑隊列執(zhí)行操作,因此,為了避免同時對空閑隊列執(zhí)行操作從而產(chǎn)生相互沖突,需要在對空閑隊列執(zhí)行操作之前判斷該空閑隊列是否處于操作狀態(tài),以使得僅在空閑隊列處于非操作狀態(tài)的情況下才對空閑隊列執(zhí)行操作;在本發(fā)明實施例中,設置一個用于維護空閑隊列數(shù)據(jù)一致性的互斥信號量,判斷是否能夠獲取該信號量,如果是,則可判斷得到空閑隊列當前處于非操作狀態(tài),否則,判斷得到空閑隊列處于操作狀態(tài);在本發(fā)明其它實施例中,也可設置一個空閑隊列操作狀態(tài)變量,該變量為1時表示空閑隊列處于操作狀態(tài),該變量為0時表示空閑隊列處于非操作狀態(tài),通過判斷該變量的當前值是否為1即可實現(xiàn)對空閑隊列當前狀態(tài)的判斷,并不影響本發(fā)明的實現(xiàn);步驟104將空閑隊列當前狀態(tài)置為操作狀態(tài),在本發(fā)明實施例中,通過獲取空閑隊列的互斥信號量實現(xiàn)將該空閑隊列置為操作狀態(tài);在本發(fā)明其它實施例中,也可通過將操作狀態(tài)變量置為1實現(xiàn)置空閑隊列為操作狀態(tài);步驟105~步驟106對空閑對列中的一個空閑緩存單元執(zhí)行出隊操作,將出隊的空閑緩存單元分配給當前接收到的數(shù)據(jù)包,然后,將CurrFreeQueueLen的當前值減1;其中,步驟105和步驟106的執(zhí)行順序并不影響本發(fā)明的實現(xiàn);步驟107~步驟108播放緩存利用步驟105所分配的空閑緩存單元,按照數(shù)據(jù)包的到達順序,緩存當前接收到的數(shù)據(jù)包,該數(shù)據(jù)包在播放緩存中等待實際播放,然后,將空閑隊列的當前狀態(tài)置為非操作狀態(tài);其中,在本發(fā)明實施例中,通過調用waveOutWrite參數(shù)將數(shù)據(jù)包緩存到播放緩存中,通過釋放空閑隊列的互斥信號量實現(xiàn)將空閑隊列當前狀態(tài)置為非操作狀態(tài),如果采用變量表示空閑隊列的當前狀態(tài),則可通過將該變量置為0實現(xiàn)將空閑隊列置為非操作狀態(tài),并不影響本發(fā)明的實現(xiàn);其中,步驟107和步驟108的執(zhí)行順序并不影響本發(fā)明的實現(xiàn);步驟109由于在步驟102中判斷得到CurrFreeQueueLen大于等于0,因此,為了避免進一步緩存數(shù)據(jù)包從而造成播放延時進一步超過最大播放延時,將當前接收到的數(shù)據(jù)包丟棄,然后,返回步驟101,按照數(shù)據(jù)包發(fā)送時間間隔,等待接收下一個數(shù)據(jù)包;由于在實際播放數(shù)據(jù)包的過程中,僅按照數(shù)據(jù)包在播放緩存中的緩存順序實際播放數(shù)據(jù)包,因此,在步驟109中丟棄一個數(shù)據(jù)包之后,能夠使得該丟棄數(shù)據(jù)包之后的各個數(shù)據(jù)包提前一個實際播放時間間隔播放,從而達到減小播放延時的目的,有關播放數(shù)據(jù)包的具體過程,將結合圖2進行詳細描述;參見圖2,在通信接收端播放數(shù)據(jù)包一側,具體執(zhí)行以下步驟步驟200通信接收端播放數(shù)據(jù)包一側,按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟201判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則執(zhí)行步驟202及其后續(xù)步驟,否則,返回本步驟,直至有數(shù)據(jù)包實際播放時再執(zhí)行步驟202及其后續(xù)步驟;步驟202判斷空閑隊列當前是否處于操作狀態(tài),如果是,則返回步驟202,否則,執(zhí)行步驟203及其后續(xù)步驟;其中,步驟202中所述的判斷方式與圖1中步驟103中的判斷方式相同;步驟203將空閑隊列的當前狀態(tài)置為操作狀態(tài),在本發(fā)明實施例中,通過獲取空閑隊列的互斥信號量實現(xiàn)該步驟,也可采用步驟104中所述的其余方式實現(xiàn)該步驟;步驟204~步驟205對空閑隊列執(zhí)行入隊操作,將當前實際播放的數(shù)據(jù)包所對應的空閑緩存返回該空閑隊列,然后,將CurrFreeQueueLen的當前值加1;其中,步驟204和步驟205之間的執(zhí)行順序并不影響本發(fā)明的實現(xiàn);步驟206將該空閑隊列的當前狀態(tài)置為非操作狀態(tài),然后,返回步驟200,直至通信結束;本發(fā)明實施例中,通過釋放空閑隊列的互斥信號量實現(xiàn)該步驟,也可通過步驟108中所描述的其余方式實現(xiàn)該步驟。
在以上所述實施例中,空閑隊列為數(shù)據(jù)包分配空閑緩存,從而使得在播放緩存中等待播放的數(shù)據(jù)包無需再占用播放緩存本身的緩存,有利于有效地控制播放緩存中緩存的占用率;在本發(fā)明其它實施例中,如果不考慮播放緩存中緩存占用率的問題,還可按照如下方式實現(xiàn)步驟b,具體包括設置一個播放緩存數(shù)據(jù)包個數(shù)變量,用于表示播放緩存中當前緩存的數(shù)據(jù)包個數(shù),在接收數(shù)據(jù)流之前,將該變量初始為0;參見圖3,在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟301通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟302判斷播放緩存數(shù)據(jù)包個數(shù)變量的當前值是否大于等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則執(zhí)行步驟305,否則,執(zhí)行步驟303;步驟303~步驟304將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將播放緩存數(shù)據(jù)包個數(shù)變量的當前值加1,然后返回步驟301,直至通信結束;其中,步驟303和步驟304的執(zhí)行順序并不影響本發(fā)明的實現(xiàn);步驟305丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟301,直至通信結束;參見圖4,在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟400通信接收端播放數(shù)據(jù)包一側,按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟401判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則執(zhí)行步驟402及其后續(xù)步驟,否則,返回本步驟,直至有數(shù)據(jù)包實際播放時再執(zhí)行步驟402及其后續(xù)步驟;步驟402將播放緩存數(shù)據(jù)包個數(shù)變量的當前值減1,然后返回步驟400,直至通信結束。
類似的,可以設置一個差值變量,用于表示與最大延時對應的數(shù)據(jù)包個數(shù)同播放緩存中當前數(shù)據(jù)包個數(shù)的差值,在接收數(shù)據(jù)流之前,該差值變量初始值為與最大延時對應的數(shù)據(jù)包個數(shù),參考圖5和圖6,可按如下方式實現(xiàn)步驟b參見圖5,在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟501通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟502判斷差值變量的當前值是否小于等于0,如果是,則執(zhí)行步驟505,否則,執(zhí)行步驟503;步驟503~步驟504將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將差值變量減1,然后返回步驟501,直至通信結束;其中,步驟503和步驟504的執(zhí)行順序并不影響本發(fā)明的實現(xiàn);步驟505丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟501,直至通信結束;參見圖6,在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟600通信接收端播放數(shù)據(jù)包一側,按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟601判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則執(zhí)行步驟602及其后續(xù)步驟,否則,返回本步驟,直至有數(shù)據(jù)包實際播放時再執(zhí)行步驟602及其后續(xù)步驟;步驟602將差值變量加1,然后返回步驟600,直至通信結束。
類似的,只要采用相應數(shù)學算法,根據(jù)緩存到播放緩存中的數(shù)據(jù)包個數(shù)以及播放緩存實際播放的數(shù)據(jù)包個數(shù),判斷播放緩存中當前所緩存的數(shù)據(jù)包個數(shù)是否大于或等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),均應在本發(fā)明的保護范圍之內(nèi)。
在本發(fā)明以上所述實施例中,均可通過判斷是否收到WOM_DONE消息來判斷當前是否有數(shù)據(jù)包實際播放如果收到該消息,則判斷得到當前有數(shù)據(jù)包實際播放,也可采用其它方式實現(xiàn)該判斷,并不影響本發(fā)明的實現(xiàn)。
在本發(fā)明以上所述實施例中,所述的數(shù)據(jù)包可以為語音包,也可為其它類型的數(shù)據(jù)包,并不影響本發(fā)明的實現(xiàn)。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。
權利要求
1.一種減小數(shù)據(jù)包播放延時的方法,其特征在于,該方法包括步驟a獲取當前數(shù)據(jù)流的打包時長,根據(jù)該打包時長,計算與數(shù)據(jù)包在通信接收端最大播放延時相對應的數(shù)據(jù)包個數(shù);步驟b數(shù)據(jù)包接收端按照數(shù)據(jù)包發(fā)送時間間隔依次接收數(shù)據(jù)包并將接收到的數(shù)據(jù)包依次緩存到播放緩存中,播放緩存按照實際播放時間間隔實際播放數(shù)據(jù)包,根據(jù)緩存到播放緩存中的數(shù)據(jù)包個數(shù)以及播放緩存實際播放的數(shù)據(jù)包個數(shù),判斷播放緩存中當前所緩存的數(shù)據(jù)包個數(shù)是否已經(jīng)大于或等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,否則,執(zhí)行所述將當前接收到的數(shù)據(jù)包依次緩存到播放緩存中的步驟。
2.根據(jù)權利要求1所述的方法,其特征在于,在步驟b之前,設置一個空閑隊列,并為該空閑隊列申請空閑緩存單元,所申請的空閑緩存單元總數(shù)與所述與最大播放延時相對應的數(shù)據(jù)包個數(shù)相等,步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b11通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟b12判斷空閑隊列中的當前緩存單元個數(shù)是否大于等于0,如果是,則執(zhí)行步驟b13,否則,執(zhí)行步驟b14;步驟b13對空閑隊列中的一個空閑緩存單元執(zhí)行出隊操作,將出隊的空閑緩存單元分配給當前接收到的數(shù)據(jù)包,播放緩存利用為數(shù)據(jù)包所分配的空閑緩存單元,按照數(shù)據(jù)包到達順序,緩存當前接收到的數(shù)據(jù)包;步驟b14丟棄當前接收到的數(shù)據(jù)包,返回步驟b11;和,在通信接收端播放數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b20按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b21判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,執(zhí)行步驟b22,否則,返回本步驟;步驟b22將當前實際播放的數(shù)據(jù)包所對應的空閑緩存返回該空閑隊列。
3.根據(jù)權利要求2所述的方法,其特征在于,在執(zhí)行步驟b12之后且執(zhí)行步驟b13之前,該方法進一步包括步驟b131判斷空閑隊列當前是否處于操作狀態(tài),如果不是,則將空閑隊列置為操作狀態(tài),和,執(zhí)行所述步驟b13,否則,返回步驟b131;執(zhí)行步驟b13之后,該方法進一步包括將空閑隊列置為非操作狀態(tài);在執(zhí)行步驟b21之后且執(zhí)行步驟b22之前,該方法進一步包括步驟b221判斷空閑隊列當前是否處于操作狀態(tài),如果不是,則將空閑隊列置為操作狀態(tài),和,執(zhí)行所述步驟b22,否則,返回步驟b221;執(zhí)行步驟b22之后,該方法進一步包括將空閑隊列置為非操作狀態(tài)。
4.根據(jù)權利要求3所述的方法,其特征在于,所述將空閑隊列置為操作狀態(tài)為獲取空閑隊列的互斥信號量;所述將空閑隊列置為非操作狀態(tài)為釋放空閑隊列的互斥信號量;所述判斷空閑隊列是否處于操作狀態(tài)為判斷是否能夠獲取該空閑隊列的互斥信號量,如果是,則判斷得到空閑隊列處于非操作狀態(tài),否則,判斷得到空閑隊列處于操作狀態(tài)。
5.根據(jù)權利要求3所述的方法,其特征在于,所述將空閑隊列置為操作狀態(tài)為將空閑隊列操作狀態(tài)變量置為1;所述將空閑隊列置為非操作狀態(tài)為將空閑隊列操作狀態(tài)變量置為0;所述判斷空閑隊列是否處于操作狀態(tài)為判斷空閑隊列操作狀態(tài)變量當前值是否為1,如果是,則判斷得到空閑隊列處于操作狀態(tài),否則,判斷得到空閑隊列處于非操作狀態(tài)。
6.根據(jù)權利要求1所述的方法,其特征在于設置一個播放緩存數(shù)據(jù)包個數(shù)變量,用于表示播放緩存中當前緩存的數(shù)據(jù)包個數(shù),在執(zhí)行步驟b之前,將該變量初始為0;步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b31通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟b32判斷播放緩存數(shù)據(jù)包個數(shù)變量的當前值是否大于等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟b31,否則,將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將播放緩存數(shù)據(jù)包個數(shù)變量的當前值加1,然后返回步驟b31;在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟b40按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b41判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則將播放緩存數(shù)據(jù)包個數(shù)變量的當前值減1,然后返回步驟b40,否則,返回本步驟。
7.根據(jù)權利要求1所述的方法,其特征在于設置一個播放緩存數(shù)據(jù)包個數(shù)變量,用于表示與最大延時對應的數(shù)據(jù)包個數(shù)同播放緩存中當前數(shù)據(jù)包個數(shù)的差值,在執(zhí)行步驟b之前,該差值變量初始值為與最大延時對應的數(shù)據(jù)包個數(shù);步驟b包括在通信接收端接收數(shù)據(jù)包一側,執(zhí)行以下步驟步驟b51通信接收端按照數(shù)據(jù)包發(fā)送時間間隔,依次接收數(shù)據(jù)包;步驟b52判斷差值變量的當前值是否小于等于0,如果是,則丟棄當前接收到的數(shù)據(jù)包,然后,返回步驟b51,否則,將當前接收的數(shù)據(jù)包緩存到播放緩存中,并將差值變量的當前值減1,然后返回步驟b51;在通信接收端播放數(shù)據(jù)包的一側,執(zhí)行以下步驟步驟b60按照實際播放時間間隔,依次播放緩存在播放緩存中的各個數(shù)據(jù)包;步驟b61判斷當前是否有數(shù)據(jù)包從播放緩存中實際播放,如果是,則將差值變量的當前值加1,然后返回步驟b60,否則,返回本步驟。
8.根據(jù)權利要求2~7任意一項所述的方法,其特征在于,所述判斷當前是否有數(shù)據(jù)包實際播放播放為判斷是否收到WOM_DONE消息,如果是,則判斷得到當前有數(shù)據(jù)包實際播放播放,否則,判斷得到當前沒有數(shù)據(jù)包實際播放。
9.根據(jù)權利要求1~7任意一項所述的方法,其特征在于,所述數(shù)據(jù)包為語音包。
全文摘要
本發(fā)明為一種減小數(shù)據(jù)包播放延時的方法,該方法包括步驟a獲取當前數(shù)據(jù)流的打包時長,根據(jù)該打包時長,計算與數(shù)據(jù)包在通信接收端最大播放延時相對應的數(shù)據(jù)包個數(shù);步驟b數(shù)據(jù)包接收端按照數(shù)據(jù)包發(fā)送時間間隔依次接收數(shù)據(jù)包并將接收到的數(shù)據(jù)包依次緩存到播放緩存中,播放緩存按照實際播放時間間隔實際播放數(shù)據(jù)包,根據(jù)緩存到播放緩存中的數(shù)據(jù)包個數(shù)以及播放緩存實際播放的數(shù)據(jù)包個數(shù),判斷播放緩存中當前所緩存的數(shù)據(jù)包個數(shù)是否已經(jīng)大于或等于與最大播放延時相對應的數(shù)據(jù)包個數(shù),如果是,則丟棄當前接收到的數(shù)據(jù)包,否則,執(zhí)行所述將當前接收到的數(shù)據(jù)包依次緩存到播放緩存中的步驟。
文檔編號H04L12/56GK1791055SQ200410098719
公開日2006年6月21日 申請日期2004年12月14日 優(yōu)先權日2004年12月14日
發(fā)明者王麒 申請人:騰訊科技(深圳)有限公司