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适用于不easy错误发生的环境,以及涉及到软件处理的应用。典型应用如DVD光盘的文件存储TS适用于easy错误发生的环境,典型应用就是数字电视信号的传输。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-08-06 18:46:17

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

鲨鱼币上线聚币网交易, 流支付概念得大佬推崇

近日,SAK已正式联手聚币网,成为该平台又一潜力巨大的明星产品.据悉,聚币网为比特币交易网旗下数字货币交易平台,创办于2014年初,现上线的币种包括比特币.莱特币.狗狗币.暗黑币.比特股等.SAK的加盟无疑让这一平台进一步提升.同时,比特币交易网CEO张寿松对这次合作表示满意,对SAK支付.流支付有价值认同. 张寿松表示:SAK支付在实体商户中的推广应用规划是值得肯定的,尤其是基于移动互联网和线下高端商户结合的O2O项目,一旦可以推广起来,对SAK支付在实体商户中的应用将是一个很好的促进,让更多

C/C++中关于输入输出缓冲区和流的概念理解

(本文章关于缓冲区概念的理解部分取自:http://developer.51cto.com/art/201107/277186.htm) 首先可以看下快递的寄送过程: 源地址(商家的仓库)——中转地(快递公司的仓库)——目的地(买家) 我们从淘宝商家买衣服,商家通过快递公司把商品送到我们手里的这个过程可以形象的解释下缓存区和流的这个概念. 1, 淘宝商家不会亲自把商品给买家送过来的,因为这样效率太低了,商家会通过快递公司这个中转,然后快递公司再把东西送给买家.淘宝商家就是在键盘上打字,买家就是程

OTL翻译(2) -- OTL流的概念

OTL流的概念 任何的SQL语句.SQL语句块或存储过程,都是通过输入与输出变量进行处理参数与结果的. 如: 例1:一个SELECT语句把标量的输入变量作为WHERE子句部分的条件:同时SELECT部分则定义了输出的字段,并且在结果集为多行的情况下还是一个VECTOR结构. 例2:一个INSERT语句把数据写入数据库中,同样需要输入数据.UPDATE也是同样的道理. 例3:一个DELETE语句从表中删除数据,删除的条件同样需要通过参数输入. 例4:一个存储过程可能同时具有输入与输出参数.通过存储

Java IO 理解流的概念

Java IO 理解流的概念 @author ixenos 在理解流时首先理解以下概念 1.流的来源和去向一般在构造器指出 2.方法中的形参一般是将流输出到某个位置,读取时从流读出数据(来自流)送到位置上,输出时将所要输出的数据(来自我)送到位置上

流的概念

计算机程序最一般的模型可以归纳为:输入.计算和输出.输入和输出是人机交互的重要手段,一个设计合理的程序应该首先允许用户根据具体的情况输入不同的数据,然后经过程序算法的计算处理,最后以用户容易接受的方式输出结果.java用流的概念来表示输入输出.java提供的输入输出功能十分强大而灵活,美中不足的是起初看上去输入输出的代码可能并不是很简洁,因为往往需要创建许多不同的流对象.在java类库中,I/O(输入和输出)部分的内容有很多,这点看下JDK的java.io包就知道了,它涉及的主要关键类有:Inp

转:Delphi 流的概念

Delphi流的操作 一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流就是把整个对象转化为一个一个单字节数据,然后形成数据流,其形同把固体石块打碎成一颗颗细小的沙子一样,最后可以形成流沙. 二.流的主要功能 流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的I/O操作).如将图片文件保存到数据库,那么数据库中的图片数据就变成非文件数据

09-JS的事件流的概念(重点)

在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件.想要知道这些事件是在什么时候进行调用的,就需要了解一下"事件流"的概念. 什么是事件流 事件流描述的是从页面中接收事件的顺序 1.DOM事件流 "DOM2级事件"规定的事件流包括三个阶段: ① 事件捕获阶段: ② 处于目标

JS的事件流的概念(重点)

在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件.想要知道这些事件是在什么时候进行调用的,就需要了解一下"事件流"的概念. 什么是事件流 事件流描述的是从页面中接收事件的顺序 1.DOM事件流 "DOM2级事件"规定的事件流包括三个阶段: ① 事件捕获阶段: ② 处于目标

推流和拉流的概念以及RTMP和HLS协议

https://www.bbsmax.com/A/x9J2wZM56o/ 推流为将直播内容推送至服务器的过程:拉流为服务器已有直播内容,用指定地址进行拉取的过程. rtmp rtmp是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写.该协议基于TCP,是一个协议族,包括RTMP基本协议及RTMPT/RTMPS/RTMPE等多种变种.RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协议的流媒体/交互服务器之间进