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