一种基于编码器的丢帧方法与流程

文档序号:11657750阅读:1219来源:国知局

本发明涉及通信技术领域,尤其涉及一种基于编码器的丢帧方法。



背景技术:

视频直播是指利用互联网及流媒体技术进行直播,视频因融合了图像、文字、声音等丰富元素,声形并茂,效果极佳,逐渐成为互联网的主流表达方式。视频通过真实、生动的传播,营造出强烈的现场感,吸引眼球,达成印象深刻、记忆持久的传播效果。

传统的视频直播由音频源、视频源、aac编码器、h264编码器以及rtmp推流器组成。音频源可以来自dv或者连接设备的其他麦克风,一次读取一帧,包装成一个包,之后发送到aac编码器进行编码。视频源是来自dv或者连接设备的其他相机,捕获相机拍下的图像显示在屏幕上,一次显示一帧,包装成一个包,之后发送到h264编码器进行编码。aac编码器对音频数据进行压缩,以便用更少的带宽传输更多的数据。aac编码器里面有一个待处理的音频帧队列,aac编码器每次从队列中取出一帧进行处理。h264编码器的作用是压缩视频,以便不损失清晰度的情况下,用更少的带宽传输视频数据,h264编码器每次从视频帧队列中取出一帧进行处理。rtmp推流器的作用是将视频帧或者音频帧等数据发送到服务器,rtmp推流器的内部有一个队列,音频帧和视频帧都在这个队列中。

在视频直播的过程中,由于音视频数据产生太快,或编码器编码时间太长而受到cpu和gpu等计算资源的限制,或网络条件不理想,均需要进行丢帧处理。现有的丢帧方法主要针对网络条件不理想而做出丢帧处理,笼统地丢弃全部b帧或p帧,这就造成了接收端视频质量的明显下降。



技术实现要素:

针对上述方案的缺点,本发明提出一种基于编码器的丢帧方法,该方法能够尽可能减小丢帧对音视频播放质量的影响。

本发明技术方案是:一种基于编码器的丢帧方法,包括如下步骤:

s1:判断视频源的输出帧率是否大于实际需要的帧率,如果是,则进行丢帧处理;

s2:判断编码帧率是否大于视频源的输出帧率,如果是,则进行丢帧处理;

s3:根据前推流队列长度与额定推流队列长度,进行丢帧处理。

优选的,步骤s1中,丢帧处理的具体方法为:

s101:在上一时间周期t内,计算视频源内的帧数c,计算其帧率为c/t;

s102:实际需要的帧率是f,计算丢帧率为c/t-f,丢帧占比为=1-f*t/c;

s103:在本时间周期t内的任何时间t内,计算视频源帧数为c,则应该丢帧数为c*(1-f*t/c);

s104:在上一时间周期t内,统计视频源的帧数为cin,输出的帧数为cout,则实际丢帧数为cin–cout;

s105:判断本时间周期t内下一帧到来时是否应该选择丢帧,如果c*(1-f*t/c)>cin-cout,即判断应该丢帧数是否比实际丢帧数大,则应该丢帧,cin数值加1,而cout数值不变;如果c*(1-f*t/c)<=cin-cout,则cin数值加1,而cout加1;

s106:继续重复步骤s105,直到本周期结束,重复开始下一周期。

优选的,步骤s2中,丢帧处理的具体方法为:丢掉编码队列中的除去收尾端的任意一帧。

优选的,步骤s3中,丢帧处理包括:丢非关键视频帧;丢所有视频帧;丢所有视频和音频帧。

优选的,步骤s3中,若当前推流队列长度l>额定推流队列长度*4/5,则丢所有视频和音频帧,清空队列。

优选的,步骤s3中,若当前推流队列长度l>额定推流队列长度*3/4,则丢掉所有视频帧。

优选的,步骤s3中,若当前推流队列长度l>额定推流队列长度*2/3,则丢掉所有非关键视频帧。

优选的,步骤s3中,若当前推流队列长度l>额定推流队列长度*1/2,则丢掉一半非关键视频帧。

本发明的有益效果是:能够对视频源、视频编码以及音视频推送阶段分别进行丢帧处理,尽可能减小丢帧对音视频播放质量的影响。

附图说明

下面结合附图和具体实施方式对本发明作进一步详细的说明。

图1是本发明实施例的整体流程示意图。

具体实施方式

以下结合附图,对本发明的技术方案作进一步的描述,但本发明并不限于这些实施例。

图1是本发明实施例的流程示意图,如图1所示,包括以下步骤:

s1:判断视频源的输出帧率是否大于实际需要的帧率,如果是,则进行丢帧处理。

音视频数据产生太快,浪费大量带宽,但人眼并不觉得更加流畅。例如:视频源产生视频数据的帧率是50帧,而我们需要的帧率为25帧,则需要丢帧。在视频源中的丢帧策略是:计算出该丢的帧的占比,按照占比的队列来行丢帧。具体步骤为:

s101:在上一时间周期t内,计算视频源内的帧数c,计算其帧率为c/t;

s102:实际需要的帧率是f,计算丢帧率为c/t-f,丢帧占比为=1-f*t/c;

s103:在本时间周期t内的任何时间t内,计算视频源帧数为c,则应该丢帧数为c*(1-f*t/c);

s104:在上一时间周期t内,统计视频源的帧数为cin,输出的帧数为cout,则实际丢帧数为cin–cout;

s105:判断本时间周期t内下一帧到来时是否应该选择丢帧,如果c*(1-f*t/c)>cin-cout,即判断应该丢帧数是否比实际丢帧数大,则应该丢帧,cin数值加1,而cout数值不变;如果c*(1-f*t/c)<=cin-cout,则cin数值加1,而cout加1;

s106:继续重复步骤s105,直到本周期结束,重复开始下一周期。

该方法对周期t内的丢帧率以及实际丢帧数进行不断更新。

s2:判断编码帧率是否大于视频源的输出帧率,如果是,则进行丢帧处理。

因为编码器占用cpu资源较多,所以会因为cpu资源不够,编码帧率跟不上视频源输出的帧率,则需要丢帧。还会因为cpu通风不好,过热导致编码效率降低。当cpu性能降低时,为了不影响视频的流畅性,采取随机丢帧策略略。编码队列长度为n,当队列大小为n-1时,产生一个随机数p,p在1到n-1之间,丢掉在p位置上的一帧。

s3:根据前推流队列长度与额定推流队列长度,进行丢帧处理。

到了推流器之后才丢帧,代价是昂贵的,因为到达推流器的帧都进行过了几次丢帧,进行了编码,占用了cpu资源。但在低网速条件下,发送音视频的速度较慢,也只能丢帧。到达推流器的有经过编码之后的视频帧,也有经过编码之后的音频帧。音频帧较小,丢帧解决不了多少问题,音频帧也比较重要,所以丢音频帧不是第一选择,第一选择是丢视频帧。视频帧里面,有关键帧,和非关键帧,如果丢了关键帧,会导致花屏。这时候的丢帧处理包括:丢非关键视频帧;丢所有视频帧;丢所有视频和音频帧。

若当前推流队列长度l>额定推流队列长度*4/5,则丢所有视频和音频帧,清空队列。若当前推流队列长度l>额定推流队列长度*3/4,则丢掉所有视频帧。若当前推流队列长度l>额定推流队列长度*2/3,则丢掉所有非关键视频帧。若当前推流队列长度l>额定推流队列长度*1/2,则丢掉一半非关键视频帧。

根据推流队列长度l与额定推流队列长度进行不同的丢帧处理,尽可能减小丢帧对音视频播放质量的影响。

本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1