視頻就是一個快速連續播放的圖片, 當每秒播放的速度足夠快時,人眼就會覺得圖片是“動”的(要求>24幀/秒)。隨時間連續變換的多張畫面中每張畫面就叫一幀,如果把這些幀數據轉換成圖片文件并按順序排列就是一個視頻文件。如果把這個視頻文件在網絡上進行傳輸,那么數據必然就很大并且相鄰的幀有需要重復的地方,所以有人就專門寫了些算法對視頻文件進行編碼,常見的就是H.264編碼,H.264編碼將保留一張基本幀,其他的幀只是記錄差別的地方。
在H.264編碼中,得到的文件可以看做是連續的一組幀的集合,在這組幀當中,通常第一幀就是記錄基本畫面,是最重要的一幀數據,叫做I幀(Inter Frame),其他的幀數據是P幀(P-Frame)或B幀(B幀),P幀和B幀需要參考其他的幀數據才能還原畫面。
所以獲得I幀數據就可以進行播放了,從I幀數據開始到下個I幀數據之前所有的數據就一個GOP,即一個幀數據組。當我們看一個直播時通常會希望點開直播就能看到畫面,即所謂的秒開,一般秒開的實現是拿到I幀就立馬進行顯示的。但是對于觀看直播的用戶來將進入直播間的時間是隨機的,也許進來時剛好請求到I幀,立馬可以拿到I幀, 也許進來時剛好I幀結束,那么他就需要等一個GOP時間之后才能拿到下組的I幀進行觀看。這就產生了一個問題,GOP時間到底需要設置多長才合理?以及Gop的大小對直播到底有什么影響?
我們知道Gop時長就是指的2個I幀之間的時間差,一個Gop組中只有一個I幀。
如果Gop時間設置比較大時,顯然B幀和P幀會有很多,則其對于的壓縮比就比較高了,所耗費的流量就相對較小。但這樣做的話,對于在I幀結束后進入直播間的用戶來將就需要等待比較久的時間,等待時間就比較久了,達不到秒開的效果。
如果 GoP設置比較小時,由于GoP設置小可以降低I幀間隔時間,對于直播來說可以實現秒開的功能。但是由于GoP時間比較短,會導致I幀的比例增高,壓縮比降低。同樣碼率情況下視頻的質量會有所下降。數據流量也比較大了。
一般來講Gop一般會設置為1-2秒比較合適。
上面講到的秒開是針對客戶端進行的一些設置, 對應服務器端也可以做些配置來實現秒開。在服務器端一般可以設置Gop緩存,即在服務器上保存上一個Gop組數據,當用戶進入直播間時,立即拿到上一個Gop的I幀,這樣客戶端進入直播間的瞬間永遠是I幀開頭的數據,從而達到秒開。但是這種方案對于延遲要求比較高的場景不不適合了,畢竟拿到的是上一Gop的I幀,這就會增加了一個延遲,而且這個延遲和Gop大小有關。
所以如果要實時性的話,還是只能通過減少關鍵幀間隔來進行優化了。