Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1075673
  • 博文数量: 77
  • 博客积分: 821
  • 博客等级: 军士长
  • 技术积分: 1905
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-23 16:17
个人简介

学校:上海交通大学软件工程 学历:硕士 行业:从事流媒体移动开发 QQ: 412595942 邮箱:yiikai1987910@gmail.com

文章分类

全部博文(77)

文章存档

2016年(4)

2015年(15)

2014年(16)

2013年(12)

2012年(21)

2011年(9)

分类: C/C++

2013-05-14 13:23:27

 最近彻底研究分析了ts文件格式,这里做下学习总结:
简单的来说,ts文件中的信息其实就是通过负载类型字段来找,找到后把数据从负载中提取出来,ts中可以有很多媒体类型数据,比如说可以同时又音频和视频数据,
可是要如何区分ts文件中的数据是音频还是视频呢?这就需要动用ts文件中的PSI描述说明了。

PSI:

在MPEG-II中定义了节目特定信息(PSI),PSI用来描述传送流的组成结构,在MPEG-II系统中担任极其重要的角色,在多路复用中尤为重要的是PAT表和PMT表。PAT表给出了一路MPEG-II码流中有多少套节目,以及它与PMT表PID之间的对应关系;PMT表给出了一套节目的具体组成情况与其视频、音频等PID对应关系。PSI提供了使接收机能够自动配置的信息,用于对复用流中的不同节目流进行解复用和解码。PSI信息由以下几种类型表组成:

◆ 节目关联表(PAT Program Association Table)

     PAT表用MPEG指定的PID(00)标明,通常用PID=0表示。它的主要作用是针对复用的每一路传输流,提供传输流中包含哪些节目、节目的编号以及对应节目的节目映射表(PMT)的位置,即PMT的TS包的包标识符(PID)的值,同时还提供网络信息表(NIT)的位置,即NIT的TS包的包标识符(PID)的值。

◆ 条件接收表(CAT Conditional Access Table)

     CAT表用MPEG指定的PID(01)标明,通常用PID=1表示。它提供了在复用流中条件接收系统的有关信息,指定CA系统与它们相应的授权管理信息(EMM))之间的联系,指定EMM的PID,以及相关的参数。

◆ 节目映射表(PMT Program Map Table)

     节目映射表指明该节目包含的内容,即该节目由哪些流组成,这些流的类型(音频、视频、数据),以及组成该节目的流的位置,即对应的TS包的PID值,每路节目的节目时钟参考(PCR)字段的位置。

◆ 网络信息表(NIT Nerwork Information Table)

     网络信息表提供关于多组传输流和传输网络相关的信息,其中包含传输流描述符、通道频率、卫星发射器号码、调制特性等信息。

◆ 传输流描述表(TSDT Transport Stream Description Table)

    传输流描述表由PID为2的TS包传送,提供传输流的一些主要参数。

◆ 专用段(private_section)

     MPEG-2还定义了一种专用段用于传送用户自己定义的专用数据。

◆ 描述符(Descripter)

     除了上述的表述之外,MPEG-2还定义了许多描述符,这些描述符提供关于视频流、音频流、语言、层次、系统时钟、码率等多方面的信息,在PSI的表中可以灵活的采用这些描述符进一步为接收机提供更多的信息。

     在解码时,接收机首先根据PID值找到PAT表,找出相应节目的PMT表的PID,再由该PID找到该PMT表,再在PMT表中找到相应的码流,然后开始解码。

总下简单的说就是,解析ts的过程就是通过找到PAT表,从PAT表中找出对应存在的节目的id,按照这些id找到这些节目的PMT表,从中获到这些节目总的相对的媒体数据id,然后通过这些id,再从ts文件中找到这些文件的es数据,来完成解码或者别的什么操作。
  如图:

ts文件,将每个数据包分成188个字节来发送。ts文件格式如图:
   
 从图中可以看到 ts文件头分为包头和负载两部分,现在我们详细看下包头结构:
 
sync_btye固定为0x47 ,说明从这个字节后的188个字节都属于一个ts包。 比较重要的是PID这个字段,共13位,表示了这个ts包负载数据的类型,如果没有这个信息,无法再后续寻找我们想要的数据。调整字段的作用稍后会看到。这里先跳过介绍吧,其他的字段对于ts的学习可以先不研究,不是很重要。

    现在我们看看,PAT表的结构:
    
   
     TS的解析工作,一般都是从找PAT表开始,所以,要先找到负载中头个字节是0x00的,就说明找到PAT表了。section_length表示从这个字段开始后有几个字节,如果不满188个字节,就用0xff填满。可以发现去掉最后4位的crc校验位从section_number之后的5个字节开始,就是这个ts文件中缩有的节目了,每两个字节代表一个节目,从中很容易获取到节目的ID信息。
    获取到ID之后,就可以开始查找关于这个id的PMT表了。
    PMT:
    
      
        PMT表中 多数字段含义和PAT表类似,值得注意的是对于对应节目中的媒体数都是5个字节表示,音频数据或视屏数据。所以,从中可以发现当前节目有多少的音视频相关信息。从stream_type可以通过查表来得知是音频数据还是视频数据等信息,这个就靠大家自己在网上查阅了。
         之后就可以通过得到的elementary_pid来查找对应的音视频信息了。从而从中获取出es流。
      


阅读(55909) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~