迅達云SpeedyCloud工程副總裁,2010年始涉足云計算行業(yè),至今積累了大量架構(gòu)、研發(fā)、運維、運營、管理等經(jīng)驗,曾就職于Joyent、藍(lán)汛、Yottaa等公司。2013年加入SpeedyCloud迅達云,現(xiàn)在負(fù)責(zé)技術(shù)的總體把控、技術(shù)可行性調(diào)研等工作。
在視頻領(lǐng)域,電影、電視、數(shù)字視頻等可視為隨時間連續(xù)變換的許多張畫面,而幀則指這些畫面當(dāng)中的每一張。不過如果按照如此的方式存儲視頻的話,文件勢必會變得很大,所以需要專門的算法對視頻文件進行編碼。一旦視頻進行編碼之后,得到的文件可以看做是連續(xù)的一組幀的集合,而這一組幀中的每一個都是有自己的類型的。幀的類型分為以下3種:
*Inter Frame(I幀)
*P-Frame(P幀)
*B-Frame(B幀)
對于B幀和P幀來說需找到對應(yīng)的一個或者多個參考幀才能解碼出來(如圖1)。
對于非I幀來說想要進行解碼就需要多個參考幀進行計算,由此引出了Groupof Picture(以下簡稱GoP)的概念。
對于P幀和B幀來說,他們所包含的內(nèi)容可以理解為針對其參考幀的一個patch,也就是一個變化量。
GoP顧名思義就是有一組幀組成的一個序列。Wikipedia上給出的一個圖簡單的解釋了GoP是怎么回事(如圖 2)。
GoP由I幀開始,后面跟隨者一組B幀和P幀,直到下一個I幀之前的幀為一個GoP。了解了GoP之后,就會發(fā)現(xiàn)播放器只有在拿到某個GoP中的I幀之后才能播放視頻。
圖1 B幀和P幀對應(yīng)多個參考幀
GoP到底應(yīng)該設(shè)置多大?那么GoP的大小到底有什么影響呢?
GoP設(shè)置較大時:
好處:由于B幀和P幀的字節(jié)大小會比I幀小很多,所以GoP越長,所包含的B幀和P幀越多,相應(yīng)的壓縮比也會更高,在同樣的碼率下,視頻會更清晰一些。
壞處:對于視頻直播來說,播放器連接到服務(wù)器的時間是不固定的,當(dāng)播放器在GoP中間連接服務(wù)器,并獲取了中間的B幀和P幀,這時播放器是無法對這些幀進行解碼的,需要進行丟棄。所以會導(dǎo)致客戶端的首屏播放時間變長。
GoP設(shè)置較小時:
好處:由于GoP設(shè)置小可以降低I幀間隔時間,對于直播來說可以實現(xiàn)秒開的功能。
壞處:由于GoP時間比較短,會導(dǎo)致I幀的比例增高,壓縮比降低。同樣碼率情況下視頻的質(zhì)量會有所下降。
HLS格式的視頻分為兩個部分。首先,HLS會根據(jù)指定的切片時間和實際的GoP大小對視頻進行切割,并生成.ts文件。其次,HLS會生成一個.m3u8文件來保存這些ts文件的索引。
對于.ts文件的切割來講,并不是告訴直播服務(wù)器指定1秒切一個.ts文件他就能保證1秒切一個.ts文件的。.ts文件的切割還是要根據(jù)直播視頻的實際GoP大小來進行切割的。之前已經(jīng)講過,任何一個視頻流在播放端需要能獲取到完整的GoP才能播放,所以一個.ts文件所實際包含的時間是GoP的整數(shù)倍。
例如:當(dāng)視頻的GoP設(shè)置為1秒,.ts切片時間為2秒時,實際的.ts文件切片所包含的視頻為2秒。當(dāng)視頻的GoP設(shè)置為5秒,.ts切片時間為2妙時,實際的.ts文件切片所包含的視頻為5秒。
圖 2 GoP示意圖
如果視頻流的GoP大小設(shè)置不合適的話,那么HLS的切片時間就會變長,同時也會增加HLS的延遲。這個特性對于HLS直播來講簡直就是延遲殺手。
如果是HLS點播的話,流的GoP設(shè)置過大也會影響點播視頻的加載時間。一般的一個720P的視頻,如果切片時間為2秒的話,單個.ts文件也就是在百K字節(jié)上下。但如果源視頻的GoP很大,會導(dǎo)致第一個.ts文件所包含的視頻時常變長(比如10秒),同時導(dǎo)致.ts文件的大小膨脹到接近1M字節(jié)上下。
RTMP協(xié)議本身也會抽象出一個Packet的概念來封裝H264編碼中的幀,也就是一個Packet會包含1到多個幀,播放器以Packet為單位來進行解碼。那么RTMP的問題在于客戶端連接的時間點是否合適。
例如一個RTMP直播流的GoP設(shè)置為2秒,如果客戶端接入時間剛好是第4秒,那么客戶端會獲取一個包含I幀的Packet,由于I幀是自描述的,所以客戶端可以直接解碼出該幀的畫面并顯示出來。但是當(dāng)客戶端的接入之間為第5秒,那么他會獲得一個包含B幀或者P幀的Packet,由于客戶端拿到的數(shù)據(jù)是一個不完整的GoP,所以客戶端只好拋棄當(dāng)前獲取的Packet中視頻的數(shù)據(jù),而且只有當(dāng)獲取到包含下一個GoP的I幀的Packet時才能解碼出圖像。因此客戶端會等待1秒才能播放出畫面。
由此我們可以得出一個結(jié)論:GoP的大小會影響RTMP播放端的首幀加載時間。
為了優(yōu)化首幀加載時間,我們可以在流媒體服務(wù)器端增加一個緩存,把上一個GoP緩存在內(nèi)存中。如果客戶端接入的話,我們首先放出來的是上一個GoP。這樣客戶端接到的數(shù)據(jù)永遠(yuǎn)是一I幀開頭的數(shù)據(jù)。
在視頻直播和點播盛行的年代,對于GoP大小的取舍還是需要看具體應(yīng)用場景。對于直播來講,對延遲要求敏感的應(yīng)用來說,1~2秒的GoP大小還是比較合適的,至于GoP緩存來講,還是不用為好。如果是對延遲要求不敏感,對首屏播放時間很敏感的應(yīng)用,GoP還是1~2秒最為合適,GoP緩存應(yīng)該是必備的。另外直播使用HLS的話,延遲是絕對PK不過RTMP的。
對于點播的應(yīng)用來說,視頻加載速度是個硬指標(biāo),如果不是HLS格式的話,GoP大小適當(dāng)選大一點可以降低視頻文件大小,提高視頻打開速度。
HLS格式的話,還是推薦在2秒左右,否則很影響視頻打開速度的。
其實視頻直播技術(shù)的挑戰(zhàn)很多,這次分享的只是其中一小部分,也是迅達云SpeedyCloud研發(fā)團隊的經(jīng)驗總結(jié),希望能夠和大家多交流,一起為技術(shù)社區(qū)發(fā)展做些有益的事情。