[英]RTP sequence extract
RTP数据包由12字节的RTP报头和后续的RTP有效负载组成。报头的第3个和第4个字节包含RTP数据包序列号的最高有效字节和最低有效字节Seq Num =(MSB < <8)+ LSB
char pszPacket [12];
...
long lSeq = ???? -如何从数据包中获取序列号?
unsigned short seq = (packet[2] << 8) | packet[3];
肯定就是“ long lSeq =(unsigned char)(pszPacket [2] << 8)|(unsigned char)pszPacket [3];”吗?
如果您需要适当的实现:
typedef struct _RTPHeader
{
//first byte
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
unsigned int CC:4; /* CC field */
unsigned int X:1; /* X field */
unsigned int P:1; /* padding flag */
unsigned int version:2;
#elif G_BYTE_ORDER == G_BIG_ENDIAN
unsigned int version:2;
unsigned int P:1; /* padding flag */
unsigned int X:1; /* X field */
unsigned int CC:4; /* CC field*/
#else
#error "G_BYTE_ORDER should be big or little endian."
#endif
//second byte
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
unsigned int PT:7; /* PT field */
unsigned int M:1; /* M field */
#elif G_BYTE_ORDER == G_BIG_ENDIAN
unsigned int M:1; /* M field */
unsigned int PT:7; /* PT field */
#else
#error "G_BYTE_ORDER should be big or little endian."
#endif
guint16 seq_num; /* length of the recovery */
guint32 TS; /* Timestamp */
guint32 ssrc;
} RTPHeader; //12 bytes
您可以做的是:
char pszPacket[12];
RTPHeader* myRTPPacket = (RTPHeader*) pszPacket;
printf("Sequence number is: %hu", myRTPPacket->seq_num;
unsigned __int16 seq = _rotr16( *( unsigned __int16* )&packet[2] , 8 );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.