免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1245 | 回复: 0
打印 上一主题 下一主题

MPEG2 TS基本概念和数据结构-2(转) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-02 16:26 |只看该作者 |倒序浏览
[color="#000102"]数据结构([color="#000102"]1[color="#000102"])[color="#000102"]TS[color="#000102"]分组[color="#000102"]前面提到,[color="#000102"]TS[color="#000102"]分组由[color="#000102"]188[color="#000102"]个字节构成,其结构如下:[color="#000102"] transport_packet(){ sync_byte                                                                    // 8transport_error_indicator                                          //1payload_unit_start_indicator                                    //1transport_priority                                                       // 1  PID                                                                             //13transport_scrambling_control                                  // 2adaptation_field_control                                            //2continuity_counter                                                      //4if(adaptation_field_control=='10'  || adaptation_field_control=='11'){   adaptation_field() } if(adaptation_field_control=='01' || adaptation_field_control=='11') {   for (i=0;i   data_byte                                                                   //8  } } }
[color="#000102"]前面[color="#000102"]32bit[color="#000102"]的数据即[color="#000102"]TS[color="#000102"]分组首部,它指出了这个分组的属性。[color="#000102"]
[color="#000102"]sync_byte[color="#000102"]  [color="#000102"]同步字节,固定为[color="#000102"]0x47 [color="#000102"],表示后面的是一个[color="#000102"]TS[color="#000102"]分组,当然,后面包中的数据是不会出现[color="#000102"]0x47[color="#000102"]的[color="#000102"]
[color="#000102"]transport_error_indicator[color="#000102"] [color="#000102"]传输错误标志位,一般传输错误的话就不会处理这个包了[color="#000102"]
[color="#000102"]payload_unit_start_indicator[color="#000102"] [color="#000102"]这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。[color="#000102"]
[color="#000102"]transport_priority[color="#000102"]  [color="#000102"]传输优先级位,[color="#000102"]1[color="#000102"]表示高优先级,传输机制可能用到,解码好像用不着。[color="#000102"]
[color="#000102"]PID[color="#000102"]  [color="#000102"]这个比较重要,指出了这个包的有效负载数据的类型,告诉我们这个包传输的是什么内容。前面已经叙述过。[color="#000102"]
[color="#000102"]transport_scrambling_control[color="#000102"] [color="#000102"]加密标志位,表示[color="#000102"]TS[color="#000102"]分组有效负载的加密模式。[color="#000102"]TS[color="#000102"]分组首部[color="#000102"]([color="#000102"]也就是前面这[color="#000102"]32bit)[color="#000102"]是不应被加密的,[color="#000102"]00[color="#000102"]表示未加密。[color="#000102"]
[color="#000102"] [color="#000102"]adaption_field_control[color="#000102"]  [color="#000102"]翻译为[color="#000102"]“[color="#000102"]调整字段控制[color="#000102"]”[color="#000102"],表示[color="#000102"]TS[color="#000102"]分组首部后面是否跟随有调整字段和有效负载。[color="#000102"]01[color="#000102"]仅含有效负载,[color="#000102"]10[color="#000102"]仅含调整字段,[color="#000102"]11[color="#000102"]含有调整字段和有效负载。为[color="#000102"]00[color="#000102"]的话解码器不进行处理。空分组没有调整字段[color="#000102"]
[color="#000102"] [color="#000102"]continuity_counter[color="#000102"]   [color="#000102"]一个[color="#000102"]4bit[color="#000102"]的计数器,范围[color="#000102"]0-15[color="#000102"],具有相同的[color="#000102"]PID[color="#000102"]的[color="#000102"]TS[color="#000102"]分组传输时每次加[color="#000102"]1[color="#000102"],到[color="#000102"]15[color="#000102"]后清[color="#000102"]0[color="#000102"]。不过,有些情况下是不计数的。如下:[color="#000102"](1)TS[color="#000102"]分组无有效负载[color="#000102"](2)[color="#000102"]复制的[color="#000102"]TS[color="#000102"]分组和原分组这个值一样[color="#000102"](3)[color="#000102"]后面讲到的一个标志[color="#000102"]discontinuity_indicator[color="#000102"]为[color="#000102"]1[color="#000102"]时[color="#000102"]
[color="#000102"]adaptation_field()[color="#000102"] [color="#000102"]调整字段的处理[color="#000102"]
[color="#000102"]data_byte[color="#000102"] [color="#000102"]有效负载的剩余部分,可能为[color="#000102"]PES[color="#000102"]分组,[color="#000102"]PSI[color="#000102"],或一些自定义的数据。[color="#000102"]
[color="#000102"][color="#000102"]([color="#000102"]2[color="#000102"])[color="#000102"]  PAT[color="#000102"]数据结构如下:[color="#000102"]program_association_section() {   table_id                                // 8   section_syntax_indicator                // 1   '0'                                     // 1   reserved                                // 2   section_length                          // 12   transport_stream_id                     // 16   reserved                                // 2   version_number                          // 5   current_next_indicator                  // 1   section_number                          // 8   last_section_number                     // 8   for (i=0; i       program_number                         // 16       reserved                               // 3     if(program_number == '0') {         network_PID                           // 13       }     else {        program_map_PID                       // 13      }  } CRC_32                                  //  32}
[color="#000102"]table_id[color="#000102"]  [color="#000102"]固定为[color="#000102"]0x00 [color="#000102"],标志是该表是[color="#000102"]PAT
[color="#000102"]section_syntax_indicator[color="#000102"] [color="#000102"]段语法标志位,固定为[color="#000102"]1
[color="#000102"]section_length[color="#000102"]         [color="#000102"]表示这个字节后面有用的字节数,包括[color="#000102"]CRC32[color="#000102"]。假如后面的字节加上前面的字节数少于[color="#000102"]188[color="#000102"],后面会用[color="#000102"]0XFF[color="#000102"]填充。假如这个数值比较大,则[color="#000102"]PAT[color="#000102"]会分成几部分来传输。[color="#000102"]
[color="#000102"]transport_stream_id[color="#000102"]    [color="#000102"]该传输流的[color="#000102"]ID[color="#000102"],区别于一个网络中其它多路复用的流。[color="#000102"]
[color="#000102"]version_number[color="#000102"]范围[color="#000102"]0-31[color="#000102"],表示[color="#000102"]PAT[color="#000102"]的版本号,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明[color="#000102"]TS[color="#000102"]流中的节目已经变化了,程序必须重新搜索节目.[color="#000102"]
[color="#000102"]current_next_indicator[color="#000102"] [color="#000102"]表示发送的[color="#000102"]PAT[color="#000102"]是当前有效还是下一个[color="#000102"]PAT[color="#000102"]有效。[color="#000102"]
[color="#000102"]section_number[color="#000102"]分段的号码。[color="#000102"]PAT[color="#000102"]可能分为多段传输,第一段为[color="#000102"]00[color="#000102"],以后每个分段加[color="#000102"]1[color="#000102"],最多可能有[color="#000102"]256[color="#000102"]个分段[color="#000102"]
[color="#000102"]last_section_number [color="#000102"]最后一个分段的号码[color="#000102"]
[color="#000102"] [color="#000102"]program_number[color="#000102"] [color="#000102"]节目号[color="#000102"]
[color="#000102"]network_PID [color="#000102"]网络信息表([color="#000102"]NIT[color="#000102"])的[color="#000102"]PID[color="#000102"],网络信息表提供了该物理网络的一些信息,和电视台相关的。节目号为[color="#000102"]0[color="#000102"]时对应的[color="#000102"]PID[color="#000102"]为[color="#000102"]network_PID
[color="#000102"]program_map_PID[color="#000102"] [color="#000102"]节目映射表的[color="#000102"]PID[color="#000102"],节目号大于[color="#000102"]0[color="#000102"]时对应的[color="#000102"]PID[color="#000102"],每个节目对应一个[color="#000102"]
[color="#000102"]CRC_32[color="#000102"]   CRC32[color="#000102"]校验码[color="#000102"]
[color="#000102"]上面[color="#000102"]program_number[color="#000102"],[color="#000102"]network_PID[color="#000102"],[color="#000102"]program_map_PID [color="#000102"]是循环出现的。[color="#000102"]program_number[color="#000102"]等于[color="#000102"]0[color="#000102"]时对应[color="#000102"]network_PID[color="#000102"],[color="#000102"]program_number[color="#000102"]等于其它值时对应[color="#000102"]program_map_PID[color="#000102"]。
[color="#000102"]
[color="#000102"](3)PMT   PMT[color="#000102"]数据结构如下:[color="#000102"][color="#000102"]TS_program_map_section() {table_id                               // 8section_syntax_indicator              //  1'0'                                   //  1reserved                              //  2section_length                        //  12program_number                        //  16reserved                              //  2version_number                        //  5current_next_indicator                //  1section_number                        //  8last_section_number                   //  8reserved                              //  3PCR_PID                               //  13reser[color="#000102"]ved[color="#000102"] 4program_info_length                   //  12for (i=0; i  descriptor()}for (i=0;i  stream_type                           //  8  reserved                              //  3  elementary_PID                        //  13  reserved                              //  4  ES_info_length                        //  12  for (i=0; i   descriptor()  }}CRC_32                                 //  32}
[color="#000102"]table_id[color="#000102"]  [color="#000102"]固定为[color="#000102"]0x02 [color="#000102"],标志是该表是[color="#000102"]PMT[color="#000102"]。[color="#000102"]
[color="#000102"]section_syntax_indicator[color="#000102"] [color="#000102"]section_length[color="#000102"]      [color="#000102"]version_number[color="#000102"]       [color="#000102"]current_next_indicator [color="#000102"]以上四个字段意思和[color="#000102"]PAT[color="#000102"]相同,可参考上面解释[color="#000102"]
[color="#000102"]section_number  [color="#000102"] [color="#000102"]last_section_number [color="#000102"]以上两个字段意思和[color="#000102"]PAT[color="#000102"]相同,不过值都固定为[color="#000102"]0x00[color="#000102"],我觉得这样的原因可能是因为[color="#000102"]PMT[color="#000102"]不需要有先后顺序,因为先定义哪个节目都是无所谓。[color="#000102"]
[color="#000102"]program_number[color="#000102"] [color="#000102"]节目号,表示该[color="#000102"]PMT[color="#000102"]对应的节目[color="#000102"]
[color="#000102"]PCR_PID [color="#000102"]PCR[color="#000102"](节目时钟参考)所在[color="#000102"]TS[color="#000102"]分组的[color="#000102"]PID[color="#000102"],根据[color="#000102"]PID[color="#000102"]可以去搜索相应的[color="#000102"]TS[color="#000102"]分组,解出[color="#000102"]PCR[color="#000102"]信息。[color="#000102"]
[color="#000102"]program_info_length[color="#000102"] [color="#000102"]该节目的信息长度,在此字段之后可能会有一些字节描述该节目的信息[color="#000102"]
[color="#000102"]stream_type[color="#000102"] [color="#000102"]指示了[color="#000102"]PID[color="#000102"]为[color="#000102"]elementary_PID[color="#000102"]的[color="#000102"]PES[color="#000102"]分组中原始流的类型,比如视频流,音频流等,见后面的表[color="#000102"]
[color="#000102"]elementary_PID[color="#000102"] [color="#000102"]该节目中包括的视频流,音频流等对应的[color="#000102"]TS[color="#000102"]分组的[color="#000102"]PID
[color="#000102"]ES_info_length[color="#000102"] [color="#000102"]该节目相关原始流的描述符的信息长度。[color="#000102"]stream_type[color="#000102"]对应的类型:
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/98222/showart_2015652.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP