视音频数据常用RTP格式进行封装,客户端(数据接收方)常常用RTP包头中的Sequence Number来判断是否存在丢包。
从RTP Header来发现,Sequence Number是16bit的,所以运行一段时间后,会出现回滚的现象。即Sequence Number最大的值为0xFFFF, 达到这个值之后的,接着从0开始接着增加。
如何计算不同的RTP包的之间的Sequence Number差值呢?
WORD dwSeqNumber1 = 0xFFFF;
WORD dwSeqNumber2 = 0;
// 16个字节可最多表示多少数字
const int MAX_SEQ_NUMBER = 0xFFFF + 1;
int nDistance = (int)(dwSeqNumber2 + MAX_SEQ_NUMBER - dwSeqNumber1) % MAX_SEQ_NUMBER;
printf("The distance between dwSeqNumber2:%u and dwSeqNumber1:%u is %d",
dwSeqNumber2, dwSeqNumber1, nDistance);
注:
typedef unsigned short WORD;
运行结果:
封装成函数:
__inline int GetSequenceDistance(WORD awSeq1, WORD awSeq2)
{
return (int)(awSeq1 + 65536 - awSeq2) % 65536;
}