在这里,视频丢帧是指在编码结束到网络传输这个过程中主动丢弃一部分非关键数据,减少视频数据量,减轻网络负载,降低实时视频延迟。

一、H.264一些知识

    丢弃数据要保证不会引起数据错误,不会造成错误的扩散,在这里先链接一些H.264的知识,参考I、P、N帧的说明,以及H.264视频码流说明。

二、关键帧

    在这里,我使用了MediaCodec进行H.264视频编码,在MediaCodec中可以设置关键帧间隔,如下图

libavformat demuxer丢帧 enlisted丢帧_H264

大概意思就是说这是一个描述了关键帧之间间隔的参数,单位是秒,但是并不能保证这个值起作用。。。。

三、丢弃数据的推测

    1、直接按照时间间隔丢弃比如123456789,直接丢掉2468帧。看了之前的H.246基础的知识的,应该都会直接pass掉这种方法了吧。

123456789,假如红色部分标注为关键帧,那么将12345帧全部删除,在关键帧间隔固定可控的情况下,此时似乎满足我们的需要,只是此时会出现明显卡顿,出现一闪而过的现象。

    3、根据帧重要性判断。判断每一帧数据的重要性,此处可以参考万方的,百度文库的,二者应该相同,但是对于我们一般开发者来说,代价太大,比如我就不想管编码器的事情。

    4、降低码率,手动调整编码器输出码率。

四、编码器输出关键帧的推测

    编码的第一帧必定为关键帧,再之后编码器会进行帧间预测,确定是否需要新的关键帧,推测关键帧应该是根据运动矢量决定,假若视频中画面位移矢量较大,那么关键帧的间隔肯定会缩短,若画面长时间静止不动,那么关键帧的间隔必然变大。关于H.264的编码原理看这里。