TS流解析

合集下载

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流的解析,可以获取到媒体数据的相关信息,并进行进一步的处理和播放。

TS码流分析.ppt

TS码流分析.ppt

100K CIF图像
100K CIF图像
带宽:8Mbps
传输速率:(8M/8bit)/100K=10(帧/s)

100K CIF图像
压缩后的数字图像数据的传输
100K CIF图像
信源编码 …
10K CIF图像
10K 带宽:8Mbps CIF图像
信道编码:提高传输可靠性
传输速率:(8M/8bit)/10K=100(帧/s)
我国使用的数字电视标准采用的就是DVB标准。
数字视频广播(DVB)系统的传输方式可以分为DVB-S系统(卫星广 播)、 DVB-C系统(有线电视)、 DVB-T系统(地面数字视频广播), DVB系统主要完成数字电视信号的广播与传输。
一、数字电视原理与DVB系统
DVB系统要求主要有: ※信源编码采用MPEG-2标准(即音视频压缩采用MPEG-2标准) ※信道编码中采用统一的加扰系统 ※信道编码中采用统一的里德-所罗门前向纠错系统 ※ ……..
※该“数字”概念的作用范畴: 数字电视中的“数字”概念是指电视信号的前期
一、数字电视与DVB系统
2、数字电视为什么采用信源编码和信道编码? 未经压缩的数字图像数据的传输
信源编码:提高有限带宽的利用率
※预测编码 ※统计编码 ※JPEG编码 ※MPEG编码 ※……..
…………
100K CIF图像
100K CIF图像
MPEG-2标准是MPEG和ISO组织设计的一个数字视频压缩规范,主要用于DVD 和DVB上。其设计目标是高级工业标准的图象质量以及更高的传输率。该标准包括 编号为13818-1系统部分、编号为13818-2的视频部分、编号为13818-3的音频部分 及编号为13818-4的符合性测试部分。

ts流 标准 -回复

ts流 标准 -回复

ts流标准-回复什么是TS流(Transport Stream)?如何实现TS流的传输和播放?如今TS流在数字视频广播和流媒体传输中有何应用?接下来,我们将一步一步回答这些问题。

TS流(Transport Stream)是一种用于数字视频广播和流媒体传输的标准流媒体格式。

它是MPEG-2标准中定义的一种封装格式,用于将视频、音频和其他元数据按照特定的规则打包成一系列的数据包,以进行高效的传输和播放。

首先,我们需要了解TS流的基本结构和特点。

TS流采用分层和多路复用的方式来组织数据。

它由多个PID(Packet Identifier)所对应的数据包组成,每个PID可以承载不同类型(如视频、音频、字幕等)的数据。

这种分层结构使得TS流可以同时传输、解码和显示多路音视频流。

为了实现TS流的传输和播放,需要使用一些特定的工具和协议。

首先,需要一个流媒体服务器来提供TS流的分发和传输。

常用的流媒体服务器软件包括Wowza、Kurento、NGINX等。

这些服务器软件可以根据客户端的请求,向其发送相应的TS流数据。

在传输层,TS流一般使用TCP或UDP协议进行传输。

TCP协议可提供可靠的数据传输,适用于对数据完整性要求较高的场景;而UDP协议则提供了更低的延迟和更高的传输效率,适用于实时性要求较高的场景。

在播放端,需要使用支持TS流的播放器来解析和显示数据。

常见的TS流播放器有VLC、FFmpeg、Windows Media Player等。

这些播放器能够将接收到的TS流进行解封装,并按照其中的PID进行数据提取和解码。

然后,根据需要将视频画面和音频声音同步输出到屏幕和音箱上,实现完整的播放效果。

TS流在数字视频广播和流媒体传输中有着广泛的应用。

在数字电视广播领域,TS流被用于将多路电视频道同时通过有线或无线传输到电视机上。

利用TS流的分层和多路复用特点,可以在一个通道内传输多个节目,大大提高了频谱利用率。

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流PAT和PMT 代码

解析TS流PAT和PMT 代码

#include<stdio.h>#include<stdlib.h>#include<string.h>#define ts_path "/home/huohuo/huangwork/work/birds.ts" //TS文件的绝对路径void Read_Ts_Packet(FILE *file_handle,unsigned char *packet_buf,int len); //读一个TS流的packetint parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的tablevoid parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数目和PMT的PIDvoid pronum_pmtid_printf(); //打印PMT的PID unsigned char* Find_PMT(unsigned short pmt_pid); //找出PMT的tablevoid parse_PMT(unsigned char *buffer,int len,unsigned short pmt_pid); //解析PMT,找出其中的Video和Audio的PIDvoid printf_program_list(); //打印PMT table中包含的stream的类型和PIDunsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的tabletypedef struct{unsigned short program_num; //program's numunsigned 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 programPRO_LIST program_list[10] = {{0,0}}; //用来存储PMT中stream的类型和PIDunsigned int program_list_num = 0;FILE *file_handle; //指向TS流的指针unsigned int FileSize = 0;int main(){unsigned char buffer[188] = {0};unsigned char *pmt_buffer, *Video_or_Audio_buffer;unsigned int i=0,j=0,ret=0;pmt_buffer = (unsigned char*)malloc(sizeof(char)*188); //给buffer分配空间memset(pmt_buffer,0,sizeof(char)*188);//清空bufferVideo_or_Audio_buffer = (unsigned char*)malloc(sizeof(char)*188);memset(Video_or_Audio_buffer,0,sizeof(char)*188);file_handle = fopen(ts_path,"rb+"); //以二进制方式打开TS文件if(NULL == file_handle) //判断是否打开文件{perror("fopen");printf("open file error!\n");return 0;}elseprintf("open file success!\n");fseek(file_handle,0,SEEK_END); //指针file_handle将以SEEK_END位置偏移0个位置,即将指针移动到文件尾FileSize = ftell(file_handle); // 计算file_handle到文件头的偏移字节数,即计算文件的大小printf("file size = %d\n",FileSize);rewind(file_handle); // equivalent (void) feek(file_handle,0L,SEEK_SET) 将file_handle 指针移动到文件头位置printf("find PAT begin-------->\n");for(i=0;i<FileSize/188;i++){Read_Ts_Packet(file_handle,buffer,188); //读TS的packet函数,每次读188个字节到bufferret = parse_TS(buffer,188); //解析188个字节的TS's packet,并打印找到的PA T’s table。

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)是一种在数字视频广播和存储中广
泛使用的、用于传输和处理音视频数据的标准。

它是MPEG-2
标准中定义的一种容器格式,主要用于将音视频数据打包和传输到接收端。

TS流采用分段的方式将音视频数据进行打包,并将每个分段
称为Packet。

每个Packet由一个特定长度的字节组成,其中
包含了音视频数据以及相关的控制信息。

传输过程中,这些Packet按照一定的顺序依次发送,并在接收端进行解析和播放。

TS流的主要特点包括:
1. 支持多路复用:TS流可以将多个音视频数据流复用在同一
个传输流中,从而实现多路数据的同时传输。

2. 容错性强:TS流通过在数据中添加冗余信息来保证数据传
输的可靠性,从而提高对传输异常的容错能力。

3. 灵活性高:TS流可以提供多种音视频编码方式的支持,同
时还可以加入私有的扩展信息和自定义的元数据。

4. 支持多种传输方式:TS流可以通过各种传输方式进行传输,包括广播、卫星传输、以太网传输等。

TS流广泛应用于数字电视、视频点播、IPTV以及视频监控等
领域,成为目前最主流的音视频传输格式之一。

TS流的解析三篇

TS流的解析三篇

TS流的解析三篇篇一:关于TS流的解析TS即是"TransportStream"的缩写。

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

在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。

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

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

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

比如:PSI (ProgramSpecificInformation)表,所以解析起来就像这样:先接收一个负载里为PAT的数据包,在整个数据包里找到一个PMT包的ID。

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

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

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

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

现在以一个例子来说明具体的操作:在开始之前先给出一片实际TS流例子:0000f32ch:474000170000B00D0001C100000001E0;0000f33ch:20A2C32941FFFFFFFFFFFFFFFFFFFFFF;0000f34ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f35ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f36ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f37ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f38ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f39ch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f3ach:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f3bch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f3cch:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;0000f3dch:FFFFFFFFFFFFFFFFFFFFFFFF474020XX; G@.0000f3ech:0002B01B0001C10000E021F0001BE021; 0000f3fch:F0042A027E1F03E022F0005D16BD48具体的分析就以这个例子来分析。

IP数据包和TS流是什么,之间有什么关系?

IP数据包和TS流是什么,之间有什么关系?
而PS包由于长度是变化的,一旦某一PS包的同步信息丢失,接收机无法确定下一包的 同步位置,就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码 较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。
由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体(如有线电视)中 进行传输的MPEG-2码流基本上都采用了TS码流的格式。 IP数据包和TS流是什么,之间有什么关系?
辅助数据复接生成的用于实时传输的标准信息流(比如实时广播的电视节目)称为“MPEG-2 传送流”(MPEG2-TS)(TS的全称:Transport Stream)。
而“MPEG-2节目流”(MPEG2-PS)主要应用于存储的具有固定时长的节目,如DVD电影(PS 的全称:Program Stream)。
cyb923主要实现码字的8/10bit转换、插入同步字K28.5和并/串变换。ASI的传输速率 恒定为270MHz,而输入MPEG-2 TS码率是不同的,所以要用FIFO实现速率匹配,需要对输入 的SPI数据、FIFO和cyb923之间的通信进行逻辑控制。综合性能、价格和程序复杂度的考虑, 本方案采用xilinx公司的CPLD逻辑编程器XC95108;用VHDL编程实现对它们的逻辑控制。ASI 的解码也是相似的过程,cyb933主要实现10/8bit转换、去除同步字K28.5和串并变换。 3.1 ASI编码
什么是ts流 我们在网络上通信都是通过发送或接受数据包来实现的。 I P数据包有首部和数据两部分组成的,首部的前一部分是固定长度20字节,是所
有IP数据报必须具有的。首部包括:总长度、标识、MF、DF、片偏移。 “TS流”和“PS流”是经过MPEG-2系统压缩处理后的两种复合信息流。 据传输媒体的质量不同,MPEG-2中定义了两种复合信息流:传送流(TS)和节目流(PS)。 在MPEG-2系统中,信息复合/分离的过程称为系统复接/分接,由视频,音频的ES流和

TS流解析源码

TS流解析源码
/* pat/pmt的尺寸不可能超过1024字节*/
if( 1024 < size || filter != m_sdt_filter )
return false;
/* CRC校验*/
crc32 = GetCrc32( buf, size-4 );
memcpy( &ival, buf+size-4, 4 );
}
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;
if( !sdt_multilingual_des )
return false;
memset( sdt_multilingual_des, 0, sizeof(TSSDTMultilingualInfo) );
/*获取multilingual_name_descriptor */
memcpy( &sdt_multilingual_des->sdt_ISO_639_language_code, p, 4 );
if( !sdt_info )
return false;
/* descriptors: descriptor_tag(1)+descriptor_length(1)+... */
q = p;
while( p < q + len && p < buf + (size - 4) )

TS流解析

TS流解析

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)”。

两者之间的关系:PES分组是插入到TS分组中的,每个PES分组首部的第一字节就是TS分组有效负载的第一字节。

ts流解析规则专业资料

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.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 headersync_byte 8b同步字节, 固定为0x47transport_error_indicator 1b 传输错误指示符, 表白在ts头的adapt域后由一个无用字节, 通常都为0, 这个字节算在adapt域长度内payload_unit_start_indicator 1b 负载单元起始标示符, 一个完整的数据包开始时标记为1• ts层的内容是通过PID值来标记的, 重要内容涉及: PAT表、PMT表、音频流、视频流。

TS流

TS流

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

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

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

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

传送流(Transport Stream)简称TS流,它是根据ITU-TRec.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 为空分组保留。

ES流、PES流、PS流和TS流

ES流、PES流、PS流和TS流

ES流、PES流、PS流和TS流概念1、TS流:传输流,主要用于相对有错的环境下的传输与存储,如DVB2、PS流:节目流,主要用于相对无错的环境下的传输与存储,如DVD3、ES流:也叫基本码流,包含视频、音频或数据的连续码流4、PES流:也叫打包的基本码流,是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES 流。

5、封装: 就是捆绑打包,将画面视频文件和音轨文件打包在一起,并按照一定规则建立排序和索引,便于播放器或播放软件来索引播放,包括AVI / PS(Program Stream)/ TS(Transport Stream)/ MKV (Matroska)等。

TS流TS流(Transport Stream),也叫传输流,是由固定长度为188字节的包组成,含有独立时基的一个或多个program,一个program 又可以包含多个视频、音频、和文字信息的ES流;每个ES流会有不同的PID标示,而又为了可以分析这些ES流,TS有一些固定的PID 用来间隔发送program和ES流信息的表格—PAT和PMT表。

在MPEG-2系统中,由视频、音频的ES流和辅助数据复接生成的用于实际传输的标准信息流称为MPEG-2传送流。

组成传输流的是一系列连续的数据包,简称TS包。

TS包的长度固定,一般是188字节。

如果在这种TS包的尾部加入16字节的RS 纠错码,则包长为204字节。

传输流这种机制可将多路节目复用成一个流,并且,同一节目还可以包含多个视频和音频流。

每一个TS包都有一个包标识PID,同一基础流对应的TS包,PID的值相同。

TS流就是通过对各个基础流分配不同的PID号来唯一的标识各个不同的基础流、信息表和其它数据。

每一个TS包最多只能包含一路基础流的内容。

组成节目的视频流和音频流经过基础流编码器之后,形成基本流,每一路视频流或音频流对应一路基本流。

基本流经过打包,形成PES 包流。

便携式IPTV测试仪TS码流解析的实现

便携式IPTV测试仪TS码流解析的实现

便携式IPTV测试仪TS码流解析的实现便携式IPTV测试仪是一种用于测试和分析IPTV系统性能的设备。

它可以通过对传输流中的TS码流进行解析和分析,提供关于传输质量、视频质量、音频质量等方面的信息。

下面将介绍便携式IPTV测试仪TS码流解析的实现过程。

首先,便携式IPTV测试仪需要具备对TS码流解析的功能,这需要通过硬件和软件的结合来实现。

硬件方面,测试仪需要具备高性能的处理器和足够的存储空间来处理和存储大量的数据。

同时,测试仪需要具备支持高速数据传输的接口,例如千兆以太网接口。

软件方面,测试仪需要具备强大的编解码功能,能够对TS码流进行解析和分析。

在实现过程中,首先需要从IPTV系统中获取到传输的TS码流。

通常,这可以通过测试仪的网络接口连接到IPTV系统中的交换机或路由器上,然后通过ARP、DHCP等协议获取到IPTV系统分配给测试仪的IP地址和相关配置信息。

获取到IP地址后,测试仪就可以通过该地址与IPTV系统建立TCP/IP连接,并获取到传输的TS码流。

获取到TS码流后,测试仪需要对其进行解析。

TS码流是一种多路复用的码流格式,其中包含多个音视频流、字幕、EPG等信息。

测试仪需要通过解析TS码流,将其中的各个流分离出来,并进行相应的解码处理。

这可以通过测试仪上的解码器来实现,解码器可以将TS码流中的音视频数据进行解码,并输出为可播放的音视频信号。

在解析TS码流的过程中,测试仪可以获取到各个流的相关信息。

例如,测试仪可以通过解析PAT(Program Association Table)和PMT (Program Map Table)信息,获取到TS码流中包含的节目信息。

同时,测试仪还可以通过解析PCR(Program Clock Reference)信息,获取到TS码流的传输时钟参考,用于判断流的同步状态。

除了对TS码流的解析,测试仪还可以对解析后的音视频数据进行质量分析。

通过分析视频数据的码率、帧率、分辨率等参数,测试仪可以评估视频的质量。

TS流分析

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 ; ⒚)A0000f34ch: 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 ; ?*.~..??].紿1Ts流包的机构是固定的,每个包长188字节,并且头部是不固定的(一般为4字节),负载部分为,188字节减去头部长度。

ts流解码过程

ts流解码过程

ts流解码过程TS 流解码过程:1. 获取TS中的PAT2. 获取TS中的PMT3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息。

4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等。

5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是one piece of PES,在TS header中有一些关于此payload属于哪个PES的第多少个数据包。

因此软件中应该将此payload中的数据copy到PES的buffer中,用于拼接一个PES包。

6. 拼接好的PES包的包头会有PTS,DTS信息,去掉PES 的header就是ES。

7. 直接将被拔掉PES包头的ES包送给decoder就可以进行解码。

解码出来的数据就是一帧一帧的视频数据,这些数据至少应当与PES中的PTS关联一下,以便进行视音频同步。

8. I,B,B,P 信息是在ES中的。

ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码数据流的统称。

ES流经过PES 打包器之后,被转换成PES包。

PES包由包头和payload组成.在PES层,主要是在PES包头信息中加入PTS(显示时间标签)和DTS(解码时间标签)用于视频、音频同步。

其实,Mpeg-2用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。

在ES层,与同步有关的主要是视频缓冲验证VBV(VideoBuffer Verifier),用以防止解码器的缓冲器出现上溢或下溢;在PES层,主要是在PES头信息里出现的显示时间标签PTS (PresentationTime Stamp)和解码时间标签DTS(Decoding Time Stamp);在TS层中,TS头信息包含了节目时钟参考PCR(Program Clock Reference),用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。

解析TS流PAT和PMT代码

解析TS流PAT和PMT代码

解析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流的packetint parse_TS(unsigned char *buffer,int FileSize); //分析TS流,并找出PA T的PID和PAT的tablevoid parse_PAT(unsigned char *buffer,int len); //分析PA T,并找出所含频道的数⽬和PMT的PIDvoid 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的类型和PIDunsigned char* Find_video_audio(unsigned short program_pid,unsigned char type); //找出Video或者Audio的table typedef struct{unsigned short program_num; //program's numunsigned 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 programPRO_LIST program_list[10] = {{0,0}}; //⽤来存储PMT中stream的类型和PIDunsigned int program_list_num = 0;FILE *file_handle; //指向TS流的指针unsigned int FileSize = 0;int main(){unsigned char buffer[188] = {0};unsigned char *pmt_buffer, *Video_or_Audio_buffer;unsigned int i=0,j=0,ret=0;pmt_buffer = (unsigned char*)malloc(sizeof(char)*188); //给buffer分配空间Video_or_Audio_buffer = (unsigned char*)malloc(sizeof(char)*188);memset(Video_or_Audio_buffer,0,sizeof(char)*188);file_handle = fopen(ts_path,"rb+"); //以⼆进制⽅式打开TS⽂件if(NULL == file_handle) //判断是否打开⽂件{perror("fopen");printf("open file error!\n");return 0;}elseprintf("open file success!\n");fseek(file_handle,0,SEEK_END); //指针file_handle将以SEEK_END位置偏移0个位置,即将指针移动到⽂件尾FileSize = ftell(file_handle); // 计算file_handle到⽂件头的偏移字节数,即计算⽂件的⼤⼩printf("file size = %d\n",FileSize);rewind(file_handle); // equivalent (void) feek(file_handle,0L,SEEK_SET) 将file_handle 指针移动到⽂件头位置printf("find PAT begin-------->\n");for(i=0;i{Read_Ts_Packet(file_handle,buffer,188); //读TS的packet函数,每次读188个字节到bufferret = parse_TS(buffer,188); //解析188个字节的TS's packet,并打印找到的PA T’s table。

TS流解析

TS流解析

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包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。

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

#include <iostream>#include <fstream>using namespace std;struct programs //封装节目信息的结构体{int programID;//节目编号int pmtPID;//所属PMT的pidint videoPID;//视频pidint audioPID1;//音频pidint 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;}}//2.遍历流中的TS分组,查找PATmyFile.seekg(0,ios::end);//定位到文件尾部int totalBytes=myFile.tellg();//获取尾部距离首部的偏移量,即TS文件字节总数totalBytesint packageCount=(totalBytes-startPos)/packageLen;//确定进行遍历的循环次数即总TS包数int curPack=0;while (curPack<packageCount)//遍历分组{myFile.seekg(startPos+curPack*packageLen);//定位到第curPack个分组的首字节myFile.read((char *)buffer,packageLen);//读出当前分组,保存到缓存buffer中,读一段分组长度188或204pID=((buffer[1]&31)<<8)+buffer[2];//解析出当前分组的pid(13位=第2个字节的后5位+第3个字节全8位)if(pID==0x1fff) //检查空包数{nullpack++;}if(FindAndParsePAT(buffer,pID,curPack))//执行程序:解析PAT 有效break; //表明只要解析一个PAT就行curPack++;}curPack=0;int a=0;while (curPack<packageCount){myFile.seekg(startPos+curPack*packageLen);//定位到第curPack个分组的首字节myFile.read((char *)buffer,packageLen);//读出当前分组,保存到缓存buffer中,读一段分组长度188或204pID=((buffer[1]&31)<<8)+buffer[2];//解析出当前分组的pid(13位=第2个字节的后5位+第3个字节全8位)for(int k=0;k<prog_count;k++){if(pID==myProg[k].pmtPID)//根据PAT表内容确定如何查PMT表{cout<<"第"<<k+1<<"套节目:"<<endl;FindAndParsePMT(buffer,pID,curPack);//执行程序:解析PMTa++;}}if(a==prog_count){break;}curPack++;}cout<<endl;cout<<"TS流相关信息:流中第一个TS分组起始位置"<<startPos<<","<<"TS分组长度"<<packageLen<<","<<"节目数"<<program<<","<<"空包数"<<nullpack<<endl;cout<<"所有节目相关PID信息"<<endl;delete[]buffer;myFile.close();}//查找并解析PATbool FindAndParsePAT(unsigned char *buffer,int pID,int curPack){//3.根据pid值是否为0确认PAT分组,并从中读PMT的PIDint adapLen=0;//TS分组适配字段长度int offset=0;//实际净荷在当前分组中的偏移量if(pID==0){int payload_unit_start = (buffer[1]>>6) & 0X01;//净荷单元起始指示int adaptation_field_control = (buffer[3]>>4) & 0X03;//自适应字段控制//3.1 确定净荷起始位置(4字节固定首部+适配字段长度,adaption_field_control)if(adaptation_field_control==0x01)//无调整字段,仅净荷{adapLen=0;//TS分组适配字段长度为0}else if(adaptation_field_control==0x11)//有调整字段和净荷{adapLen=buffer[4];//自适应字段长度}else//无有效载荷,查找下一个分组{curPack++;//continue;}offset=4+adapLen;//确定净荷在当前分组中的偏移量,头的字节长度//3.2 确定PAT首部在净荷中的偏移量(如payload_unit_start_indicator为1,//则净荷首字节为偏移指针,指示PAT首部与其之间的偏移值)if(payload_unit_start==0x01)//如果净荷单元起始指示为1{offset+=buffer[offset]+1;//pointer_field字段长为1字节}//3.3 开始解析PAT表int tableID=buffer[offset];//从净荷起始if(tableID==0)//进入节目关联表PAT{int section_len=((buffer[offset+1]&0x0F)<<8)+buffer[offset+2];//code here:初始化 int transport_stream_idd=(buffer[offset+3]<<8)+buffer[offset+4];//code here:初始化int current_next_indicator=buffer[offset+5]&0x01;//code here:初始化if (current_next_indicator)//当前PAT有效{prog_count=(section_len-9)/4-1;for(int i=0;i<prog_count;i++){myProg[i].programID=(buffer[offset+12+i*4]<<8)+buffer[offset+12+i*4+1];//用2个字节表示节目号cout<<"节目号"<<myProg[i].programID<<" ";myProg[i].pmtPID=(buffer[offset+14+i*4]&0x1F<<8)+buffer[offset+14+i*4+1];//用13位表示映射表cout<<"映射表ID"<<myProg[i].pmtPID<<"\n";program++;}//your code here 读出PAT包中存储的有关节目PMT的信息,确定节目数以及每路节目的PMT表pid,存储到myProg中return true;}}}return false;}//查找并解析PMTbool FindAndParsePMT(unsigned char *buffer,int pID,int curPack){//PMT 标志位int payload_unit_start_indicator; //1比特标志位,用来指示传送流分组带有PES分组或PSI数据时的情况int adaption_field_length; //自适应字段长度。

int pointer_field; //int section_length; //规定此字段之后此分段的字节数,包括CRCint section_number;int last_section_number; //8位字段,值总为0x00int i=0;if (((buffer[3])<<2)/64==1)//判断adaption_field_control '01',无调整字段,仅含有有效负载//2位字段。

用于指示本传送流分组首部是否跟随有调整字段和/或有效负载。

相关文档
最新文档