視音頻數(shù)據(jù)常用RTP格式進(jìn)行封裝捅位,客戶端(數(shù)據(jù)接收方)常常用RTP包頭中的Sequence Number來(lái)判斷是否存在丟包瞭郑。
RTP Header
從RTP Header來(lái)發(fā)現(xiàn)闯捎,Sequence Number是16bit的肖卧,所以運(yùn)行一段時(shí)間后滔迈,會(huì)出現(xiàn)回滾的現(xiàn)象乏盐。即Sequence Number最大的值為0xFFFF, 達(dá)到這個(gè)值之后的,接著從0開(kāi)始接著增加酵紫。
如何計(jì)算不同的RTP包的之間的Sequence Number差值呢?
WORD dwSeqNumber1 = 0xFFFF;
WORD dwSeqNumber2 = 0;
// 16個(gè)字節(jié)可最多表示多少數(shù)字
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;
運(yùn)行結(jié)果:
運(yùn)行結(jié)果
封裝成函數(shù):
__inline int GetSequenceDistance(WORD awSeq1, WORD awSeq2)
{
return (int)(awSeq1 + 65536 - awSeq2) % 65536;
}