最近接到一个工作,为视频会议的视频编码增加一种VP8格式。整个流程包括VP8的编码,封包,发送,接收,解包,解码。在学习这一部分的代码时,注意到两个细节:一,对于压缩后大于1000字节的视频数据进行了拆包,既把较大的视频数据封装成多个RTP包进行发送。二,视频数据并不是拆包后立即发出,而是进入一个队列,根据一定条件进行等待后再发出。
那么,为什么要进行这两个处理呢?
背景
视频数据的特征
观察项目中的音频数据,是并没有这两个处理的。那么音频和视频有什么不同呢?
音频数据是每20ms得到一帧数据,每一帧比较小。以48000K,单声道为例,48000 * 20 / 1000,也就960个采样,每个采样16位,也就1920字节,经过压缩,肯定是小于1000字节的。
而视频数据不同,视频的数据量远远大于音频(几十甚至上百倍),特别是关键帧,一帧数据压缩后依然非常大。也就是一瞬间,会产生大量的数据待发。
RTP通常是基于UDP的
另一方面,RTP(实时传输协议)虽然可以基于不同的网络,但为了提高实时性,还是基于UDP为多。我们项目中,就是基于UDP发送的。UDP是一个无连接,不保障的网络协议。
原因解析
为什么需要拆包
UDP能接受的最大包,大约是64K左右。如果向UDP发送一个大包,会在下层自动拆分成多个包ÿ