欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

RTP协议全解析(H264码流和PS流)-3.4、PES分组头部

最编程 2024-01-31 08:21:52
...

                                                         图9

别被这么长的图吓到,其实原理相同,但是,你必须处理其中的每一位。

 

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

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

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

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

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

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

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

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

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

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

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

 

老规矩,上码流:

 

00 00 01 e0 21 33 80 80 05 2b 5f df 5c 95 71 84 ...?!3€€.+_?\?q?

aa e4 e9 e9 ec 40 cc17 e0 68 7b 23 f6 89 df 90 ?????@?.?h{#????

a9d4 be 74 b9 67 ad 34 6d f0 92 0d 5a 48 dd 13 ???t?g?4m??.ZH?.

 

00 00 01是起始码;

e0是视频流;

21 33 是帧长度;

接下来的两个80 80见下面的二进制解析;

下一个字节05指出了可选字段的长度,前一字节指出了有无可选字段;

接下来的5字节是PTS;

第7、8字节的二进制如下:

1000 0000 1000 0000

按顺序解析:

第7个字节:

10                         是标志位,必须是10;

00                         是加扰控制字段,‘00’表示没有加密,剩下的01,10,11由用户自定义;

0                           是优先级,1为高,0为低;

0                           是数据对齐指示字段;

0                           是版权字段;

0                           是原始或拷贝字段。置'1'时表示相关PES分组有效负载的内容是原始的;'0'表示内容是一份拷贝;

第8个字节:

10                         是PTS_DTS字段,这里是10,表示有PTS,没有DTS;

0                           是ESCR标志字段,这里为0,表示没有该段;

0                           是ES速率标志字段,,这里为0,表示没有该段;

0                           是DSM特技方式标志字段,,这里为0,表示没有该段;

0                           是附加版权信息标志字段,,这里为0,表示没有该段;

0                           是PESCRC标志字段,,这里为0,表示没有该段;

0                           是PES扩展标志字段,,这里为0,表示没有该段;

本段码流只有PTS,贴一下解析函数

 

[cpp]  view plain  copy
 
 
  1. unsigned long parse_time_stamp (const unsigned char *p)  
  2. {  
  3.     unsigned long b;  
  4.     //共33位,溢出后从0开始  
  5.     unsigned long val;  
  6.   
  7.     //第1个字节的第5、6、7位  
  8.     b = *p++;  
  9.     val = (b & 0x0e) << 29;  
  10.   
  11.     //第2个字节的8位和第3个字节的前7位  
  12.     b = (*(p++)) << 8;  
  13.     b += *(p++);  
  14.     val += ((b & 0xfffe) << 14);  
  15.   
  16.     //第4个字节的8位和第5个字节的前7位  
  17.     b = (*(p++)) << 8;  
  18.     b += *(p++);  
  19.     val += ((b & 0xfffe) >> 1);  
  20.   
  21.     return val;  
  22. }  

 

 

其他字段可参考协议解析

 

ps:

遇到00 00 01 bd的,这个是私有流的标识

ps:

另外,有的hk摄像头回调然后解读出来的原始h.264码流,有的一包里只有分界符数据(nal_unit_type=9)或补充增强信息单元(nal_unit_type=6),如果直接送入解码器,有可能会出现问题,这里的处理方式要么丢弃这两个部分,要么和之后的数据合起来,再送入解码器里,如有遇到的朋友可以交流一下:)

 

写在后面:

第一次发原创,在这里感谢  @cmengwei  的无私帮助,提供了很多帮助,非常感谢。

 

文档我都放在了我的资源里面,有1个下载积分,大家不要吝啬,绝对值得!

 

《RTP Payload Format for H.264 Video》

http://download.****.net/detail/chen495810242/7904367

《MPEG2-2(13818中文版)》

http://download.****.net/detail/chen495810242/7904401

 

 

RTP荷载H264的代码参考:

http://blog.****.net/dengzikun/article/details/5807694

RTP荷载PS流的代码参考:

http://www.pudn.com/downloads33/sourcecode/windows/multimedia/detail105823.html

http://www.oschina.net/code/snippet_99626_23737

 

请不要跟我要源码,参考我提供的这些,你足以写出一个可以正常运行的程序。

授人以鱼不如授人以渔。

 

其他参考:

http://blog.****.net/duanbeibei/article/details/1698183

http://blog.****.net/wwyyxx26/article/details/15224879

 

原创不易,转载请附上链接,谢谢http://blog.****.net/chen495810242/article/details/39207305