转自:http://blog.csdn.net/u013354805/article/details/51591229
1. PES: 1.1 PES介绍: PES--Packetized Elementary Streams (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构。PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息等操作(对ES流的第一次打包)。PES流的基本单位是PES包。PES包由包头和payload组成。
1.2. PES句法句法示意图:
2. 分析PES包: 2.1 PES包数据:
2.2 包头:
TS包头只有4个字节(47 48 14 10),除掉第一个字节0x47,剩下就3个,重新分组如下: 0 1 0 0100000010100 00 01 0000 sync_byte | 同步字节 | 0x47: | transport_error_indicator | 传输错误标识 | 0: | payload_unit_start_indicator | 负载单元开始标识 | 1:可知这个包的负载部分有PES爆头,换句话说,也就是帧头所在。又由第二个TS包的分析可知,PID为814的TS包,存放的都是MP3格式的数据。可知这个包存储了MP3格式的一帧部分数据。 | transport_priority | 传输优先级 | 0: | pid | PID | 0x814:因为在PMT中查找音频是program_map_PID为0x814。 | transport_scrambling_control | 传输扰乱控制 | 00: | adaptation_field_control | 自适应区域控制 | 01:可知负载只含有有效载荷单元,也就是PES包。而不含自适应字段。 00:是保留值。 01:负载中只有有效载荷。 10:负载中只有自适应字段。 11:先有自适应字段,再有有效载荷。 | continuity_counter | 连续计数器 | 0x0:0000 0000 00000000 |
2.3 TS包: 1) 00 00 01:包起始码前缀。默认规定。占24位,3个字节。(47 48 14 1000 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22)
2) C0:1100 0000:流ID,占8位(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22) 3)01 88:0000 0001 1000 1000 PES包长度,也就是一帧数据的总长度(也就是这帧长度是392字节)。(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22)
4)80:1000 0000(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22) 10:默认规定 00:PES加扰控制 0:PES优先级 0:数据定位指示符 0:版权 0:原始的或复制的 |
5)80:1000 0000(47 48 14 10 00 00 01 C0 01 88 8080 05 21 00 01 96 07 FF FD 85 00 33 22) 10:PTS_DTS_flags,10代表后面将会有PTS信息。 000000:分别代表其他6个标志,0表示后面没有对应的信息。 |
6)05:0000 0101(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22) PES头数据长度,表示后面还有0x05个字节,之后就是一帧的数据内容。 PES头数据具体包含哪些内容有前面的标志位来确定,哪些信息得标志位1,就包含哪些信息。排列顺序分别是PTS DTS ESCR ES速率 DSM特技方式 附件的复制信息 前PES的CRC PES 扩展,如果还有多余的字节没用,就用填充字节0xFF填充。 本例子中,PES头数据只包含PTS数据。 |
7)21 00 01 96 07:5个字节总共40位(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22) If(PTS_DTS_flags == ‘10’){ | | ‘0010’ | 4 | PTS[32..30] | 3 | marker_bit | 1 | PTS[29..15] | 15 | marker_bit | 1 | PTS[14..0] | 15 | marker_bit | 1 | } | |
0010:默认规定,4位 000:PTS[32..30] 3位 1:marker_bit:1位 0000 0000 0000 000:PTS[29..15] 15位 1:market_bit 占1位 1001 0110 0000 011:PTS[14..0] 15位 1:marker_bit 1位 | PES,包头分析完。剩下的数据就全是帧数据的一部分数据了。8)FF FD 85 00 33 22:(47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22)这些数据符号MP3格式。
packet_start_code_prefix | 0x00 00 01 | stream_id | 0xC0:流ID | PES_packet_length | 0x01 88:PES包长度 | ‘10’ | 2b:10 | PES_scrambling_control | 2b:0 | PES_priority | 1b:0 | Data_alignment_indicator | 1b:0 | copyright | 1b:0 | Original_or_copy | 1b:0 | PTS_DTS_flags | 2b:10 | ESCR_flag | 1b:0 | ES_rate_flag | 1b:0 | DSM_trick_mode_flag | 1b:0 | Additional_copy_info_flag | 1b:0 | PES_CRC_flag | 1b:0 | PES_extension_flag | 1b:0 | PES_header_data_length | 8b:0x05 | PTS_DTS data | 40b:0x21 00 01 96 07 |
3. PES第二个数据包:
3.1 PES包数据:
3.2 包头:
S包头只有4个字节(47 08 14 11),除掉第一个字节0x47,剩下就3个,重新分组如下: 0 0 0 0100000010100 00 01 0001 sync_byte | 同步字节 | 0x47: | transport_error_indicator | 传输错误标识 | 0: | payload_unit_start_indicator | 负载单元开始标识 | 0:有效载荷单元起始符为0,表示不是帧头,不含PES包头数据,只有PES负载(PES负载就是一帧数据) | transport_priority | 传输优先级 | 0: | pid | PID | 0x814:因为在PMT中查找音频是program_map_PID为0x814。
| transport_scrambling_control | 传输扰乱控制 | 00: | adaptation_field_control | 自适应区域控制 | 01:可知负载只含有有效载荷单元,也就是PES包。而不含自适应字段。 00:是保留值。 01:负载中只有有效载荷。 10:负载中只有自适应字段。 11:先有自适应字段,再有有效载荷。 | continuity_counter | 连续计数器 | 0x0001:0000 0000 00000001 |
3.3 TS数据: 去除包头都是MP3数据的有效荷载。 4. PES语法解析:
|