针对H264 做如下PS封装:每个IDR NALU 前一般都会包含SPSPPSNALU,因此将SPSPPSIDR NALU封装为一个PS 包,包括ps 头,然后加上PSsystem headerPS systemmapPES header+h264 raw data。所以一个IDR NALU PS 包由外到内顺序是:PSheader|PS system header | PS system Map | PES header | h264 raw data。对于其它非关键帧的PS 包,就简单多了,直接加上PS头和PES头就可以了。顺序为:PS header | PES header | h264rawdata。以上是对只有视频video 的情况,如果要把音频Audio也打包进PS封装,也可以。当有音频数据时,将数据加上PES header 放到视频PES 后就可以了。顺序如下:PS =PS|PES(video)|PES(audio),再用RTP 封装发送就可以了。

        GB28181 RTP 传输的数据负载类型有规定(参考GB28181 附录B),负载类型中96-127

        RFC2250 建议96 表示PS封装,建议97 MPEG-4,建议98H264

        即我们接收到的RTP 包首先需要判断负载类型,若负载类型为96,则采用PS解复用,将音视频分开解码。若负载类型为98,直接按照H264 的解码类型解码。

       注:此方法不一定准确,取决于打包格式是否标准

PS 包中的流类型(stream type)的取值如下:

1)        MPEG-4视频流: 0x10

2)        H.264视频流: 0x1B

3)        SVAC视频流: 0x80

4)        G.711音频流: 0x90

5)        G.722.1音频流: 0x92

6)        G.723.1音频流: 0x93

7)        G.729音频流: 0x99

8)       SVAC音频流: 0x9B


12位是RTP Header,这里不再赘述;


PS包头

[0..3]  Pack startcode:包起始码字段,值为0x000001BA的位串,用来标志一个包的开始。


接下来的9位包括了SCRSCREMUXRate


[4..12]   Systemclock reference basesystem clockreference extenstion:系统时钟参考字段。


最后一位reserved是保留位(0xf8),以及是否有填充字节


[13]  Packstuffing length :包填充长度字段,3位整数,规定该字段后填充字节的个数



系统标题

接下来的00 00 01 bb是系统标题起始码;

接下来的00 0c说明了系统标题的长度(不包括起始码和长度字节本身);

接下来的12个字节是系统标题的具体内容,这里不做解析;


节目映射流

继续看到00 00 01 bc,这是节目映射流起始码;

紧接着的00 1e同样代表长度;

跳过e1 ff,基本没用;

接下来是00 18,代表基本流长度,说明了后面还有24个字节;

接下来的1b,意思是H264编码格式;

下一个字节e0,意思是视频流;

接下里00 0c,同样代表接下的长度12个字节;

跳过这12个字节,看到90,这是G.711音频格式;

下一个字节是c0,代表音频流;

接下来的00 00同样代表长度,这里是0

接下来4个字节是CRC,循环冗余校验。


PES分组头部

1)        Packetstart code prefix:值为0x000001的位串,它和后面的stream id 构成了标识分组开始的分组起始码,用来标志一个包的开始。

2)        Streamid:在节目流中,它规定了基本流的号码和类型。0x(C0~DF)指音频,0x(E0~EF)为视频

3)        PESpacket length16 位字段,指出了PES 分组中跟在该字段后的字节数目。值为0 表示PES分组长度要么没有规定要么没有限制。这种情况只允许出现在有效负载包含来源于传输流分组中某个视频基本流的字节的PES 分组中。

4)        PTS_DTS2 位字段。当值为'10'时,PTS 字段应出现在PES分组标题中;当值为'11'时,PTS 字段和DTS字段都应出现在PES 分组标题中;当值为'00'时,PTS字段和DTS 字段都不出现在PES分组标题中。值'01'是不允许的。

5)        ESCR1位。置'1'时表示ESCR 基础和扩展字段出现在PES 分组标题中;值为'0'表示没有ESCR 字段。

6)        ESrate1 位。置'1'时表示ES rate 字段出现在PES分组标题中;值为'0'表示没有ES rate 字段。

7)        DSMtrickmode1 位。置'1'时表示有8位特技方式字段;值为'0'表示没有该字段。

8)        Additionalinfo1 位。附加版权信息标志字段。置'1'时表示有附加拷贝信息字段;值为'0'表示没有该字段。

9)        CRC1 位。置'1'时表示CRC 字段出现在PES分组标题中;值为'0'表示没有该字段。

10)    Extensionflag1 位标志。置'1'时表示PES 分组标题中有扩展字段;值为'0'表示没有该字段。

PES header data length 8 位。PES标题数据长度字段。指出包含在PES 分组标题中的可选字段和任何填充字节所占用的总字节数。该字段之前的字节指出了有无可选字段。