TS数据结构分析

合集下载

Transport Stream(TS)数据结构原理

Transport Stream(TS)数据结构原理

Transport Stream概念规范中讲述的概念很多,容易让人糊涂,所以先把一些概念理清,弄清楚它们之间的关系,再看后面的就可提高很多的效率。

(1)ES- Elementary Streams (原始流),对视频、音频信号及其他数据进行编码压缩后的数据流称为原始流。

原始流包括访问单元,比如视频原始流的访问单元就是一副图像的编码数据。

(2) PES- Packetized Elementary Streams (分组的原始流),原始流形成的分组称为PES分组,是用来传递原始流的一种数据结构(3)节目是节目元素的集合。

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

(4)传输流和节目流TS-Transport Stream翻译为“传输流”PS-Program Stream 翻译为“节目流”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个字节是分组首部,包含了这个分组的一些信息。

有些情况下需要更多的信息时,需在后面添加“调整字段(adaption field)”。

什么是TS

什么是TS

什么是TS(transport stream)传输流标准?MPEG组织于1994年推出MPEG-2压缩标准,以实现视/音频服务与应用互操作的可能性,MPEG-2标准是针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定。

对应于不同的应用,符合MPEG-2标准的码流又分为传送流和程序流,本文主要讲解了传送流有关的部分数据结构,从实际应用的传送流码流中截取了部分码流做了说明,并给出了部分解析传送流码流的实例程序。

在MPEG-II标准中,为了将一个或更多的音频、视频或其他的基本数据流合成单个或多个数据流,以适应于存储和传送,必须对其重新进行打包编码,在码流中还需插入各种时间标记、系统控制等信息,最后送到信道编码与调制器。

这样可以形成两种数据流——传送流(TS)和程序流(PS),分别适用于不同的应用,图1给出了单路节目的视音频数据流的复用框图。

传送流(Transport Stream)简称TS流,它是根据ITU-T Rec.H.222.0|ISO/IEC 13818-2 和ISO/IEC 13818-3协议而定义的一种数据流,其目的是为了在有可能发生严重错误的情况下进行一道或多道程序编码数据的传送和存储。

这种错误表现为比特值错误或分组丢失。

传送流由一道或多道节目组成,每道节目由一个或多个原始流和一些其他流复合在一起,包括视频流、音频流、节目特殊信息流(PSI)和其他数据包。

其中PSI表有4种类型:节目关联表(PAT)、节目映射表(PMT)、网络信息表和条件访问表。

传送流应用比较广泛,如视音频资料的保存、电视节目的非线性编辑系统及其网络等。

在开发机顶盒以及视频设备时有时需要对码流的编码知识有比较清楚地了解,这样才能在遇到问题时做出全面的分析。

TS流结构分析如图2所示,TS包的长度是固定的,为188字节。

包括同步字节(sync_byte)0x47和数据包识别号PID等。

PID为13位字段,指示存储于分组有效负载中数据的类型,PID值0x0000为程序关联表保留,而0x0001为条件访问表保留,0x1FFF为空分组保留。

TS流结构分析(PAT和PMT)

TS流结构分析(PAT和PMT)

TS流也是由一个或多个PES组合而来的,他们可以具有相同的时间基准,也可以不同。

其基本的复用思想是,对具有相同时间基准[color="#000000"]的多个PES现进行节目复用,然后再对相互有独立时间基准的各个PS进行传输复用,最终产生出TS。

TS包由包头和包数据2部分组成,其中包头还可以包括扩展的自适用区。

包头长度占4bytes,自使用区和包数据共占184bytes,整个TS包长度相当于4个ATM包长。

TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。

其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包内容是否加扰,但包头和自适应区永远不加扰;自适应区控制,用2 bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;连续计数器可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。

显然,包头对TS包具有同步、识别、检错及加密功能。

TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。

其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。

重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。

MPEG2+TS基本概念和数据结构

MPEG2+TS基本概念和数据结构
transport_error_indicator 传输错误标志位,一般传输错误的话就不会处理这个包了
payload_unit_start_indicator 这个位功能有点复杂,字面意思是有效负载的开始标志,根据后面有效负载的内容不同功能也不同,后面用到的时候再说。
transport_priority 传输优先级位,1表示高优先级,传输机制可能用到,解码好像用不着。
section_syntax_indicator // 1
'0' // 1
reserved // 2
section_length // 12
if(adaptation_field_control=='10' || adaptation_field_control=='11'){
adaptation_field()
}
if(adaptation_field_control=='01' || adaptation_field_control=='11') {
(5)传输流分组和PES分组原始流分成很多PES分组,保持串行顺序,一个PES分组只包含一个原始流的编码数据。PES分组长度很大,最大可为64K字节。PES分组分为"分组首部(header)"和"有效负载(payload)"。"有效负载"指跟随在首部字节之后的字节。首部的前4个字节构成分组的起始码,标识了该分组所属原始流的类型和ID号。TS分组也就是传输流数据形成的数据包。每个TS分组长度为188字节,包括"分组首部"和"有效负载,前4个字节是分组首部,包含了这个分组的一些信息。有些情况下需要更多的信息时,需在后面添加"调整字段(adaption field)"。两者之间的关系:PES分组是插入到TS分组中的,每个PES分组首部的第一字节就是TS分组有效负载的第一字节。一个PID值的TS分组只带有来自一个原始流的数据。

ts 字典语法

ts 字典语法

ts 字典语法TS字典语法TypeScript(简称TS)是一种开源的编程语言,它是JavaScript 的超集,为JavaScript添加了静态类型检查和面向对象的特性。

在TypeScript中,字典(Dictionary)是一种非常常见的数据结构,它允许我们存储和访问以键值对形式存储的数据。

1. 定义字典类型在TS中,我们可以使用字典类型来定义一个字典。

字典类型是由键类型和值类型组成的。

例如,我们可以定义一个键类型为string,值类型为number的字典类型:```typescriptlet dict: { [key: string]: number } = {};```上述代码中,我们使用了`{ [key: string]: number }`来定义了一个字典类型,其中`[key: string]`表示键的类型为string,`number`表示值的类型为number。

2. 添加元素在字典中,我们可以使用键来添加或修改元素的值。

例如,我们可以使用以下代码向字典中添加元素:```typescriptdict["apple"] = 10;dict["banana"] = 5;dict["orange"] = 8;```上述代码中,我们使用了键("apple"、"banana"、"orange")来添加相应的值(10、5、8)到字典中。

3. 访问元素在字典中,我们可以使用键来访问对应的值。

例如,我们可以使用以下代码来访问字典中的元素:```typescriptconsole.log(dict["apple"]); // 输出 10console.log(dict["banana"]); // 输出 5console.log(dict["orange"]); // 输出 8```上述代码中,我们使用了键("apple"、"banana"、"orange")来访问字典中对应的值,然后使用console.log()函数将结果输出到控制台。

TS流解析

TS流解析

TS流解析关于TS流的解析TS即是" "的缩写他是分包发送的,每一个包长为字节在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等他的包的结构为,包头为4个字节,负载为个字节工作形式:因为在TS流里可以填入很多种东西,所以有必要有一种机制来确定怎么来标识这些数据制定TS流标准的机构就规定了一些数据结构来定义比如: 表,所以解析起来就像这样: 先接收一个负载里为的数据包,在整个数据包里找到一个包的ID然后再接收一个含有的数据包,在这个数据包里找到有关填入数据类型的ID之后就在接收到的TS包里找含有这个ID的负载内容,这个内容就是填入的信息根据填入的数据类型的ID的不同,在TS流复合多种信息是可行的关键就是找到标识的ID号现在以一个例子来说明具体的操作:在开始之前先给出一片实际TS流例子:f32ch: 47 40 00 17 00 00 B0 0D 00 01 C1 00 00 00 01 E0 ; G???f33ch: 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF FF FF ; ⒚)A f34ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; f35ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; f36ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;f37ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;f38ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; f39ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; f3: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;f3: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;f3: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; f3: FF FF FF FF FF FF FF FF FF FF FF FF 47 40 20 17 ; G f3: 00 02 B0 1B 00 01 C1 00 00 E0 21 F0 00 1B E0 21 ; ????? f3: F0 04 2A 02 7E 1F 03 E0 22 F0 00 5D 16 BD 48 ; ?*~??]紿具体的分析就以这个例子来分析 // TS_TS__(TS__* ) {[4]; ( 4);->__ = [1] >> 7;->___ = [1] >> 6 & 0x01; ->_ = [1] >> 5 & 0x01; -> = ([1] & 0x1F) << 8 | [2]; ->__ =[3] >> 6; ->__ = [3] >> 4 & 0x03; ->_ =[3] & 0x03; }这是一个调整TS流数据包头的函数,这里牵扯到位段调整的问题现在看一下TS流数据包头的结构的定义:// TS__ {_ : 8; __ : 1; ___ : 1; _ : 1; : 13; __ : 2; __ : 2; _ : 4; } TS__;下面我们来分析,在/ -1里有说明,( )的值为0x00,TS包的标识(即_)为0x47,并且为了确保这个TS包里的数据有效,所以我们一开始查找47 40 00这三组16进制数,为什么这样?具体的奥秘在TS包的结构上,前面已经说了_固定为0x47现在往下看__、___、_和这四个元素,为0x00,这是的标识__为0,_为0把他们看成是两组8位16进制数就是:40 00现在看看我们的TS流片断例子,看来正好是47 40 00开头的,一个TS流的头部占据了4个字节剩下的负载部分的内容由来决定,例子看来就是一个表在这里有个地方需要注意一下,___为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置现在看例子中的数据47 40 00 17 00第五个字节是00,说明紧跟着00之后就是具体的负载内容下面给出表的结构体: //// TS_ {_id : 8; __ :1; : 1; _1 : 2; _ : 12; __id : 16; _2 : 2; _ : 5; __ : 1; _ : 8; __ : 8;_ : 16; _3 : 3;_ : 13; __ : 13;_32 : 32; } TS_;再给出表字段调整函数: //__ ( TS_ * * ) {n = 0 i = 0; = 0;->_id = [0];->__ = [1] >> 7; -> = [1] >> 6 & 0x1;->_1 = [1] >> 4 & 0x3;->_ = ([1] & 0x0F) << 8 | [2]; ->__id= [3] << 8 | [4]; ->_2 = [5] >> 6;->_ = [5] >> 1 & 0x1F; ->__ = ([5] << 7) >>7; ->_ = [6]; ->__ = [7]; // _32= 3 + ->_;->_32 = ([-4] & 0xFF) << 24 | ([-3] & 0xFF) << 16 | ([-2] &0xFF) << 8 | ([-1] & 0xFF);// _ __( n = 0; n < ->_ - 4; n ++ ) {->_ = [8] << 8 | [9]; ->_3 =[10] >> 5; ( ->_ == 0x0 )->_ = ([10] << 3) << 5 | [11]; {->__ = ([10] << 3) << 5 | [11]; } n +=5; } }通过上面的分析,例子中的数据00 B0 0D 00 01 C1 00 00 00 01 E0 20 A2 C3 29 41就是具体的表的内容,然后根据结构体来具体分析表但是我们需要注意的是在表里有_、_的元素不只有一个,这两个元素是通过循环来确定的循环的次数通过_元素的确定在这个例子中__为20,所以下面来分析时,就是查找47 40 20的开头的TS包下面来分析表,先给出( )的结构体: //// TS_ {_id : 8; __ :1; : 1; _1 : 2;_ : 12; _ : 16;_2 : 2; _ : 5;__ : 1; _ : 8; __ : 8;_3 : 3; _ : 13;_4 : 4; __ : 12;_ : 8; _5 : 3;_ : 13; _6 : 4;ES__ : 12; _32 : 32; }TS_;在给出调整字段函数: //__ ( TS_ * * ) {= 12 = 0; i = 0;->_id = [0];->__ = [1] >> 7; -> =[1] >> 6; ->_1 = [1] >> 4;->_ = ([1] & 0x0F) << 8 | [2]; ->_ = [3] << 8 | [4]; ->_2 = [5] >> 6;->_ = [5] >> 1 & 0x1F; ->__ =([5] << 7) >> 7; ->_ = [6]; ->__ = [7]; ->_3 = [8] >> 5;。

TS

TS

2.2 业务信息(SI)
• 1、业务群关联表(BAT):它提供了业务 群相关的信息,给出了业务群的名称以及 每个业务群中的业务列表。 • 2、业务描述表(SDT):业务描述表包含 了描述系统中业务的数据,例如业务名称、 业务提供者等 • 3、事件信息表(EIT):它包含了与事件 或节目相关的数据,EIT是生成EPG的主要 表。
• ts流是由很多不同种类的包所组成的,这些数据包都是188 个字节大小,这188个字节包含两部分,包头和负载,包头包 括同步信息,包信息等等,而负载则是传输的数据,而这些 负载则可以组成PES流或者私有流等等数据流. • 举例说,一个TS流包括100个包,其中PSI信息包占20个,PES 数据包80个,此TS流中只有一套节目流,不含有私有流,所 以从这80个PES包中的负载连接在一起,就是2个PES流(视 频,音频),如果每个PES包的负载长度为100字节,则这两个 PES流一共长度为8000个字节.假设其中视频的PES流长度 为6000字节.则视频的6000字节的PES流,是由PES包组成 的.PES包没有固定的长度,而是由包头部的数据给出.
• 4、运行状态表(RST):它给出了事件的 状态(运行/非运行),运行状态表更新这 些信息,允许自动适应切换事件。 • 5、时间和日期表(TDT):它给出了与当 前的时间和日期相关的信息,由于这些信 息更新频繁,所以需要单独使用一个表。
• 6、时间偏移表(TOT):它给出了与当前 时间、日期和本地时间偏移相关的信息, 由于这些信息更新频繁,所以需要单独使 用一个表。
CAT与NIT的结构图
• 从上面的几幅图中可知,要保证传送流能正常 接收,在该流中至少有一个完整有效的PAT。 CAT描述了节目的加密方式,它包含了节目的 EMM识别PID,只有授权的解码器才能由CAT 收到密钥,解码出相应的数据流。NIT包含节 目的频道调谐参数、频率、符号率等物理传输 网信息,这些信息使得接收机可以按照用户的 选择以很少的延时或无延时地改变频道、调谐 参数,正确地解码出TS。由于PSI数据的完整 性十分重要,因此在每个PSI段中均需要加校 验码。

ts 泛型详解

ts 泛型详解

泛型是TypeScript(TS)中一个重要的特性,它使得我们能够编写更加灵活和复用的代码。

在TypeScript 中,泛型是指在定义函数、接口或类时,不预先指定具体的类型,而是在使用时再指定类型的一种特性。

泛型的意义在于,它能够在保证类型安全的前提下,让函数、接口、类等与多种类型一起工作,从而实现复用。

通过泛型,我们可以编写更加通用的代码,使得代码更加灵活和可重用。

在TypeScript 中,泛型的写法是在标志符后面添加尖括号(<>),然后在尖括号里写形参。

例如:
function identity<T>(arg: T): T {
return arg;
}
在上面的例子中,identity 是一个泛型函数,<T> 是类型参数的声明,表示这个函数可以处理任何类型的数据。

arg 是函数的参数,它的类型是T,表示这个参数可以是任何类型的数据。

return 语句返回了arg 的值,它的类型也是T。

通过使用泛型,我们可以编写更加通用和灵活的代码。

例如,我们可以编写一个处理数组的函数,而不仅仅是处理数字或字符串的数组。

我们还可以编写一个处理任何类型的对象的函数,而不仅仅是处理特定的对象类型。

通过泛型,我们可以编写更加可重用的代码,从而减少代码的重复和冗余。

总的来说,泛型是TypeScript 中一个非常重要的特性,它使得我们能够编写更加灵活和复用的代码。

通过泛型,我们可以编写更加通用和可重用的代码,从而提高代码的复用性和可维护性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

TS数据结构分析1.TS包得数据结构2.// Transport packet headertypedef struct TS_packet_header{unsigned sync_byte : 8; //同步字节,固定为0x47 ,表示后面的是一个TS分组,当然,后面包中的数据是不会出现0x47的unsigned transport_error_indicator : 1; //传输错误标志位,一般传输错误的话就不会处理这个包了unsigned payload_unit_start_indicator : 1; //有效负载的开始标志,根据后面有效负载的内容不同功能也不同unsigned transport_priority : 1; //传输优先级位,1表示高优先级unsigned PID : 13; //有效负载数据的类型unsigned transport_scrambling_control : 2; //加密标志位,00表示未加密unsigned adaption_field_control : 2; //调整字段控制,。

01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。

为00的话解码器不进行处理。

unsigned continuity_counter : 4; //一个4bit的计数器,范围0-15} TS_packet_header;TS包头定义:typedef struct TS_packet_header{unsigned sync_byte : 8; //同步字节, 固定为0x47,表示后面的是一个TS分组unsigned transport_error_indicator : 1; //传输误码指示符unsigned payload_unit_start_indicator : 1; //有效荷载单元起始指示符unsigned transport_priority : 1; //传输优先, 1表示高优先级,传输机制可能用到,解码用不着unsigned PID : 13; //PIDunsigned transport_scrambling_control : 2; //传输加扰控制unsigned adaption_field_control : 2; //自适应控制01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。

为00解码器不进行处理unsigned continuity_counter : 4; //连续计数器一个4bit的计数器,范围0-15} TS_packet_header;TS包头解析代码:HRESULT CTS_Stream_Parse::adjust_TS_packet_header( TS_packet_header* TS_header ){unsigned char buf[4];memcpy(buf, TS_header, 4);TS_header->transport_error_indicator = buf[1] >> 7;TS_header->payload_unit_start_indicator = buf[1] >> 6 & 0x01;TS_header->transport_priority = buf[1] >> 5 & 0x01;TS_header->PID = (buf[1] & 0x1F) << 8 | buf[2];TS_header->transport_scrambling_control = buf[3] >> 6;TS_header->adaption_field_control = buf[3] >> 4 & 0x03;TS_header->continuity_counter = buf[3] & 0x0F; // 四位数据,应为0x0F xyy 09.03.18return 0;}3.PSI全称Program Specific Information,意为节目专用信息。

传输流中是多路节目复用的,那么,怎么知道这些节目在传输流中的位置,区分属于不同节目呢?所以就还需要一些附加信息,这就是PSI。

PSI也是插入到TS分组中的,它们的PID是特定值。

MPEG-2中规定了4个PSI,包括PAT(节目关联表),CAT(条件访问表),PMT(节目映射表),NIT(网络信息表),这些PSI包含了进行多路解调和显示节目的必要的和足够的信息.PSI的PID 是特定的,含PSI的数据包必须周期性的出现在传输流中。

PMT (Program Map Table )节目映射表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,一个节目包含多少个节目就含有多少PMT。

CAT (Conditional Access Table )条件访问表CAT所在分组的PID=1CAT中列出了条件控制信息(ECM)和条件管理信息(EMM)所在分组的PID。

CAT用于节目的加密和解密NIT( Network Information Table)网络信息表NIT所在分组的PID由PAT指定NIT提供一组传输流的相关信息,以及于网络自身特性相关的信息,比如网络名称,传输参数(如频率,调制方式等)。

NIT一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考。

几种PSI之间的关系,如下图所示:首先PAT中指定了传输流中所存在的节目,及每个节目对应的PMT的PID号。

比如Program 1对应的PMT 的PID=22,然后找到PID=22的TS分组,解出PMT,得到这个节目中包含的原始流的PID,再根据原始流的PID去找相应的TS分组,获取原始流的数据,然后就可以送入解码器解码了。

PSI由四张表构成:PAT,PMT,CAT和NIT,这四张表分别描述了一个TS所包括的所有ES流的传输结构。

首先的一个概念是,TS是以包形式传播,在编解码端都需要以一定的包ID来标识TS流里承载的内容,比如,PAT表会存在于一个或多个TS包里,所以要用一个特别的包ID来表示,另外,不同的ES流也需要不同的包ID来标识。

我们有了PAT 和PMT这两种表,解码器就可以根据PID,将TS上从不同ES来的TS包区分出来进行解码。

TS的解码分两步进行,其一,是从PID为0 的TS包里,解析出PAT表,然后从PAT表里找到各个节目源的PID,一般此类节目源都由若干个ES流组成,并描述在PMT表里面,然后通过节目源的PID,就可以在PMT表里检索到各个ES的PID。

其二,解码器根据PMT表里的ES流的PID,将TS流上的包进行区分,并按不同的ES流进行解码。

所以,TS是经过节目复用和传输复用两层完成的,即在节目复用时,加入了PMT,在传输复用时,加入了PAT。

同样在节目解复用时,可以得到PMT,在传输解复用时,可以得到PAT。

4.PAT表数据结构数据结构PAT Table//PAT Tableprogram_association_section() {table_id : 8; //固定为0x00 ,标志是该表是PATsection_syntax_indicator : 1; //段语法标志位,固定为1'0' : 1; //0reserved : 2; //保留section_length : 12; //表示这个字节后面有用的字节数,包括CRC32。

假如后面的字节加上前面的字节数少于188,后面会用0XFF填充。

假如这个数值比较大,则PAT会分成几部分来传输。

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

reserved : 2 //保留version_number : 5 //范围0-31表示PAT的版本号,标注当前节目的版本这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.current_next_indicator : 1 //表示发送的PAT是当前有效还是下一个PAT有效。

section_number : 8 //分段的号码。

PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段last_section_number : 8 //最后一个分段的号码for (i=0; i<N;i++) {program_number : 16 //节目号reserved : 3 //保留if(program_number == '0') {network_PID : 13 //网络信息表(NIT)的PID,网络信息表提供了该物理网络的一些信息,和电视台相关的。

节目号为0时对应的PID为network_PID }else {program_map_PID : 13 //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个}}CRC_32 : 32}//PAT表结构体typedef struct TS_PAT{unsigned table_id : 8; //固定为0x00 ,标志是该表是PAT unsigned section_syntax_indicator : 1; //段语法标志位,固定为1unsigned zero : 1; //0unsigned reserved_1 : 2; // 保留位unsigned section_length : 12; //表示这个字节后面有用的字节数,包括CRC32unsigned transport_stream_id : 16; //该传输流的ID,区别于一个网络中其它多路复用的流unsigned reserved_2 : 2;// 保留位unsigned version_number : 5; //范围0-31,表示PAT的版本号unsigned current_next_indicator : 1; //发送的PAT是当前有效还是下一个PAT有效unsigned section_number : 8; //分段的号码。

相关文档
最新文档