网络播放丢包及缓冲的漫谈

编者:李国帅

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.     并不是每次都能成功打开一路视频,允许定时重新连接打开新的播放设备。
     

你可能感兴趣的:(音视频,视频播放,卡顿)