RTP封包

RTP包结构-TCP

TCP_HEADER 4 bytes
RTP_HEADER 12 bytes
H264_FU_HEADER 2 bytes(H265_FU_HEADER 3 bytes)

TCP_HEADER:

header [0]  = 0x24;                   /* 1 byte for '$'      */
header [1]  = rtspStream->ClientPort; /* Channel identifier  */
header [2]  = (0xff00 & (SendSize+DataSize - TCP_HEADER_SIZE)) >> 8;/* Packet size MSB */
header [3]  = 0x00ff & (SendSize+DataSize - TCP_HEADER_SIZE);    /* Packet size LSB      */

RTP_HEADER

*(header + 0 + TCP_HEADER)  = 0x80;		//extension bit, 扩展header,没有扩展则为0x80,有扩展为0x90
*(header + 1 + TCP_HEADER)  = PlayLoadNumber | (FrameEnd << 7);
*(header + 2 + TCP_HEADER)  = (rtspStream->StreamSeqNo & 0xff00) >> 8;
*(header + 3 + TCP_HEADER)  = (rtspStream->StreamSeqNo & 0x00ff);
*(header + 4 + TCP_HEADER)  = (UCHAR)((TimeStamp & 0xff000000) >> 24);
*(header + 5 + TCP_HEADER)  = (UCHAR)((TimeStamp & 0x00ff0000) >> 16);
*(header + 6 + TCP_HEADER)  = (UCHAR)((TimeStamp & 0x0000ff00) >> 8);
*(header + 7 + TCP_HEADER)  = (UCHAR)(TimeStamp & 0x000000ff);
*(header + 8 + TCP_HEADER)  = (UCHAR)((rtspStream->StreamSSRC  & 0xff000000) >> 24);
*(header + 9 + TCP_HEADER)  = (UCHAR)((rtspStream->StreamSSRC  & 0x00ff0000) >> 16);
*(header + 10 + TCP_HEADER) = (UCHAR)((rtspStream->StreamSSRC  & 0x0000ff00) >> 8);
*(header + 11 + TCP_HEADER) = (UCHAR)(rtspStream->StreamSSRC  & 0x000000ff);

H264_FU_HEADER

<mtu,H264_FU_HEADER =0,数据构成为:TCP_HEADER+RTP_HEADER+264data
>mtu,H264_FU_HEADER = 2,数据构成为:TCP_HEADER+RTP_HEADER+H264_FU_HEADER+264data
  H264_FU_HEADER,占用2个字节,并替换H264的nal_type,第一个字节=(nalType & 0x60)|28;
  第二个字节=(start<<7) | (end << 6) | (nalType & 0x1f);
  举例:其中I帧
  7c 85   start
  7c 05   中间帧
  7c 45   end
  P帧
  7c 81   start
  7c 01   中间帧
  7c 41   end
  解析的时候直接覆盖7c,并把第二个字节转换成nal_type

H265_FU_HEADER

<mtu,H265_FU_HEADER =0,数据构成为:TCP_HEADER+RTP_HEADER+265data
>mtu,H265_FU_HEADER = 3,数据构成为:TCP_HEADER+RTP_HEADER+H265_FU_HEADER+265data
	H265_FU_HEADER,占用3个字节,替换H265的nal_type(2个字节比如P帧是02 01 I帧是26 01),第一个字节=49>>1;
	第二个字节=1;第三个字节计算方法 (start<<7) | (end << 6) | iTrd;
	if(start == 1)
	{
		iTrd = (nalType&0x7E)>>1;
	}
	else
	{
		iTrd = (nalType&0x7E);
	}
	举例:其中I帧
	62 01 93   start
	62 01 13   中间帧
	62 01 53   end
	P帧
	62 01 81   start
	62 01 01   中间帧
	62 01 41   end

RTP包结构-UDP

參考tcp的结构,去掉TCP_HEADER

发布了12 篇原创文章 · 获赞 1 · 访问量 5379

猜你喜欢

转载自blog.csdn.net/kakasxin/article/details/103782566
RTP