網絡播放丟包及緩衝的漫談

編者:李國帥

qq:9611153 微信lgs9611153

時間:2020-6-27 14:00

背景原因:

(紀念曾在2008~2015年間從事播放時開發的歲月)

 

媒體播放會佔用大量的cpu和內存資源。播放少量幾路視頻對於一般的pc機自然毫無障礙,但是如果想要播放幾十路上百路視頻那就有點強人所難了。不過,也不是沒有變通的方法,讓集成播放器根據計算機的能力決定顯示的路數。

 

如果資源分配不足,就會出現許多問題。比如:如果cpu不夠,程序會出現卡頓;但是如果內存處理不當,就會直接導致程序崩潰。

 

首先,我們需要對資源進行分配。對於內存主要是控制每路內存的消耗,對於cpu主要就是儘量的減少各類計算消耗。

特別是CPU資源,如果cpu消耗高了,寧肯丟棄部分幀處理,甚至對於某路視頻直接放棄也要保證系統的穩定。

 

對於內存,我們需要先做一定的規劃。如果打算在4G內存的播放50路,內存又不可能全部用來播放,假如打算使用3G的內存分給播放程序,那麼刨除棧空間,系統空間等用來輔助播放的消耗,3G內存還需要打個折扣,恐怕能夠真正使用的也就2G。因此每路播放整個播放路徑估計也就2G/50=40M。

40M看起來也不少,但是要考慮到這是單路播放整個需要的內存,包括了網絡緩衝,解碼緩衝,可能還有轉碼緩衝,播放緩衝,如果有錄像可能還需要錄像緩衝。每個環節都需要內存,並且它們之間還需要同步,一旦阻塞就可能會出現丟包,甚至程序出錯。

對於每一路視頻在接收,解碼,播放等各個環節對於分配給自己的內存都要使用堆的形式進行處理。

預先申請大內存,可以避免重複的申請內存造成形成內存碎片,從而影響內存存儲效率;並且避免自己的空間被系統或其他播放線程使用而造成內存使用混亂,讓內存管理更加清晰可控。

 

下游的播放環節依賴於顯卡,不管使用哪種技術(directdraw,vmr,evr),不管是否使用硬件加速,一般說來不會造成卡頓。如果選用不當最多會出現顯示異常。

 

解碼能力,網絡能力是造成卡頓的主要原因。以前做個的項目中,在網絡緩衝環節每路視頻分配了4M內存,幀率15,關鍵幀間隔2秒,最大幀600K,期望存個50幀左右,大概也就3秒鐘左右。基本上能夠保證不丟D1的關鍵幀,從攝像頭獲取的視頻使用H264進行編碼。


卡頓主要還是資源不足引起的,爲了避免軟件出現卡頓或者內存申請失敗,基本上是按照這麼個步驟進行處理的:

  1.     開啓播放之前判斷內存cpu狀態,以及接收堆內存是否申請成功,決定開啓碼率更低的視頻,甚至暫不開啓。
  2.     判斷網絡緩衝確定是否將新數據存儲緩衝。
  3.     判斷解碼是否成功,決定是否剩下的非關鍵幀
  4.     並不是每次都能成功打開一路視頻,允許定時重新連接打開新的播放設備。
     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章