HLS使用整理

HLS使用整理
HLS使用整理

HLS使用整理

1任意精度数据类型

1.1HLS新的数据类型

C/C++数据类型:

图 1.1 C/C++数据类型

其中HLS中不支持char16_t和char32_t两种数据类型。在C/C++中,所有的数据位宽都是基于8-bit,即位宽都是8-bit的倍数,当在逻辑中使用时,会明显造成资源的浪费,因此HLS中引入了Arbitrary Precision Data Type。

HLS中的Arbitraty Precision Data Types:

图 1.2 HLS中任意精度数据类型和所需头文件

其中W表示数据长度;I表示整数长度;Q表示量化方式;默认的为

AP_TRN_ZERO,即Truncation to zero方式;O表示溢出模式,默认为AP_WPAP即Wrap Around方式。

图 1.3 AP类型的具体解释

eg1.截位方式的影响

ap_fixed<3,2> var1 = 1.25;

ap_fixed<3,2,AP_RDN> var2 = 1.25;

1.25的二进制表示为:0 1.0 1,按第一种方式默认的TRN模式,则会将后面的1直接砍掉,剩下0 1.0,得到实际的结果是1.0;第二种方式的RDN是4舍5入的方式,后面的1进位到前一位,得0 1.1,实际结果为1.5。

eg2.溢出方式的影响

ap_fixed<4,4> var3 = 19;

ap_fixed<4,4,AP_RND,AP_SAT> var4 = 19;

19的二进制表示为0 1 0 0 1 1,第一种方式截取低4位,得到0011,对应10进制3;第二种方式中,由于19大于4 bits无符号数能表示的最大范围,因此按最大值取,得15。

可以使用sizeof()函数来查看数据所占用的空间大小。

eg. ap_int<1> a; a占用1个Byte

ap_int<8> b; b也占用1个Byte

在VS中也可以使用HLS的任意数据类型,只需将VS工程的库路径设置为HLS的路径即可。当头文件中包含时,VS编译会报错,hsl_math.h 里面包含的几个其他的头文件中的错误,这是将hls_math.h改为cmath,再综合就没有错误了。

1.2变量初始化

变量可以使用copy initialization方式或者direct initialization()方式。

图 1.4 变量初始化方式

需要注意的是:

1.在定义单精度浮点数据类型时,需要有后缀f:

float var = 5.0(f)。

2.当常数参与到具体的运算中,要明确告知其数据类型:

a = a + ap_fixed<6,4>(0.25);

3.HLS中不支持的C/C++的代码方式:动态分配、涉及OS的和递归操作。

1.3数据类型的转换

有隐式转换和显式转换两种。

隐式转换:有promotion(扩展)和conversion(截取),其中promotion时会

自动扩符号位,当conversion时会截取低位。

显式转换:采用()或者调用函数的方式。

eg.

ap_uint<3> i3 = 4;

ap_uint<4> i4 = 10;

ap_ufixed<6,4> i5 = i4/i3; 结果2

ap_ufixed<6,4> i6 = (ap_fixed<6,4>)i4/i3; 结果2.5

ap_ufixed<6,4> i7 = ap_fixed<6,4>(i4)/i3; 结果2.5

可以用tpyeid()来获取数据的类型,需要typeinfo头文件。

1.4复合数据类型

复合数据类型包括struct和enum类型?

在HLS中对struct类型有Byte Pad的选项,可选field level和struct level类型,其中field level类型表示每个变量都要扩展为8-bit整数倍的位宽;struct level类型表示每个变量的实际位宽保留,但整体封装后要扩展为8-bit整数倍位宽?

对于enum类型,当在top level时,会当做一个具体的数据来应用。

1.5复数的应用

在使用复数时,应包含有头文件,并且使用std来定义一个复数,复数的乘法可以采用常规的分别计算实部和虚部的方式,如下图1.5所示。

图 1.5 复数的定义与使用

采用这种乘法方式进行了4次乘法和2次加法,也可以对该结构进行变换,

如下图1.6所示。用下面的这种方式,需要3次乘法和5次加法。

图 1.6 复数乘法的不同实现方式

2测试激励

当testbench仿真通过时返回0,仿真没通过时返回非0。

在读入文件数据时,先以int类型读入,再赋值给相应的变量,若直接以ap_int 类型读入可能会报错。

ScoreBoard:比较参考与实际输出,可以用if或者system两种方式,在比较时,可以设计能够容忍的误差。

System的使用方式:

CntErr = system(“diff –w mat_p.txt refp.txt”);

输出格式控制,使用left,right和interval来控制

(还没整理完)

3接口综合

3.1Interface Synthesis I/O Protocols

在HLS中Interface Synthesis又分为两个级别:Block Level和Port Level。

3.1.1Block Level

只能用于函数或者函数返回值。

三种Block Level协议:

①ap_ctrl_hs:产生ap_start,ap_ready,ap_idle,ap_done接口

②ap_ctrl_none:不使用Block Level Protocols

③ap_ctrl_chain:于ap_ctrl_hs相似,但会产生一个输入端口ap_continue,

会从其他读取该模块的模块中返回信号

从下图中可以看出ap_ctrl_hs和ap_ctrl_none的区别:

图 3.1 ap_ctrl_hs和ap_ctrl_none的接口区别

ap_start为高时表明该模块被启动,此时ap_idle会被拉低,ap_ready为高表明数据有效,ap_done表明该模块已处理完数据。

3.1.2Port Level

由下面的例子来说明Port Level的用法。

In1和in2是scalar类型的输入,in_out1为pointer的I/O端口,那么默认情况下,综合后in1和in2被综合成ap_none类型,in_out1被分成两个端口,其中输出端口又多了一个指示信号,这三个端口都是ap_ovld类型。如下图3.2所示。

图 3.2 默认情况下综合结果

当对in1加入ap_vld指令,in2加入ap_ack指令,in_out1加入ap_hs指令时,会出现如图3.3的综合结果。

图 3.3 更改后的综合结果

从图中可以看出,in1端口多了一个in1_ap_vld信号,in2端口多了一个in2_ap_ack信号,in_out1端口多两个vld和ack信号。

其中ap_hs类型包括下面两种信号,ap_vld和ap_ack。

下图3.4列出了所有的接口综合支持的情况,从图中可以对应到上面的例子中情况。

图 3.4 接口综合支持

下面对接口综合的默认情况进行总结,如图 3.5所示。Block Level协议有ap_ctrl_hs、ap_ctrl_none和ap_ctrl_chain三种,scalar的返回值类型和输出的pointer或reference类型默认有ap_vld协议,输入scalar和输入pointer或reference 默认为ap_none,I/O的pointer或reference默认为ap_ovld协议。

图 3.5 接口综合默认情况总结

3.2数组

在top-level函数中的数组,会综合为RAM模块。通过directives,我们可以进行下面的操作:

①选择单端口RAM还是双端口RAM;

②选择RAM还是FIFO;

③对数组进行分割和重组。

通过下面的例子对数组进行分析,在该例中,在默认情况下d_o和d_i被综

合为ap_memory协议,且输出端口多了address、ce和we信号,输入端口多了address和ce信号。

图 3.6 数组的默认综合结果

这里要注意的是,当选择ap_fifo协议时,数据必须是stream的。

3.3添加寄存器

在默认情况下,HLS是不会为输入输出端口添加寄存器的,因此需要在软件中指定添加寄存器的功能。但需要注意的是,添加寄存器时,必须保证接口协议是ap_ctrl_hs的。

3.4config_rtl

config_rtl指定状态机的编码方式,也可以指定复位的相关状态(同步复位或异步复位、高有效或低有效)

3.5全局使能信号

在solution的general选项中,添加config_interface,选中下面的clk enable,即可添加全局使能信号。

4FOR循环优化

4.1基本概念

从下面的例子中来解释for循环中的基本概念:

图 4.1 for循环基本概念

由于N等于3,因此每次循环可以分成4个步骤来完成:

c0:读取数据b和c;

c1:获取数据xin 0处地址;

c2:读取对应地址上的数据;

c3:计算yo[0]的值。

后面的计算都是三个时钟周期计算出一个值,因此对一次循环来说,Loop Iteration Latency为3,Loop Iteration Interval也是3,Loop Latency是9,再加上前面读b和c的值的一个周期,整个函数的Latency是10,函数间的Initial Interval 是11.

4.2Pipeline

对for循环常用的优化是pipeline,pipeline的原理如下图4.2所示。

图 4.2 pipeline优化原理

在优化结束后,Loop Iteration Latency为3,Loop Iteration Interval变成1,Loop Latency为5.

如果对函数做pipeline,那么会自动把函数下面的for循环都做unrolling处理;如果对外层的for循环做pipeline,那么会自动对内层的for循环做unrolling处理。

4.3Unrolling

默认情况下for循环是折叠的,就是电路被时分复用。当展开后,资源增加。如下图所示将for循环展开成3倍的情况,资源也扩大了3倍。

图 4.3 展开成3倍

也可以部分展开,循环次数为6,但展开成3倍,程序如下所示:

展开后,程序被分成3部分,资源也复制了3份。

图 4.4 Unroll的设置

4.4Merge

当几个for循环执行的内容很相似时,如下面的程序所示:

两个for循环分别对两个数据做加法和减法,在HLS综合后,会先进行第一个for循环的计算,完成后再进行第二个for循环的计算。这样综合出的Latency 为18,Interval为19。

图 4.5 综合后延迟

在HLS中提供了Merge的选项,合并的是for所作用的region,合并后综合后的延迟如下图4.6所示。

图 4.6 Merge后的延迟

上面的例子中两个循环的边界相同,如果两个循环的边界不同,则以最大的作为合并后的边界;如果一个边界是变量,另一个是常量,则不能合并;如果两个循环边界都是变量,依然不能合并。

还可以将for循环封装成一个函数,并在上一层中例化两次,并对函数采用Allocation来使函数并行执行,在allocation中有limit选项,可以指定实例化的次数,该数据与程序中实际的数值应该是一样的。

4.5数据流

在下面的例子中,Task B依赖于Task A,Task C依赖于Task B,如图4.7所示。

图 4.7 程序结构

而且可以分析出,该结构不适合之前所讲的pipeline和merge方式进行处理,在可以使用dataflow的方式。

图 4.8 Dataflow的执行方式

从图中可以看出,在使用DataFlow后,Loop B无需等待A执行完成后才开始执行,而且各个Loop之间也村在间隔。且延迟和资源都明显减少,如图4.9所示。

图 4.9 DataFlow后的延迟和资源对比

DataFlow使用的限制:

1.一个输出在多个Loop模块中使用

2.被Bypass的模块

3.带反馈的模块

4.带条件的模块

5.可变循环边界的模块

6.多个退出条件的模块

下面分别对上面的限制条件进行说明。

1.din在Loop1中输出的temp1同时赋给Loop2和Loop3使用,这时是不能使用dataflow的,如图4.10所示。

图 4.10 DataFlow限制1

通过对代码进行适当的修改,将其结构进行变形,增加一个Loop_copy模块,将其输出一个送个Loop2,另一个输出送给Loop3,但其实这两个输出的结果是相同的。就可以使用DataFlow来完成该函数,如图4.11所示。

图 4.11 结构变换使用DataFlow

且使用了DateFlow后,工程所占用的资源和延迟都相应减少。

2. 被Bypass的模块

如下图4.12所示的例子中,temp1在Loop2中使用,但temp2没有经过Loop2,直接在Loop3中使用,这种情况下也是不能使用DataFlow的。

图 4.12 Bypass模式

同样的,可以对代码进行优化以达到可以使用DataFlow的目的,如下图4.13

所示。在Loop2中,增加一个输出端口,使其输出给Loop3,这样就可以使用DataFlow了。

图 4.13 优化Bypass

在DataFlow的循环之间的存储模块,对于scalar、pointer和reference或者函数的返回值,HLS会综合为FIFO;对于数组,结果可能是乒乓RAM或者FIFO:如果HLS可以判断数据是流模式,就会综合为FIFO,且深度为1,若不能判断,就会综合为乒乓RAM。我们也可以指定为FIFO或者乒乓RAM,但在指定为FIFO 时,如果指定的深度不合适,综合时就会出现错误。

4.6嵌套for循环

三种嵌套循环:

对于Perfect Loop,对外边的Loop做流水比对内循环做流水更加节省时间。

对于Imperfect Loop,我们总希望可以转换为Perfect Loop或者Semi-Perfect Loop。如下的Imperfect Loop,如果对内层Product做流水,综合结果如右侧的图所示。

图 4.14 内层做流水的结果

如果对第二层即col的Loop做流水,则会提示信息,col下的循环会被展开。

图 4.15 Col层做流水的结果

从图中的warning可以看出,a被综合为一个双端口的RAM,但第14行和第20行对a的操作有一个重叠的区域,意味着吞吐率受限。

如果对最外部的循环做流水,会把下面所有的循环都展开,延迟会减少,但资源会增加。

如果对整个函数做流水,那么函数下面的所有循环都会展开,能获得最好的Latency,但资源也是最多的。

我们可以对代码就行优化,具体代码具体优化。

4.7Rewind

我们在使用了pipeline后,循环之间仍然会有间隔,但使用rewind功能,可以消除该间隔,如下图所示。

图 4.16 rewind功能

但当函数中有多个循环时,rewind不能使用。

4.8自动添加流水

在config_compile中,可以设置自动添加流水操作,如果循环次数小于我们设定的pipeline loops时,HLS就会自动为for循环添加流水。

在使用config_compile后,如果不想对某些for循环做流水,就可以在pipeline 下面的选项中选中disable Loop pipeline。

4.9变量边界的解决方法

当循环边界为变量时,通常可以采用下面的方式进行处理。

1.使用tripcount directive;

2.对于边界变量的定义使用ap_int;

3.在C代码中使用assert宏。

Tripcount directive不会对综合有任何的影响,它只会对报告的显示有影响。

使用ap_int和assert方法后,综合后的资源会有明显的减少。采用assert的方式的资源和延迟是最少的。

ts流解析规则

HLS,Http Live Streaming是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP 协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列标签组成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./1.ts #EXTM3U:每个M3U8文件第一行必须是这个tag。 #EXT-X-TARGETDURATION:指定最大的媒体段时间长度(秒),#EXTINF中指定的时间长度必须小于或等于这个最大值。该值只能出现一次。 #EXTINF:描述单个媒体文件的长度。后面为媒体文件,如./0.ts 2、ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

注:详解如下 (1)ts层ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。ts header固定4个字节;adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes 数据。 ts header

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时钟提供同步资料,进行同步。其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也

TS流信息描述2

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为空分组保留。从PID可以判断其后面负载的数据类型是视频流、音频流、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)

ts流解析规则

HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP 协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。 1、M3U8文件 用文本方式对媒体文件进行描述,由一系列标签组成。 #EXTM3U #EXT-X-TARGETDURATION:5 #EXTINF:5, ./0.ts #EXTINF:5, ./1.ts #EXTM3U:每个M3U8文件第一行必须是这个tag。 #EXT-X-TARGETDURATION:指定最大的媒体段时间长度(秒),#EXTINF中指定的时间长度必须小于或等于这个最大值。该值只能出现一次。 #EXTINF:描述单个媒体文件的长度。后面为媒体文件,如./0.ts 2、ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts文件分为三层:ts层Transport Stream、pes层 Packet Elemental Stream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

注:详解如下 (1)ts层 ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。ts header固定4个字节;adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充;payload是pes数据。 ts header sync_byte 8b 同步字节,固定为0x47 transport_error_indicator 1b 传输错误指示符,表明在ts头的adapt域后由一个无用字节,通常都为0,这个字节算在adapt域长度内 payload_unit_start_indicator 1b 负载单元起始标示符,一个完整的数据包开始时标记为1 transport_priority 1b 传输优先级,0为低优先级,1为高优先级,通常取

TS流解析

#include #include using namespace std; struct programs //封装节目信息的结构体 { int programID;//节目编号 int pmtPID;//所属PMT的pid int videoPID;//视频pid int audioPID1;//音频pid int audioPID2;//音频pid }myProg[20]; bool FindAndParsePAT(unsigned char *buffer,int pID,int curPack);//传入BUF和PID的值bool FindAndParsePMT(unsigned char *buffer,int pID,int curPack); int program=0; int prog_count=0; void main() { unsigned char *buffer=new unsigned char[500]; int startPos=0;//第一个TS分组在流中的位置序号 int packageLen=0;//分组长度 int pmtCount=-1;//PMT表序号 int pID=0; int nullpack=0; //0.以二进制方式打开TS文件 ifstream myFile("test.ts",ios::binary|ios::in); //1.读入文件的前500个字节,找同步头、确定包长 myFile.read((char *)buffer,500); for(int i=0;i<500;i++) { //判断有无压缩 if(buffer[i]==0x47&&buffer[i+188]==0x47) { startPos=i;//第一个TS分组在流中的位置序号 packageLen=188;//分组长度 break; } else if(buffer[i]==0x47&&buffer[i+204]==0x47) { startPos=i; packageLen=204; break; } }

MPEG-2 TS 码流编辑的原理与应用

MPEG-2 TS 码流编辑的原理与应用 在当今数字媒体不断发展、新媒体业务不断涌现的前提下,实践证明襁褓中的新媒体只有两种经营方略可供选择:或是购买并集成整套节目,或是低成本深加工新节目,再不可能去按照传统生产模式去自采自编。低成本的节目生产制作与发布,不仅成为数字媒体经营的主要手段,也成为传统媒体“改革工作流程”的重要举措,进而促成了对新型工作母机和简捷快速流程的迫切需求。 在辽宁新媒体多业务综合服务平台上,先于国际和国内应用了MPEG-2传输流快速剪辑编辑系统(以下简称码流快编)。这项由辽宁电视台与深圳奥维迅公司在2003年10月联合开发的新技术,为数字媒体低成本节目的制作、推广和运营提供了高效生产工作母机。尽管担负此项目源代码开发的奥维迅公司出现了经营问题,在技术推广的中间环节发生梗塞,但并不能说明此项技术走到了尽头。回顾3年的应用实践及研发成果,需要的不是扬弃,而是演进的升级,否则就是对可调控资源的莫大浪费。特别是针对第二代信源编解码国标AVS-P2的更新换代,很可能成为多业务内容整合的新一代产品的突破口。 一工作原理 1. 功能目标 码流快编的应用目标是,通过对开放视频的采集,将DVB-S或C的传输流(Transport Stream,TS)节目作为信源,直接进行剪辑处理,再经过人工创意后,整合为新主题内容的新节目,以便直接进入频道集成或编辑频道节目播出,快速实现数据层的内容整合,不仅简捷了采集制作的工作流程,而且为丰富媒体内容资产开辟了一条捷径。因为码流快编的工作流程无需先以解码后的视频记录于磁带,再以磁带上载编辑机,经编辑后再下载成为磁带,再编码复用成为新内容的新节目。即便数字化完成以后,视频数据流仍不能用于经复用的数字传输,还需编码、转码、打包等传输格式化以后,才能在数字信道上传输。而采用码流快编以后,不仅避免了解码后再采样编码所形成的视频损耗,还避免了在1∶1时间的上下载中所造成的效率损耗。更重要的是在视频内容整合中,一次性完成音/视频同步剪切、字幕处理和音/视频数据打包复用等连续作业。所以,它能够提高生产效率60%以上。必要时还可进行节目包装的特技编辑,直接创建数据级和文件级的互联互通内容交换平台,在媒体资产管理下,顺利实现网络化与智能化的节目配送与发布。 由于码流快编是针对以TS为信源的再编辑系统,所以实行“高来高走,低来低走”,或是“高来低走”的应用策略,即高码率对应高码率(包括兼容高清),低码率对应低码率,但码率连续可调,以适应高码率对应低码率的应用。理论和应用都说明,对比源节目和成品节目,经剪切和编辑处理的图像保持了同等的视频质量,成为不劣化图像的创新工作流程和新型工作母机。 2. 设计特征

TS流解析之PMT表格解析

TS流解析之PMT表格解析 2010-12-14 08:44 TS流解析之PMT表格解析 PMT结构定义: typedef struct TS_PMT_Stream { unsigned stream_type : 8; //指示特定PID的节目元素包的类型。该处PID由elementary PID指定 unsigned elementary_PID : 13; //该域指示TS包的PID 值。这些TS包含有相关的节目元素 unsigned ES_info_length : 12; //前两位bit为00。该域指示跟随其后的描述相关节目元素的byte数 unsigned descriptor; }TS_PMT_Stream; //PMT 表结构体 typedef struct TS_PMT { unsigned table_id : 8; //固定为0x02, 表示PMT表 unsigned section_syntax_indicator : 1; //固定为0x01 unsigned zero : 1; //0x01 unsigned reserved_1 : 2; //0x03 unsigned section_length : 12;//首先两位bit置为00,它指示段的byte数,由段长度域开始,包含CRC。 unsigned program_number : 16;// 指出该节目对应于可应用的Program map PID unsigned reserved_2 : 2; //0x03 unsigned version_number : 5; //指出TS流中Program map section的版本号 unsigned current_next_indicator : 1; //当该位置1时,当前传送的Program map section可用; //当该位置0时,指示当前传送的Program map section不可用,下一个TS 流的Program map section有效。 unsigned section_number : 8; //固定为0x00 unsigned last_section_number : 8; //固定为0x00 unsigned reserved_3 : 3; //0x07 unsigned PCR_PID : 13; //指明TS包的PID值,该TS包含有PCR域, //该PCR值对应于由节目号指定的对应节目。 //如果对于私有数据流的节目定义与PCR无关,这个域的值将为

TS码流分析

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为空分组保留。从PID可以判断其后面负载的数据类型是视频流、音频流、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)

TS流解析

传输流(TS) 将具有共同时间基准或具有独立时间基准的一个或多个PES组合而成的单一的数据流称为传输流(Transport Stream)。TS实际是面向数字化分配媒介(有线、卫星、地面网)的传输层接口。对具有共同时间基准的两个以上的PES 先进行节目复用,然后再对相互可有独立时间基准的各个PS进行传输复用,即将每个PES再细分为更小的TS包 TS包由包头、自适应区和包数据3部分组成。每个包长度为固定的188B,包头长度占4 B,自适应区和包数据长度占184B。184B为有用信息空间,用于传送已编码的视音频数据流。当节目时钟基准(PCR-Program Clock Reference)存在时,包头还包括可变长度的自适应区,包头的长度就会大于4B。考虑到与通信的关系,整个传输包固定长度应相当于4个ATM包。考虑到加密是按照8B 顺序加扰的,代表有用信息的自适应区和包数据的长度应该是8B的整数倍,即自适应区和包数据为23×8B =184B。 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个部分组成。 TS包语法结构如下:

TS流分析软件EasyICE使用方法简介

龙源期刊网 https://www.360docs.net/doc/b45524245.html, TS流分析软件EasyICE使用方法简介 作者:陈晓军 来源:《卫星电视与宽带多媒体》2012年第09期 TS流分析软件EasyICE使用方法简介 笔者以深圳生产的DVBWorld 2102S USB多媒体数据接收盒为例向大家介绍详细使用过程,将接收盒硬件和软件全部安装好,然后依次点击“开始”→“所有程序”→“DVBWorld” →“TsCapture”项,打开TS流录制程序,如,点击“ LOCK”按钮可设置待录制TS流的下行频率、极化方式和符码率等参数,“Max File Size”是修改保存文件的大小,通过“Set Path”按钮设置好保存的文件名和位置(注意:保存文件的扩展名可以更改为TS,如图2),然后点击“Start Capture”便开始保存码流文件了,单击“Stop Capture”按钮可以停止录制。 接下来就是分析TS流文件的操作了。通过菜单栏或工具栏打开一个 TS 文件或将文件拖动到 EasyICE内,可根据实际所需调协范围:整个文件或抽样分析,通常选择整个文件来分析,虽然多花点时间,但分析效果会更好。当文件分析完毕后,软件主界面上会出现播放器、MediaInfo、PSI/SI、PID、图表和数据包四个选项标签,其中的播放器窗口会被初始化并处于暂停状态,单击播放按钮便开始播放节目(注:若TS流包含多路节目的话,则必须先在右上角选定某路节目才能播放),如图3所示。播控按钮依次为:播放、暂停、停止、降低播放速度、加大播放速度及逐帧播放,播放速度的调整分七个级别:1/4 速、1/3 速、1/2 速、正常速度、2 倍速、3 倍速和四倍速。当前播放速度会在“质量”区显示,“节目”区列出了当前流中所 含有的节目,展开可以看到节目的视频、音频和PCR三个PID;“质量”区显示了当前播放媒体的简单信息,如播放速度等,不过由于软件问题有些数据获取不到或存在问题,请以“媒体信息”栏检测结果为准。特别声名,软件首先会查找流中的 PSI/SI 信息,如果存在将按照 PSI/SI 信息解析,如果不存在软件将自己尝试检测视音频 PID 及 PCRPID,如果没有看到播放器画面,表明软件没有找到视频流或没有找到 PCR。 MediaInfo媒体信息标签模块显示了包括图像大小、编码格式、码率大小、彩色制式及场频等几乎所有的音视频详细参数,见图4所示。 PSI/SI标签模块对所有的 PSI/SI 进行了解析,当流中存在 PSI/SI 数据时,会在此模块会一一列出,在视图中点击鼠标右键,可以展开/折叠所有节点,见图5所示。 PID标签模块以统计的方式列出当前 TS 流中各个 PID 出现的数量及占用百分比及所属类型等,如图6所示。 图表标签模块。当流中存在多路节目时,图标界面会显示一节节目选择对话框,单击可以显示相应节目图表。包括:1、时间戳信息。时间戳图表显示的是DTS、PTS 出现时与 PCR 的采样。与“PCR 抖动” 图表相同的是,时间戳以 PCR 时钟为基准。DTS与PTS值取自视频流中

解析TS流PAT和PMT 代码

#include #include #include #define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS文件的绝对路径 void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读一个TS流的packet int parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的table void parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数目和PMT的PID void pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的table void parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PID void printf_program_list(); //打印PMT table中包含的stream的类型和PID unsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的table typedef struct { unsigned short program_num; //program's num unsigned short pmt_pid; // }PROGRAM; typedef struct { unsigned char stream_type; unsigned short elementary_pid; }PRO_LIST; PROGRAM programs[10] = {{0,0}}; //用来存储PMT的PID和数量unsigned int num = 0; //total program PRO_LIST program_list[10] = {{0,0}}; //用来存储PMT中stream的类型和PID unsigned int program_list_num = 0; FILE *file_handle; //指向TS流的指针 unsigned int FileSize = 0;

TS流分析

TS流分析 图一 MPEG-2定义了一些用来描述传输流所携带内容的信息表,称为节目特定信息(PSI)表,包括4个与之相关的表。其中,节目关联表PAT和节目映射表PMT是确定当前传输流中各节目内容的最关键的两个表。 在接收到TS流时我们首先找到PA T表,因为只有找到PAT表才能确定PMT表才能知道哪些是我们要播放的音频数据和视频数据 在开始之前先给出一片实际TS流例子: 0000f32ch: 47 40 00 170000 B0 0D 00 01 C1 00 00 00 01 E0 ; G@....?..?...? 0000f33ch: 20 A2 C3 29 41 FF FF FF FF FF FF FF FF FF FF FF ; ⒚)A 0000f34ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f35ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f36ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f37ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f38ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f39ch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f3ach: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; 0000f3bch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ;

TS188字节流结构图(转载)

TS 188字节流结构图(转载) chenjijun3011 收录于2009-12-24 阅读数:查看收藏数:61公众公 开原文来源 tags:TV 修改 以文找 文 推荐给 好友 如何对文章标记,添加 批注? MEPG2 -TS小结 2007/04/30 15:08 应该说真正了解TS,还是看了朋友推荐的《数字电视业务信息及其编码》一书之后,MPEG2 TS和数字电视是紧密不可分割的,值得总结一下其中的一些关系。 ISO/IEC-13818-1:系统部分; ISO/IEC-13818-2:视频; ISO/IEC-13818-3:音频; ISO/IEC-13818-4:一致性测试; ISO/IEC-13818-5:软件部分; ISO/IEC-13818-6:数字存储媒体命令与控制; ISO/IEC-13818-7:高级音频编码; ISO/IEC-13818-8:系统解码实时接口; MPEG2系统任务包括: 1. 规定以包传输数据的协议; 2. 规定收发两端数据流同步的协议; 3. 提供多个数据流的复用和解复用协议; 4. 提供数据流加密的协议。以包形式存储和传送数据流是MPEG2系统之要点。 ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码数据流的统称。ES流经过PES打包器之后,被转换成PES包。PES包由包头和payload组成,具体格式摘录如下:

可以看到PTS/DTS是打在PES包里面的,这两个parameters是解决视音频同步显示,防止解码器输入缓存上溢或下溢的关键。PTS表示显示单元出现在系统目标解码器(STD: system target decoder)的时间,DTS表示 将存取单元全部字节从STD的ES解码缓存器移走的时刻。每个I、P、B帧的包头都有一个PTS和 DTS,但PTS与DTS对B帧都是一样的,无须标出B帧的DTS。对I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明PTS和DTS。 上面介绍过,ES首先需打包成PES流包,然后PES根据需要打包成PS或TS包进行存储或传输。其每路ES只包含一路信源的编码数据流,所以每路PES也只包含相对应信源的数据流。 对PS流而言,每个PES包头含有PTS和DTS,流识别码,用于区别不同性质ES。然后通过PS复用器将PES 包复用成PS包。实际上是将PES 包分解为更细小的PS包。在解码的时候,解复用器将PS分解成一个个PES 包,拆包器然后将PES包拆成视频和音频的ES,最后输入至各自解码器进行解码。一个问题是:各个ES在解码时,如何保证视音频的同步呢?除了PTS和DTS的配合工作外,还有一个重要的参数是SCR(system clock reference)。在编码的时候,PTS,DTS和SCR都是由STC(system time clock)生成的,在解码时,STC会再生,并通过锁相环路(PLL-phase lock loop),用本地SCR相位与输入的瞬时SCR相位锁相比较,以确定解码过程是否同步,若不同步,则用这个瞬时SCR调整27MHz的本地时钟频率。最后,PTS,DTS和SCR一起配合,解决视音频同步播放的问题。PS格式摘录如下:

TS流解析源码

非常实用的解析TS流源码 废话不说,直接上传源码。 TsParser.cpp: #include "stdafx.h" #include "crc.h" #include "log.h" #include "xstring.h" #include "Xml.h" #include "osfile.h" #include "TsParser.h" #include "OcgMem.h" #include "MptsTransfer.h" #include "main.h" #include "osfile.h" #include "osdir.h" /* TS流分析器*/ CTsParser::CTsParser() { m_pat_filter = NULL; m_pat_buf = NULL; m_pat_size = 0; m_sdt_filter = NULL; m_bufsize = 12*188*1024; m_head = 0; m_tail = 0; m_buf = (unsigned char*)OCG_MALLOC( m_bufsize ); } CTsParser::~CTsParser() { uint16_t pmt_pid, serv_id; SProgInfo spi; TSSDTInfo sdt; void *position; if( m_pat_filter ) { m_demux.DestroyFilter( m_pat_filter ); m_pat_filter = NULL; }

if( m_pat_buf ) { OCG_FREE( m_pat_buf ); m_pat_buf = NULL; } if( m_sdt_filter ) { m_demux.DestroyFilter( m_sdt_filter ); m_sdt_filter = NULL; } if( m_buf ) { OCG_FREE( m_buf ); m_buf = NULL; } position = m_pmtmap.GetFirst( &pmt_pid, &spi ); while( position ) { if( spi.filter ) m_demux.DestroyFilter( spi.filter ); if( spi.pmt_buf ) OCG_FREE( spi.pmt_buf ); position = m_pmtmap.GetNext( &pmt_pid, &spi, position ); } m_pmtmap.RemoveAll(); /* 清除SDT信息*/ position = m_sdtmap.GetFirst( &serv_id, &sdt ); while( position ) { if( sdt.sdt_service_node ) { TSSDTServiceInfo *serv_del, *serv_tmp = sdt.sdt_service_node; while( serv_tmp ) { serv_del = serv_tmp; serv_tmp = serv_tmp->next; serv_del->next = NULL; OCG_FREE( serv_del ); } } if( sdt.sdt_multilingual_node ) { TSSDTMultilingualInfo *multi_del, *multi_tmp = sdt.sdt_multilingual_node; while( multi_tmp ) {

FFMpeg对MPEG2 TS流解码的流程分析

一、FFMPEG中MPEG2 TS流解码的流程分析 (1) 二、mpegts.c文件分析 (11) 一、 FFMPEG中MPEG2 TS流解码的流程分析 说道具体的音频或者视频格式,一上来就是理论,那是国内混资历的所谓教授的做为,对于我们,不合适,还是用自己的方式理解这些晦涩不已的理论吧。 其实MPEG2是一族协议,至少已经成为ISO标准的就有以下几部分: ISO/IEC-13818-1:系统部分; ISO/IEC-13818-2:视频编码格式; ISO/IEC-13818-3:音频编码格式; ISO/IEC-13818-4:一致性测试; ISO/IEC-13818-5:软件部分; ISO/IEC-13818-6:数字存储媒体命令与控制; ISO/IEC-13818-7:高级音频编码; ISO/IEC-13818-8:系统解码实时接口; 我不是很想说实际的音视频编码格式,毕竟协议已经很清楚了,我主要想说说这些部分怎么组合起来在实际应用中工作的。 第一部分(系统部分)很重要,是构成以MPEG2为基础的应用的基础. 很绕口,是吧,我简单解释一下:比如DVD实际上是以系统部分定义的PS流为基础,加上版权管理等其他技术构成的。而我们的故事主角,则是另外一种流格式,TS流,它在现阶段最大的应用是在数字电视节目的传输与存储上,因此,你可以理解TS实际上是一种传输协议,与实际传输的负载关系不大,只是在TS中传输了音频,视频或者其他数据。先说一下为什么会有这两种格式的出现,PS适用于没有损耗的环境下面存储,而TS则适用于可能出现损耗或者错误的各种物理网络环境,比如你在公交上看到的电视,很有可能就是基于TS的DVB-T 的应用:) 我们再来看MPEG2协议中的一些概念,为理解代码做好功课: l ES(Elementary Stream): wiki上说“An elementary stream (ES) is defined by MPEG communication protocol is usually the output of an audio or video encoder” 恩,很简单吧,就是编码器编出的一组数据,可能是音频的,视频的,或者其他数据。说到着,其实可以对编码器的流程思考一下,无非是执行:采样,量化,编码这3个步骤中的编码而已(有些设备可能会包含前面的采样和量化)。关于视频编码的基本理论,还是请参考其它的资料。 l PES(Packetized Elementary Stream): wiki上说“allows an Elementary stream to be divided into packets” 其实可以理解成,把一个源源不断的数据(音频,视频或者其他)流,打断成一段一段,以便处理. l TS(Transport Stream): l PS(Program Stream): 这两个上面已经有所提及,后面会详细分析TS,我对PS格式兴趣不大. 步入正题 才进入正题,恩,看来闲话太多了:(,直接看Code. 前面说过,TS是一种传输协议,因此,对应到FFmpeg,可以认为他是一种封装格式。

mpeg2 ts流PAT,PMT,SDT的定义

更具体准确的信息请参考iso13818-1,都在里面定义的 PAT的定义: Table_id:为8bit字段,该字段标识节目关联分段,对于PAT,置为0x00。 Section_syntax_indicator:1bit字段,对于PAT,置为 0x01。 Reserved:2bit保留字段,用于将来扩展,置为11。 Section_length:12bit字段,指示当前section的长度,计数值 从分段长度下一个字节开始,包括CRC校验的4个字节,开头两 位置为00,因此其大小不超过1021。 Transport_stream_id:16bit字段,当前TS流的ID,与网络中其 他TS流相区别,由运营商指定。 Reserved:2bit保留字段,用于将来扩展,置为11。 Version_number:5bit字段,指出PAT表的版本号,一旦PAT表有变 化,其版本号增1,当增至31时,恢复至0。 Current_next_indicator:1bit,置为1时,表示传送的PAT当 前有效,置为0表示PAT下一次有效。 Section_number:8bit字段,表示section的数目,从0x00开 始。 Last_section_number:8bit字段,指出最后一个section号, 即PAT表section的最大数目。 Program_number:16bit字段,指出了节目对于哪一个PMT PID是可用的,当为0x00时,后面的PID对应于NIT。 Reserved:3bit保留字段,用于将来扩展,置为111。 Network_id:13bit字段,NIT PID。 Program_map_PID:13bit字段,对应于program_number 所指定的节目的program_map_section的PID,从上面可看出:一个program用4字节来表示(包括16bit的program_number与13bit的PID)。 CRC:用来证实数据正确性的循环冗余校验码。 (section_number和 last_section_number的功能是当PAT内容>184字节时,PAT表会分成多个段(sections),解复用程序必须在全部接收完成后再进行PAT的分析) PMT定义如下: 各字段含义如下: table_id:8bits的ID,应该是0x02 section_syntax_indicator:1bit的段语法标志,应该是''1'' ''0'':固定是''0'',如果不是说明数据有错. reserved:2bits保留位,应该是''00'' section_length:16bits段长度,从program_number开始,到CRC_32(包含)的字节总数.

相关主题
相关文档
最新文档