MPEG2_TS流基本概念和数据结构

(1)ES- Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流。原始流包括访问单元,比如视频原始流的访问单元就是一副图像的编码数据。

(2) PES-Packetized Elementary Streams (分组的原始流),原始流形成的分组称为PES分组,是用来传递原始流的一种数据结构

(3)节目是节目元素的集合。节目元素可能是原始流,这些原始流有共同的时间基点,用来做同步显示。

(4)传输流和节目流TS-Transport Stream翻译为“传输流”PS-ProgramStream  翻译为“节目流”PS用来传输和保存一道节目的编码数据或其他数据。PS的组成单位是PES分组。TS用来传输和保存多道节目的编码数据或其他数据,TS的组成单位是节目。PS适用于不容易发生错误的环境,以及涉及到软件处理的应用,典型应用如DVD光盘的文件存储TS适用于容易发生错误的环境,典型应用就是数字电视信号的传输。TS和PS是可以互相转换的,比如从TS中抽取一道节目的内容并产生有效的PS是可能。 

(5)传输流分组和PES分组原始流分成很多PES分组,保持串行顺序,一个PES分组只包含一个原始流的编码数据。PES分组长度很大,最大可为64K字节。PES分组分为“分组首部(header)”和“有效负载(payload)”。“有效负载”指跟随在首部字节之后的字节。首部的前4个字节构成分组的起始码,标识了该分组所属原始流的类型和ID号。TS分组也就是传输流数据形成的数据包。每个TS分组长度为188字节,包括“分组首部”和“有效负载,前4个字节是分组首部,包含了这个分组的一些信息。有些情况下需要更多的信息时,需在后面添加“调整字段(adaptionfield)”。两者之间的关系:PES分组是插入到TS分组中的,每个PES分组首部的第一字节就是TS分组有效负载的第一字节。一个PID值的TS分组只带有来自一个原始流的数据。 

(6)PSI 全称Program Specific Information,意为节目专用信息。传输流中是多路节目复用的,那么,怎么知道这些节目在传输流中的位置,区分属于不同节目呢?所以就还需要一些附加信息,这就是PSI。PSI也是插入到TS分组中的,它们的PID是特定值。MPEG-2中规定了4个PSI,包括PAT(节目关联表),CAT(条件访问表),PMT(节目映射表),NIT(网络信息表),这些PSI包含了进行多路解调和显示节目的必要的和足够的信息。应用中可能包括更多的信息,比如DVB-T中定义了SDT(服务描述表),EIT(环境信息表),BAT(节目组相关表),TDT(时间日期表)等,统称为DVB-SI(服务信息)。 PSI的PID是特定的,含PSI的数据包必须周期性的出现在传输流中。

 PMT (Program MapTable )节目映射表PMT所在分组的PID由PAT指定,所以要先解出PAT,再解PMT。PMT中包含了属于同一节目的视频、音频和数据原始流的PID。找到了PMT,解多路复用器就可找到一道节目对应的每个原始流的PID,再根据原始流PID,去获取原始流。

PAT (Program Association Table)节目关联表PAT所在分组的PID=0 PAT中列出了传输流中存在的节目流PAT指定了传输流中每个节目对应PMT所在分组的PIDPAT的第一条数据指定了NIT所在分组的PID ,其他数据指定了PMT所在分组的PID。

CAT (Conditional Access Table )条件访问表CAT所在分组的PID=1CAT中列出了条件控制信息(ECM)和条件管理信息(EMM)所在分组的PID。CAT用于节目的加密和解密 NIT(Network Information Table)网络信息表NIT所在分组的PIDPAT指定NIT提供一组传输流的相关信息,以及于网络自身特性相关的信息,比如网络名称,传输参数(如频率,调制方式等)。NIT一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考。几种PSI之间的关系,如下图所示:首先PAT中指定了传输流中所存在的节目,及每个节目对应的PMT的PID号。比如Program 1对应的PMT 的PID=22,然后找到PID=22的TS分组,解出PMT,得到这个节目中包含的原始流的PID,再根据原始流的PI

D去找相应的TS分组,获取原始流的数据,然后就可以送入解码器解码了。 

 

数据结构(1TS分组前面提到,TS分组由188个字节构成,其结构如下:  transport_packet(){  sync_byte                                                                   // 8 transport_error_indicator                                          //1payload_unit_start_indicator                                    //1transport_priority                                                      // 1  PID                                                                             //13transport_scrambling_control                                  // 2adaptation_field_control                                           //2 continuity_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<N;i++){    

data_byte                                                                   //8   } }  } 

前面32bit的数据即TS分组首部,它指出了这个分组的属性。

sync_byte  同步字节,固定为0x47 ,表示后面的是一个TS分组,当然,后面包中的数据是不会出现0x47的

transport_error_indicator传输错误标志位,一般传输错误的话就不会处理这个包了

payload_unit_start_indicator这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。

transport_priority  传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。

PID 这个比较重要,指出了这个包的有效负载数据的类型,告诉我们这个包传输的是什么内容。前面已经叙述过。 

transport_scrambling_control加密标志位,表示TS分组有效负载的加密模式。TS分组首部(也就是前面这32bit)是不应被加密的,00表示未加密。

 adaption_field_control  翻译为“调整字段控制”,表示TS分组首部后面是否跟随有调整字段和有效负载。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00的话解码器不进行处理。空分组没有调整字段

 continuity_counter   一个4bit的计数器,范围0-15,具有相同的PID的TS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。如下:(1)TS分组无有效负载(2)复制的TS分组和原分组这个值一样(3)后面讲到的一个标志discontinuity_indicator为1时 

adaptation_field()调整字段的处理

data_byte有效负载的剩余部分,可能为PES分组,PSI,或一些自定义的数据。

 (2  PAT数据结构如下: 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<N;i++) {        program_number                         // 16        reserved                               // 3      if(program_number == '0') {          network_PID                           // 13        }     else {        program_map_PID                      // 13       }   } CRC_32                                 //  32 }

table_id 固定为0x00,标志是该表是PAT

section_syntax_indicator段语法标志位,固定为1

section_length         表示这个字节后面有用的字节数,包括CRC32。假如后面的字节加上前面的字节数少于188,后面会用0XFF填充。假如这个数值比较大,则PAT会分成几部分来传输。

transport_stream_id    该传输流的ID,区别于一个网络中其它多路复用的流。

version_number范围0-31,表示PAT的版本号,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.

current_next_indicator表示发送的PAT是当前有效还是下一个PAT有效。

section_number分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段

last_section_number 最后一个分段的号码

 program_number节目号

network_PID 网络信息表(NIT)的PID,网络信息表提供了该物理网络的一些信息,和电视台相关的。节目号为0时对应的PID为network_PID

program_map_PID节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个

CRC_32  CRC32校验码

上面program_number,network_PID,program_map_PID是循环出现的。program_number等于0时对应network_PID,program_number等于其它值时对应program_map_PID。

 

(3)PMT   PMT数据结构如下: TS_program_map_section(){ table_id                               // 8section_syntax_indicator             //  1 '0'                                   //  1 reserved                              //  2 section_length                        //  12 program_number                        //  16 reserved                              //  2 version_number                        //  5 current_next_indicator                //  1 section_number                        //  8 last_section_number                   //  8 reserved                              //  3 PCR_PID                               //  13 reserved 4program_info_length                  //  12 for (i=0; i<N; i++){   descriptor() } for (i=0;i<N1;i++){   stream_type                           //  8  reserved                             //  3   elementary_PID                        //  13  reserved                             //  4   ES_info_length                        //  12  for (i=0; i<N2; i++) {   descriptor()   } } CRC_32                                 //  32 }

table_id  固定为0x02 ,标志是该表是PMT。

section_syntax_indicator section_length      version_number       current_next_indicator 以上四个字段意思和PAT相同,可参考上面解释

section_number   last_section_number 以上两个字段意思和PAT相同,不过值都固定为0x00,我觉得这样的原因可能是因为PMT不需要有先后顺序,因为先定义哪个节目都是无所谓。

program_number 节目号,表示该PMT对应的节目  

PCR_PID PCR(节目时钟参考)所在TS分组的PID,根据PID可以去搜索相应的TS分组,解出PCR信息。

program_info_length 该节目的信息长度,在此字段之后可能会有一些字节描述该节目的信息

stream_type 指示了PID为elementary_PID的PES分组中原始流的类型,比如视频流,音频流等,见后面的表

elementary_PID 该节目中包括的视频流,音频流等对应的TS分组的PID

ES_info_length 该节目相关原始流的描述符的信息长度。stream_type对应的类型:

 

时间: 2024-09-29 20:21:06

MPEG2_TS流基本概念和数据结构的相关文章

c#.net中关于流的概念

问题描述 关于.net中关于流的概念不是很清楚,大家能讲讲? 解决方案

Java中的stream流的概念解析及实际运用总结_java

流是字节序列的抽象概念. 文件是数据的静态存储形式,而流是指数据传输时的形态. 流类分为两个大类:节点流类和过滤流类(也叫处理流类). 程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读取各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),或者称为包装类. 包装类的调用过程如下图: 流分类的关系不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类.这个四个类的关系如下: 字节流 字符流 输入流 InputStream Read

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

Flink运行时之流处理程序生成流图

流处理程序生成流图 DataStream API所编写的流处理应用程序在生成作业图(JobGraph)并提交给JobManager之前,会预先生成流图(StreamGraph). 什么是流图 流图(StreamGraph)是表示流处理程序拓扑的数据结构,它封装了生成作业图(JobGraph)的必要信息.它的类继承关系如下图所示: 当你基于StreamGraph的继承链向上追溯,会发现它实现了FlinkPlan接口. Flink效仿了传统的关系型数据库在执行SQL时生成执行计划并对其进行优化的思路

网页设计理论:注意力和流

我们创造了网站和软件用以向人们展示信息,信息可以是任何东西 :一个公司的产品清单,旅行度假的照片或者朋友们的即时信息,此时此刻,展现给你的信息比历史上任何时候都要多. 所有这些信息有许多积极的效果,但是也带来了挑战."信息的成本显而易见,它消耗了信息接收者的注意力...信息的富有带来了注意力的稀缺"(西蒙1971 年)当注意力成为一种稀缺资源,如何明智的投资它就变得非常重要,信息架构师和设计师在确保设计提供给用户的产品具有良好回报中扮演着关键的角色. 心理学家米哈里csikszentm

学习使用.NET IO流.

流的概念,在.net的io操作中很重要.流作为一个管道,其实是在实际介质和逻辑读写之间建立了一个adapterhttp://www.zdnet.com.cn/developer/tech/story/0,2000081602,39101377,00.htm

Spring Web Flow 2中流管理的持久化:事务性Web流的持久化策略

Spring Web Flow 是一种新颖的 Java Web 框架,它扩展了 Spring MVC 技术.使用 Spring Web Flow 的应用开发围绕着定义为 Web 流的用例展开. 将开发工作区根据 Web 流进行组织使开发体验更有意义.更具上下文.此外,Spring Web Flow 对 JPA/Hibernate 持久化的支持也是其最重要的服务器端改进之一. 尽管 SpringSource 和 Spring Web Flow 项目组详细介绍了 Spring Web Flow,但是

css+div布局要素:文档流position属性 父级对象和同级对象

div+css布局要素:文档流position属性.父级对象和同级对象.从学div+css以来,一直对position几个属性的理解不够清晰.自己对position这一属性有了更深入和清晰的认识,同时让自己对整个div+css布局有了更深入的认识. 因为div实质是一个四方块,被很多业界人士形象的比喻成盒子.那么div+css布局的过程其实就是摆放这些盒子的过程.最近一周来,专门针对这个问题进行了深入的思考和研究.结果通过对这一问题的研究不仅让自己对position这一属性有了更深入和清晰的认识

Java IO流学习总结

 Io流的内容比较多 ,大致可以分为字节流和字符流,其中为了提高效率又用到了缓冲区. Java流操作有关的类或接口: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作.  IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象.本