洪煌輝,袁清珂
(廣東工業(yè)大學(xué) 機(jī)電工程學(xué)院,廣東 廣州 510006)
隨著流媒體技術(shù)的飛速發(fā)展,流媒體數(shù)據(jù)量的不斷增大使得傳統(tǒng)的基于RTP/RTSP的流媒體技術(shù)不能滿足高質(zhì)量的流媒體需求[1],導(dǎo)致影響用戶觀看體驗(yàn),并制約多媒體技術(shù)進(jìn)一步的發(fā)展[2]。許多文獻(xiàn)提出數(shù)據(jù)傳輸應(yīng)具有動(dòng)態(tài)網(wǎng)絡(luò)的自適應(yīng)性。其中包括根據(jù)當(dāng)前的網(wǎng)絡(luò)情況(例如可用帶寬)動(dòng)態(tài)地調(diào)整視頻碼率,從而生成合適于當(dāng)前網(wǎng)絡(luò)的視頻流[3,4]。采用探測的方式,判斷吞吐量或網(wǎng)絡(luò)帶寬等情況來調(diào)整碼率,以生成合適的視頻流[5-7]。文獻(xiàn)[8]通過計(jì)算當(dāng)前吞吐量,從而決策是否調(diào)節(jié)視頻碼率。文獻(xiàn)[9]介紹了一種采用“探測”的方法估算實(shí)時(shí)帶寬,但該算法需要發(fā)送大量的探測數(shù)據(jù)包,在網(wǎng)絡(luò)擁塞時(shí)會(huì)進(jìn)一步加重網(wǎng)絡(luò)的負(fù)載。因此,以上方法仍然存在一定程度的缺陷,還不能直接應(yīng)用于實(shí)際。本文將立足于已有的視頻網(wǎng)絡(luò)傳輸控制方法,并根據(jù)上述所提及的問題,提出一種自適應(yīng)網(wǎng)絡(luò)帶寬的H.264碼率控制策略。建立帶寬預(yù)測模型檢測網(wǎng)絡(luò)情況,再評價(jià)源端的視頻傳輸質(zhì)量,自適應(yīng)地調(diào)整量化參數(shù)和最高碼率值。該算法可以解決傳統(tǒng)碼率控制算法的缺陷,精確檢測網(wǎng)絡(luò)情況,提高視頻傳輸質(zhì)量,碼率控制誤差更小。
目前,帶寬測量技術(shù)根據(jù)是否發(fā)送探測包可分為被動(dòng)測量技術(shù)和主動(dòng)測量技術(shù)。被動(dòng)測量技術(shù)通過結(jié)合軟件和硬件監(jiān)聽網(wǎng)絡(luò)分組流來推測網(wǎng)絡(luò)帶寬。因存在需要額外的專用設(shè)備、權(quán)限以及成本的限制,使其難以簡單方便地應(yīng)用于實(shí)際。主動(dòng)測量則是通過發(fā)送網(wǎng)絡(luò)探測包并根據(jù)包中所攜帶的信息來計(jì)算網(wǎng)絡(luò)帶寬。較為成熟的測量機(jī)制分為基于速率模型和基于報(bào)文間隔模型。
上述的測量機(jī)制都可以得到網(wǎng)絡(luò)中的可用帶寬,但它們都是通過在網(wǎng)絡(luò)中不斷地發(fā)送測量數(shù)據(jù)包,這無疑是增加了網(wǎng)絡(luò)的負(fù)載,特別是在網(wǎng)絡(luò)擁塞的情況下使得擁塞更加嚴(yán)重。而且測量過程需要一定的時(shí)間作為代價(jià),故不適合實(shí)時(shí)性要求較高的場合。針對上述的缺點(diǎn),參考文獻(xiàn)[10]中提到的帶寬預(yù)測算法,此算法在網(wǎng)絡(luò)擁塞的時(shí)候仍存在不足,在計(jì)算上一個(gè)時(shí)刻的可用帶寬時(shí)存在滯后性,所以會(huì)導(dǎo)致下一個(gè)時(shí)刻的預(yù)測帶寬范圍也有一定程度的延時(shí),故不能直接應(yīng)用于實(shí)際。本文將在此算法的基礎(chǔ)上做進(jìn)一步的優(yōu)化,使其適用于H.264編碼技術(shù)且有效地應(yīng)用于實(shí)際。即在不影響數(shù)據(jù)傳輸?shù)那闆r下測量上一個(gè)時(shí)刻的網(wǎng)絡(luò)可用帶寬,并且構(gòu)建基于高斯分布的預(yù)測算法,預(yù)測下一個(gè)時(shí)刻的網(wǎng)絡(luò)可用帶寬。
1.1.1 前一刻可用帶寬
發(fā)送端對視頻幀進(jìn)行數(shù)據(jù)封裝后作為計(jì)算可用帶寬的“標(biāo)記幀”,并設(shè)置超時(shí)計(jì)時(shí)器。在不影響網(wǎng)絡(luò)負(fù)載的情況下,統(tǒng)計(jì)接收端接收若干個(gè)“標(biāo)記幀”所需的時(shí)間,計(jì)算出這時(shí)間段的可用帶寬,具體過程如下:
(1)初始化超時(shí)計(jì)時(shí)器。
(2)對一組視頻幀進(jìn)行標(biāo)記,并發(fā)送。
(3)當(dāng)發(fā)送第一個(gè)“標(biāo)記幀”時(shí),啟動(dòng)計(jì)時(shí)器,并繼續(xù)視頻幀的發(fā)送。
(4)在預(yù)定時(shí)間T內(nèi),若收到接收端發(fā)來的接收時(shí)間信息,則復(fù)位計(jì)時(shí)器,并在下一次發(fā)送第一個(gè)“標(biāo)記幀”時(shí)啟動(dòng);若在時(shí)間T內(nèi)未收到可用帶寬的回復(fù)包,則做超時(shí)計(jì)數(shù),并復(fù)位超時(shí)計(jì)時(shí)器,返回步驟(2)。
(5)接收端接收到視頻幀后,首先對標(biāo)志位進(jìn)行判斷,記錄有標(biāo)記的視頻幀的數(shù)據(jù)大小。
(6)若視頻幀沒有開始標(biāo)志位,則無需動(dòng)作,繼續(xù)執(zhí)行步驟(5);否則,若出現(xiàn)開始標(biāo)志位,則記錄起始時(shí)間為time_start并記錄接收到當(dāng)前視頻幀的數(shù)據(jù)大小size1,并繼續(xù)執(zhí)行步驟(5)。直至接收到結(jié)束標(biāo)志的視頻幀時(shí),記錄結(jié)束時(shí)間為time_stop,并記錄數(shù)據(jù)大小為sizen。計(jì)算接收這組幀的時(shí)間間隔
time_gop=time_stop-time_start
(1)
根據(jù)記錄的每個(gè)視頻幀的大小,有
size=size1+size2+…+sizei+…+sizen
(2)
根據(jù)式(1)和式(2),有
Bti=size/time_gop
(3)
式中:Bti則為可用帶寬的數(shù)值。
(7)接收端將計(jì)算出來的可用帶寬值發(fā)送至發(fā)送端。
1.1.2 預(yù)測帶寬
為了檢驗(yàn)網(wǎng)絡(luò)的可用帶寬確實(shí)服從正態(tài)分布,本文通過利用Python語言及其相應(yīng)的庫,結(jié)合反復(fù)取樣的可用帶寬值,對可用帶寬的正態(tài)性進(jìn)行檢驗(yàn),得出網(wǎng)絡(luò)的可用帶寬近似服從一個(gè)數(shù)學(xué)期望為μ、標(biāo)準(zhǔn)方差為σ2的正態(tài)分布,記為X~N(μ,σ2)。其概率密度函數(shù)如式(4)所示
(4)
通過k次前一刻可用帶寬的計(jì)算,得到k個(gè)可用帶寬值(Bt1、Bt2、……、Btk),并利用可用帶寬具有正態(tài)分布的特性,推算出數(shù)學(xué)期望和標(biāo)準(zhǔn)方差,將其帶入式(4)中,即可得到一個(gè)關(guān)于可用帶寬的概率密度函數(shù),并得可用帶寬的預(yù)測區(qū)間分布概率,見表1。
表1 不同區(qū)間的分布概率
首先計(jì)算前N個(gè)時(shí)段的網(wǎng)絡(luò)帶寬作為參考值,獲得正態(tài)分布的參數(shù)μ和σ,從而獲得帶寬的概率密度函數(shù)。然后按實(shí)際需求確定帶寬可能出現(xiàn)的范圍,如當(dāng)帶寬區(qū)間為(μk-2.58σk,μk+2.58σk)時(shí),其出現(xiàn)的概率為99%。之后每獲取一次網(wǎng)絡(luò)帶寬值則更新一次密度函數(shù)的μ和σ值,但考慮到網(wǎng)絡(luò)的突變等特性,所以需加入一些限制條件。具體過程如圖1所示。
圖1 預(yù)測可用帶寬流程
從流程圖可知,在具有N個(gè)帶寬值的前提下,計(jì)算出概率密度函數(shù)并獲得預(yù)測區(qū)間。每次計(jì)算網(wǎng)絡(luò)帶寬都會(huì)與前一次的預(yù)測范圍做對比。若如果連續(xù)超過D次帶寬值在預(yù)測范圍之外,則將N個(gè)參考值歸零,并重新計(jì)算N個(gè)帶寬值;否則,將用該帶寬值更新原有的參數(shù)μ和σ。
根據(jù)上述的帶寬概率密度函數(shù),本文提出一種按需計(jì)算可用帶寬區(qū)間且加入源端實(shí)際幀率作為補(bǔ)償因子的幀層碼率控制算法。通過補(bǔ)償因子的引入,可有效地避免了碼率切換太頻繁或因臨界點(diǎn)的問題導(dǎo)致錯(cuò)誤切換的問題。
TCP是一種面向連接的、可靠的、字節(jié)流的傳輸協(xié)議,許多視頻傳輸?shù)膽?yīng)用傳輸協(xié)議都是基于TCP協(xié)議,如HTTP協(xié)議。在傳輸層中存在發(fā)送和接收緩沖區(qū),應(yīng)用層使用套接字接口時(shí),把數(shù)據(jù)放入傳輸層相應(yīng)的緩沖區(qū)中,而如何發(fā)送和接收則取決于協(xié)議的傳輸算法。本文在源端以阻塞方式使用套接字,在網(wǎng)絡(luò)良好且接收端應(yīng)用層處理接收緩存的速度足夠快的時(shí)候,源端基本能按照默認(rèn)的幀率進(jìn)行視頻流的傳輸。但在網(wǎng)絡(luò)擁塞時(shí),由于發(fā)送緩沖的數(shù)據(jù)未能及時(shí)發(fā)送到接收端,緩沖區(qū)剩余的長度不足夠存放新的數(shù)據(jù),從而導(dǎo)致源端阻塞等待直至緩沖區(qū)剩余的大小大于需要存放的數(shù)據(jù)大小。所以在網(wǎng)絡(luò)不良時(shí),源端發(fā)送視頻幀的速率(文后或稱其為實(shí)際幀率)會(huì)減小。通過計(jì)算默認(rèn)幀率與實(shí)際幀率的差值,可以反映出當(dāng)前網(wǎng)絡(luò)環(huán)境的狀態(tài)。
設(shè)在某段時(shí)間S秒內(nèi),源端發(fā)送了X幀的視頻數(shù)據(jù),則在S秒內(nèi)的平均發(fā)送視頻幀的速率Y為
Y=X/S
(5)
設(shè)默認(rèn)幀率為Z,則默認(rèn)幀率和實(shí)際幀率的差值為
DIF=Z-Y
(6)
本文提出的碼率控制策略引入了默認(rèn)幀率和實(shí)際幀率之間的差值與預(yù)測的可用帶寬區(qū)間這兩個(gè)因子,通過對這兩個(gè)因子的限制,對幀層獲得的QP值與最高碼率值進(jìn)行再次調(diào)整,達(dá)到控制碼率的作用,以獲得適合當(dāng)前網(wǎng)絡(luò)環(huán)境的碼率。
具體的控制策略闡述如下:若連續(xù)出現(xiàn)P次默認(rèn)幀率和實(shí)際幀率之間的差值大于M值(M值為判斷視頻流暢度的一個(gè)閾值)與當(dāng)前實(shí)際碼率大于預(yù)測區(qū)間的中間值band_mid,則表明每秒發(fā)送的幀數(shù)過少且網(wǎng)絡(luò)帶寬不足,接收端未能取到足夠的視頻幀進(jìn)行播放。此時(shí)上調(diào)當(dāng)前幀的QP值和限制最高碼率值以減少輸出碼率的大小。當(dāng)默認(rèn)幀率與實(shí)際幀率的差值不大于M值,此時(shí)進(jìn)入?yún)^(qū)間判斷的過程。若當(dāng)前碼率處于預(yù)測區(qū)間范圍內(nèi)時(shí),表明當(dāng)前碼率可以適用于當(dāng)前可用帶寬且實(shí)際幀率足以讓接收端流暢播放視頻,故不進(jìn)行碼率調(diào)整。若當(dāng)前碼率小于預(yù)測區(qū)間的左邊界并且默認(rèn)幀率與實(shí)際幀率的差值不大于M值,表明有足夠的可用帶寬,此時(shí)下調(diào)當(dāng)前幀的QP值和增加最高碼率值以增加輸出碼率的大小,使得視頻播放質(zhì)量更好。
碼率控制策略的實(shí)現(xiàn)過程如下:
(1)通過上述預(yù)測可用帶寬的算法,可獲得下一個(gè)時(shí)刻可用帶寬的預(yù)測區(qū)間[band_left,band_right]。并且根據(jù)已編碼的視頻幀,得到一個(gè)有關(guān)當(dāng)前幀的輸出碼率real_bit,從而可計(jì)算當(dāng)前碼率處于預(yù)測區(qū)間的位置。
(2)通過源端實(shí)際幀率計(jì)算方法,獲得當(dāng)前實(shí)際的幀率real_FPS。再通過獲得默認(rèn)的幀率def_FPS,并計(jì)算出默認(rèn)幀率和當(dāng)前實(shí)際幀率的差值diff_FPS。且碼率調(diào)整的具體流程如圖2所示。
測試環(huán)境的總體方案如圖3所示,圖中的網(wǎng)絡(luò)攝像機(jī)(IP Camera)采用的是華為海思的系統(tǒng)級芯片Hi3518V200,其集成了新一代的H.264編碼器,并且可通過有線或無線網(wǎng)絡(luò)進(jìn)行視頻幀的傳輸。一臺PC通過4G無線路由器接入中國聯(lián)通無線網(wǎng)絡(luò)從而接入Internet;IPC則通過有線接入本地局域網(wǎng)并將其IP映射到外網(wǎng),從而接入Internet,并把視頻數(shù)據(jù)傳輸?shù)骄哂?G網(wǎng)絡(luò)的PC上進(jìn)行播放。
首先IPC的VENC模塊從外存中讀取原始圖像后,運(yùn)行本文所提出的碼率控制策略。根據(jù)計(jì)算的結(jié)果,使用碼率控制器對編碼參數(shù)進(jìn)行調(diào)整,再經(jīng)過編碼器(Encoder)進(jìn)行H.264編碼處理,并把編碼后的視頻幀通過網(wǎng)絡(luò)傳輸?shù)絇C端。測試時(shí),使用另一臺PC接入IPC所在的局域網(wǎng),并通過掛載網(wǎng)絡(luò)文件系統(tǒng)(NFS)的方式獲得所需的測試數(shù)據(jù),并將其繪制成圖表。兩臺IPC設(shè)置相同的編碼參數(shù),如表2所示列舉了幾個(gè)重要的編碼參數(shù)。
在傳統(tǒng)的根據(jù)帶寬情況調(diào)整碼率的視頻傳輸控制策略中,大多通過探測的方式獲取當(dāng)前帶寬情況,再根據(jù)探測情況來調(diào)整碼率[3]。當(dāng)帶寬充足時(shí),提高視頻碼率;當(dāng)帶寬不足時(shí),則減小視頻碼率。因有不同的方式調(diào)整視頻碼率,為了更準(zhǔn)確地測試出二者的區(qū)別,本文統(tǒng)一采用調(diào)整QP值的方式調(diào)整碼率。同時(shí),為了便于觀察碼率切換的情況,設(shè)置15個(gè)切換等級,每個(gè)等級對應(yīng)一個(gè)QP值和對應(yīng)一個(gè)最高碼率值,如初始等級為0對應(yīng)的初始QP值為22以及最高碼率值為2048,等級為1對應(yīng)的QP值為23和最高碼率值為1800,以此類推。
實(shí)驗(yàn)時(shí),將兩臺用做對比的IPC盡量朝向同一區(qū)域(區(qū)域內(nèi)放置一個(gè)勻速擺動(dòng)的搖擺器),并盡可能設(shè)置在相同的網(wǎng)絡(luò)環(huán)境中。同時(shí),利用軟件對兩臺IPC實(shí)施網(wǎng)絡(luò)限速,使得視頻發(fā)送的帶寬發(fā)生變化。經(jīng)多次重復(fù)測試的結(jié)果表明,兩臺IPC在網(wǎng)絡(luò)帶寬充足的情況下,沒有明顯的區(qū)別;但在網(wǎng)絡(luò)情況一般和較差的情況下,使用本文算法的IPC所傳輸?shù)絇C中顯示的播放畫面流暢度具有明顯的優(yōu)勢。以下通過限制網(wǎng)速的方式,使得碼率出現(xiàn)的上調(diào)、下降和不變的情況,從而獲得需要對比的數(shù)據(jù)。
3.2.1 向上切換
首先各分配相同且足夠的帶寬給兩臺IPC,使其可以平穩(wěn)地進(jìn)行數(shù)據(jù)傳輸。然后降低相同大小的網(wǎng)絡(luò)帶寬,使其不能滿足當(dāng)前的視頻碼率,從而發(fā)生碼率下降。如圖4所示為兩種方法對帶寬減少的處理過程,在t1時(shí)刻降低網(wǎng)絡(luò)帶寬時(shí),本文方法判斷默認(rèn)幀率與當(dāng)前幀率之差大于M,并且碼率值大于預(yù)測區(qū)間的中間值,所以下降一級碼率。在下降后又經(jīng)判斷,差值仍然過大且碼率值大于預(yù)測區(qū)間,故繼續(xù)下降一級碼率,在t5時(shí)刻停在i2處,碼率基本滿足當(dāng)前網(wǎng)絡(luò)帶寬情況。而在采用傳統(tǒng)方法時(shí),t2時(shí)刻檢測到當(dāng)前的帶寬下降后,進(jìn)行碼率的下降。但在t3時(shí)刻時(shí),出現(xiàn)切換等級下降然后在t4時(shí)刻又繼續(xù)上升的現(xiàn)象,最后在t6時(shí)刻停留在i1,并且比本文方法增加了約39.8%的切換時(shí)間,而且播放畫面有一定程度的卡頓現(xiàn)象。在多次測試的過程中,還會(huì)出現(xiàn)另一種現(xiàn)象:兩種方法經(jīng)過碼率調(diào)整后都可以流暢播放,但此時(shí)傳統(tǒng)方法的碼率值低于本文方法的碼率值,造成帶寬的浪費(fèi)。
3.2.2 向下切換
使兩臺IPC處于較低的帶寬環(huán)境并調(diào)試至其都在同一個(gè)切換等級且能穩(wěn)定傳輸時(shí),上升相同大小的帶寬值,使得視頻傳輸可用的帶寬變大。如圖5所示,本文方法從t1時(shí)刻至t3時(shí)刻快速流暢的切換至合適當(dāng)前帶寬的碼率值。而傳統(tǒng)方式的切換在t2時(shí)刻依然出現(xiàn)來回切換的問題,并且最后穩(wěn)定在i1上。
3.2.3 碼率變化情況及分析
圖4 向上切換的等級與幀率差值比較
圖5 向下切換的等級與幀率差值比較
在幾個(gè)不同時(shí)刻同時(shí)增加或減少兩臺IPC的網(wǎng)絡(luò)帶寬,觀察其碼率變化并將具體的碼率值繪制曲線圖,如圖6所示。在t1和t2時(shí)刻左右同時(shí)下降同樣數(shù)值的帶寬,并在15 s和45 s左右同時(shí)上升同樣數(shù)值的帶寬。通過觀察可得,本文方法快速流暢地下降或上升到合適當(dāng)前帶寬的碼率值,帶寬利用率提高約22.7%,并且能進(jìn)行流暢的數(shù)據(jù)傳輸;而傳統(tǒng)的方法則在下降和上升帶寬的時(shí)間間隔里還未完成合適的碼率切換,并且在切換中碼率出現(xiàn)了來回切換的現(xiàn)象。
通過上述測試情景的比較分析,本文方法在相似網(wǎng)絡(luò)環(huán)境、相同時(shí)間內(nèi),不僅能快速流暢地將碼率切換至合適當(dāng)前帶寬的數(shù)值而且能充分利用當(dāng)前可用帶寬,并且實(shí)際幀率變化小,視頻播放流暢。
本文提出了一種基于預(yù)測可用網(wǎng)絡(luò)帶寬的自適應(yīng)流媒體傳輸策略,在不增加網(wǎng)絡(luò)負(fù)載的前提下準(zhǔn)確地計(jì)算出下一個(gè)時(shí)刻可用帶寬的范圍,并計(jì)算默認(rèn)幀率與實(shí)際幀率之間的差值來反應(yīng)目前視頻幀的傳輸情況。通過這兩個(gè)因子設(shè)計(jì)出碼率調(diào)整策略,從而判斷何時(shí)需要上調(diào)或下調(diào)視頻碼率,最終實(shí)現(xiàn)視頻碼率隨網(wǎng)絡(luò)帶寬的波動(dòng)而自適應(yīng)地進(jìn)行調(diào)整。實(shí)驗(yàn)結(jié)果表明,該控制策略能充分地利用當(dāng)前的網(wǎng)絡(luò)帶寬,在保證視頻傳輸流暢性基礎(chǔ)上,提供更加清晰的播放效果。