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