ts流解析规则

合集下载

什么是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流解析原理

ts流解析原理

ts流解析原理TS流解析原理是指对TS(Transport Stream)流进行解析的过程,TS流是一种用于传输媒体数据的封装格式,常用于广播和卫星传输等领域。

TS流解析的主要步骤如下:1. TS包解析:TS流由一系列固定大小的TS包组成,每个TS包的大小为188字节。

TS包由头部和数据两部分组成,头部包含了一些基本的信息,如同步字节、计数器等。

解析器需要将每个TS包抽取出来,并解析其头部信息。

2. PID(Packet Identifier)解析:每个TS包中都包含一个PID字段,用于标识不同的数据包或流。

解析器需要根据PID字段的值将TS包中的数据分发到对应的处理模块。

3. PAT(Program Association Table)解析:PAT是TS流中的一个重要表格,用于指示包含在TS流中的其他表格的位置。

解析器首先需要解析出PAT表,获取到其他表格的PID值。

4. PMT(Program Map Table)解析:PMT表是TS流中的另一个重要表格,用于描述媒体流的相关信息,如音视频编码类型、PES(Packetized Elementary Stream)的PID等。

解析器需要根据PAT表获取到的PID值,解析出对应的PMT表。

5. PES解析:PES是TS流中常见的一种封装格式,用于封装音视频等媒体数据。

解析器需要根据PMT表中的PID值,解析出对应的PES数据。

6. 解码处理:解析器将解析出来的音视频等媒体数据交给相应的解码器进行解码,进一步处理和播放。

总的来说,TS流解析原理主要包括了对TS包、PID、PAT表、PMT表和PES数据的解析处理过程。

通过对TS流的解析,可以获取到媒体数据的相关信息,并进行进一步的处理和播放。

ps流与ts流

ps流与ts流

??举例说,一个TS流包括100个包,其中PSI信息包占20个,PES数据包80个,此TS流中只有一套节目流,不含有私有流,所以从这80个PES包中?的负载连接在一起,就是2个PES流(视频,音频),如果每个PES包的负载长度为100字节,则这两个PES流一共长度为8000个字节.假设其中视频?的PES流长度为6000字节.则视频的6000字节的PES流,是由PES包组成的.PES包没有固定的长度,而是由包头部的数据给出.而PS也是类似?TS流分解的方式,逆向的由PES包封装差异,导致了它们对传输误码具有不同的抵抗能力,因而应用的环境也有所不同。TS码流由于采用了固定长度的包结构,当传输误?码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一?PS包的同步信息丢失,接收机无法确定下一包的同步位置,?就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流?如DVD等等。?由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流。????
简单说就是ps流(主要用在DVD上)如是中间丢了一断码流,后面的都没法播了;而TS流(DVB-T,DMB-TH等)如果断了码流,后面的随时可以再开始解码怎么看都行。?DVB-T,DVB-H,DMB-TH?主要指的是调制解调(信道编码和解码)方式为COFDM,信源编解码采用的都是MPEG-2,TS流。?目前地面波数字电视标准中只有日本的ISDB?采用MPEG-4(H.264)编解码。?清晰度方面,DVB-T,DMB-TH标准都可以达到高清标准,DVB-H主要面向手持设备,接收终端的解析度有限。

视频知识基础:什么是TS、PS流

视频知识基础:什么是TS、PS流

视频知识基础:什么是TS、PS流?在MPEG-2系统中,信息复合/分离的过程称为系统复接/分接,由视频,音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流(TS:TransportStream)。

据传输媒体的质量不同,MPEG-2中定义了两种复合信息流:传送流(TS)和节目流(PS:ProgramStream)TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。

PS包与TS包在结构上的这种差异,导致了它们对传输误码具有不同的抵抗能力,因而应用的环境也有所不同。

TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS 包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。

而PS包由于长度是变化的,一旦某一PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。

因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS 码流如DVD等等。

由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流。

TS/PES是MPEG定义的标准格式,无论是MPEG1还是MPEG2都给出了包含比特流句法在内的定义,我们所说的TS/PS都是在这里定义的。

因此谈到TS/PS时仍然离不了MPEG,虽然A VS及IP的数据也可以封装在TS中,因为MPEG中给TS/PES的定义中允许封装其他数据。

虽然也许可以不经改变的将不同编码格式的码流经由TS/PS传送,但这事实上这是对MPEG的利用或扩充。

通常情况下,封装不同类型数据的时候我们需要在TS/PES添加标准的(如果有的话)或自定义的描述,并且在有些情况下原则上必须使用MPEG已经定义的特殊描述,TS/PES并非总是透明的。

简单说就是ps流(主要用在DVD上)如是中间丢了一断码流,后面的都没法播了;而TS流(DVB-T,DMB-TH等)如果断了码流,后面的随时可以再开始解码怎么看都行。

ts的模块解析策略

ts的模块解析策略

ts的模块解析策略
TypeScript 的模块解析策略主要有两种:Node 策略和Classic 策略。

1.Node 策略:这个策略实际上是由Node.js 的模块解析逻辑来决定的。

当使用Node 策略时,TypeScript 会按照Node.js 的规则去解析模块,比如会考虑node_modules 文件夹以及package.json 文件等。

这种策略的优点是它能够很好地与Node.js 生态系统集成,缺点是可能会导致一些TypeScript 特有的功能(比如类型声明文件)无法正常工作。

2.Classic 策略:这个策略是TypeScript 最初实现时使用的模块解析逻辑。

当使用Classic 策略时,TypeScript 会首先在项目目录下查找模块,如果没有找到,再按照Node 策略去解析模块。

这种策略的优点是它能够更好地支持TypeScript 特有的功能,缺点是可能会与Node.js 的生态系统不太兼容。

这两种策略可以通过使用 --moduleResolution 标记来指定使用哪种策略。

例如,使用Node 策略可以运行 tsc --moduleResolution node,使用Classic 策略可以运行 tsc --moduleResolution classic。

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流的解析

TS流的解析 TS即是"Transport Stream"的缩写。

他是分包发送的,每⼀个包长为188字节。

在TS流⾥可以填⼊很多类型的数据,如视频、⾳频、⾃定义信息等。

他的包的结构为,包头为4个字节,负载为184个字节(这184个字节不⼀定都是有效数据,有⼀些可能为填充数据)。

⼯作形式:因为在TS流⾥可以填⼊很多种东西,所以有必要有⼀种机制来确定怎么来标识这些数据。

制定TS流标准的机构就规定了⼀些数据结构来定义。

⽐如: PSI(Program Specific Information)表,所以解析起来就像这样: 先接收⼀个负载⾥为PAT的数据包,在整个数据包⾥找到⼀个PMT包的ID。

然后再接收⼀个含有PMT的数据包,在这个数据包⾥找到有关填⼊数据类型的ID。

之后就在接收到的TS包⾥找含有这个ID的负载内容,这个内容就是填⼊的信息。

根据填⼊的数据类型的ID的不同,在TS流复合多种信息是可⾏的。

关键就是找到标识的ID号。

现在以⼀个例⼦来说明具体的操作:在开始之前先给出⼀⽚实际TS流例⼦:0000f32ch: 47 40 00 17 00 00 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 ; ôôôôôôôôôôôôôôôô0000f3cch: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF ; ôôôôôôôôôôôôôôôô0000f3dch: FF FF FF FF FF FF FF FF FF FF FF FF 47 40 20 17 ; ôôôôôôôôôôôôG@ .0000f3ech: 00 02 B0 1B 00 01 C1 00 00 E0 21 F0 00 1B E0 21 ; ..?..?.??.?0000f3fch: F0 04 2A 02 7E 1F 03 E0 22 F0 00 5D 16 BD 48 ; ?*.~..??].紿具体的分析就以这个例⼦来分析。

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

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.ts2、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 headerts 层的内容是通过PID 值来标识的,主要内容包括:PAT 表、PMT 表、音频流、视频流。

解析ts 流要先找到PAT 表,只要找到PAT 就可以找到PMT ,然后就可以找到音视频流了。

PAT表的PID 值固定为0。

PAT 表和PMT 表需要定期插入ts 流,因为用户随时可能加入ts 流,这个间隔比较小,通常每隔几个视频帧就要加入PAT 和PMT 。

PAT 和PMT 表是必须的,还可以加入其它表如SDT (业务描述表)等,不过hls 流只要有PAT 和PMT 就可以播放了。

∙PAT 表:他主要的作用就是指明了PMT 表的PID 值。

∙∙PMT 表:他主要的作用就是指明了音视频流的PID 值。

∙∙音频流/视频流:承载音视频内容。

∙adaption自适应区的长度要包含传输错误指示符标识的一个字节。

pcr是节目时钟参考,pcr、dts、pts都是对同一个系统时钟的采样值,pcr是递增的,因此可以将其设置为dts值,音频数据不需要pcr。

如果没有字段,ipad是可以播放的,但vlc无法播放。

打包ts流时PAT和PMT表是没有adaptation field的,不够的长度直接补0xff即可。

视频流和音频流都需要加adaptation field,通常加在一个帧的第一个ts包和最后一个ts包里,中间的ts包不加。

PAT格式table_id 8b PAT表固定为0x00section_syntax_indicator 1b 固定为1zero 1b 固定为0reserved 2b 固定为11section_length 12b 后面数据的长度transport_stream_id 16b 传输流ID,固定为0x0001reserved 2b 固定为11version_number 5b 版本号,固定为00000,如果PAT有变化则版本号加1current_next_indicator 1b 固定为1,表示这个PAT表可以用,如果为0则要等待下一个PAT表section_number 8b 固定为0x00 last_section_number 8b 固定为0x00 开始循环program_number 16b 节目号为0x0000时表示这是NIT,节目号为0x0001时,表示这是PMTreserved 3b 固定为111PID 13b 节目号对应内容的PID值结束循环CRC32 32b 前面数据的CRC32校验码PMT格式table_id 8b PMT表取值随意,0x02section_syntax_indicator 1b 固定为1zero 1b 固定为0reserved 2b 固定为11section_length 12b 后面数据的长度program_number 16b 频道号码,表示当前的PMT关联到的频道,取值0x0001 reserved 2b 固定为11version_number 5b 版本号,固定为00000,如果PAT有变化则版本号加1 current_next_indicator 1b 固定为1section_number 8b 固定为0x00last_section_number 8b 固定为0x00reserved 3b 固定为111PCR_PID 13b PCR(节目参考时钟)所在TS分组的PID,指定为视频PID reserved 4b 固定为1111program_info_length 12b 节目描述信息,指定为0x000表示没有开始循环stream_type 8b 流类型,标志是Video还是Audio还是其他数据,h.264编码对应0x1b,aac编码对应0x0f,mp3编码对应0x03reserved 3b 固定为111elementary_PID 13b 与stream_type对应的PIDreserved 4b 固定为1111ES_info_length 12b 描述信息,指定为0x000表示没有结束循环CRC32 32b 前面数据的CRC32校验码(2)pes层pes层是在每一个视频/音频帧上加入了时间戳等信息,pes包内容很多,我们只留下最常用的。

pes start code 3B 开始码,固定为0x000001stream id 1B 音频取值(0xc0-0xdf),通常为0xc0 视频取值(0xe0-0xef),通常为0xe0pes packet length 2B 后面pes数据的长度,0表示长度不限制,只有视频数据长度会超过0xffffflag 1B 通常取值0x80,表示数据不加密、无优先级、备份的数据flag 1B 取值0x80表示只含有pts,取值0xc0表示含有pts和dts pes data length 1B 后面数据的长度,取值5或10pts 5B 33bit值pts是显示时间戳、dts是解码时间戳,视频数据两种时间戳都需要,音频数据的pts和dts相同,所以只需要pts。

有pts和dts两种时间戳是B帧引起的,I帧和P帧的pts等于dts。

如果一个视频没有B帧,则pts永远和dts相同。

从文件中顺序读取视频帧,取出的帧顺序和dts顺序相同。

dts算法比较简单,初始值+ 增量即可,pts计算比较复杂,需要在dts的基础上加偏移量。

音频的pes中只有pts(同dts),视频的I、P帧两种时间戳都要有,视频B帧只要pts(同dts)。

打包pts和dts就需要知道视频帧类型,但是通过容器格式我们是无法判断帧类型的,必须解析h.264内容才可以获取帧类型。

举例说明:I P B B B P读取顺序: 1 2 3 4 5 6dts顺序: 1 2 3 4 5 6pts顺序: 1 5 3 2 4 6点播视频dts算法:dts = 初始值+ 90000 / video_frame_rate,初始值可以随便指定,但是最好不要取0,video_frame_rate就是帧率,比如23、30。

pts和dts是以timescale为单位的,1s = 90000 time scale , 一帧就应该是90000/video_frame_rate 个timescale。

用一帧的timescale除以采样频率就可以转换为一帧的播放时长点播音频dts算法:dts = 初始值+ (90000 * audio_samples_per_frame) / audio_sample_rate,audio_samples_per_frame这个值与编解码相关,aac取值1024,mp3取值1158,audio_sample_rate是采样率,比如24000、41000。

AAC一帧解码出来红色字体显示的内容是最常用的,打包es层数据时pes头和es数据之间要加入一个type=9的nalu,关键帧slice前必须要加入type=7和type=8的nalu,而且是紧邻。

一、背景介绍之前我做了一个项目,要求写一个TS流解析的模块,因此看了ISOIE C 13818-1文档,外加很多人的博客来帮助理解,来了解TS流格式是个什么东西,收货颇多。

因此我觉得是时候发点干货回馈社会了。

二,TS流背景介绍在介绍具体字段,参数这些头疼,烦人的东西之前,我觉得有必要先介绍下TS流的应用背景,有了这个概念,再去深入学习,将如虎添翼。

TS流最经典的应用就是我们平时生活中的数字高清电视。

我们看的电视码流就是TS封装格式的码流,电视码流发送过来后,就会由我们的机顶盒进行解封装,解码,然后传给电视机进行播放。

这里就有一个问题,我们看电视,有很多的频道,节目,对应码流是怎么区分的呢?(T IPS,频道和节目的关系,比如我们有中央电视台综合频道,下属CCT V-1~CCTV14这些节目)TS流引入了PAT和PMT两张表格的概念来解决这个问题。

三,PAT和PMTTS流是以每188字节为一包,我们可以称为ts packet。

这个ts pack et有可能是音视频数据,也有可能是表格。

举例说明,TS流的包顺序为:PAT,PMT,DATA,DATA,,,,,,PAT,PMT,DATA,DATA,,,,,,每隔一段时间,发送一张PAT表,紧接着发送一张PMT表,接着发送DATA(音视频)数据。

那么你可能要问了,有了这2张表格怎么区分频道,节目呢?PAT表格里面包含所有PMT表格的信息,一个PMT表格对应一个频道,比如中央电视台综合频道。

而一个PMT里面包含所有节目的信息,比如CCTV1~CCTV14。

在实际情况中我们是有很多频道的,所以PMT表格可不止一张,有可能是PAT,PMT,PMT,PMT,,,DATA,DATA,,,,PAT,PMT,PMT,,,DATA,DATA这样的形式。

除了这个设定外,每个频道或节目都有自己的标识符(PID),这样当我们拿到一个DAT A,解析出里面的PID,就知道是什么节目,并且也知道所属频道是什么了。

我们看电视的时候,会收到所有节目的DATA,当我们正在看某个节目的时候,机顶盒会把这个节目的DATA单独过滤出来,其它的舍弃。

相关文档
最新文档