這個問題要從三方面考慮:
1.協議的選擇
直播一般使用三種協議:自定義的基於udp的私有協議,rtmp協議,hls/dash。從協議本身來說,自定義的基於udp的私有協議因為是基於udp的,延遲最少。rtmp是基於tcp的,延遲比第一種多一些。hls/dash是由ts或者fmp4的切片組成,按照傳統的做法,server需要將一個切片準備好再放到伺服器,不考慮其他的因素,延遲至少是一個切片的時長。
2.伺服器端
對於私有協議和rtmp來說,由於直播的切入點是任何時刻,並不能保證這個時刻就是一個gop的開始。gop設定得越小延遲越小,但是很小的gop又會使得關鍵幀數增多,增加了頻寬,所以這裡需要取得一個平衡。同時,伺服器端和cdn儘量保證快取buffer小,這樣保證播放器端一開始拿到的就是最新的內容。
對於hls和dash來說,現在有一種方法是使用多chunk的切片,比如一個切片是2s,一共有4個chunk,每個chunk 500ms,當一個chunk編碼完成時服務端即可用上傳伺服器並更新manifest,這樣客戶端就可以提前1500ms去下載切片。
3.播放器端
在直播過程中有開始播放延時和直播中延時。對於開始播放延時,可以做一些預處理,比如提前做好dns解析並選取最優cdn。對於hls和dash來說,需要使用partial download和partial parser儘快出幀。對於直播中的延時,需要監控播放器端的buffer,當其大於一個閾值時啟動低倍數播放,儘快消耗播放器端的buffer,使其儘快播放最新的內容。當buffer低於這個閾值時恢復正常速度播放。
這個問題要從三方面考慮:
1.協議的選擇
直播一般使用三種協議:自定義的基於udp的私有協議,rtmp協議,hls/dash。從協議本身來說,自定義的基於udp的私有協議因為是基於udp的,延遲最少。rtmp是基於tcp的,延遲比第一種多一些。hls/dash是由ts或者fmp4的切片組成,按照傳統的做法,server需要將一個切片準備好再放到伺服器,不考慮其他的因素,延遲至少是一個切片的時長。
2.伺服器端
對於私有協議和rtmp來說,由於直播的切入點是任何時刻,並不能保證這個時刻就是一個gop的開始。gop設定得越小延遲越小,但是很小的gop又會使得關鍵幀數增多,增加了頻寬,所以這裡需要取得一個平衡。同時,伺服器端和cdn儘量保證快取buffer小,這樣保證播放器端一開始拿到的就是最新的內容。
對於hls和dash來說,現在有一種方法是使用多chunk的切片,比如一個切片是2s,一共有4個chunk,每個chunk 500ms,當一個chunk編碼完成時服務端即可用上傳伺服器並更新manifest,這樣客戶端就可以提前1500ms去下載切片。
3.播放器端
在直播過程中有開始播放延時和直播中延時。對於開始播放延時,可以做一些預處理,比如提前做好dns解析並選取最優cdn。對於hls和dash來說,需要使用partial download和partial parser儘快出幀。對於直播中的延時,需要監控播放器端的buffer,當其大於一個閾值時啟動低倍數播放,儘快消耗播放器端的buffer,使其儘快播放最新的內容。當buffer低於這個閾值時恢復正常速度播放。