当前位置:文档之家› TS流解析

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包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。显然,包头对TS 包具有同步、识别、检错及加密功能。

TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。

TS包语法结构如下:

8tcimsbf 8uimsbf 8bslbf

8uimsbf 1bslbf 1bslbf 1bslbf 5bslbf

1bslbf 15uimsbf

2bslbf 22uimsbf

4bslbf 3bslbf 1bslbf 15bslbf 1bslbf 15bslbf 1bslbf

8bslbf

8bslbf

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分组有效负载的第一字节。一个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 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。

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分组,获取原始流的数据,然后就可以送入解码器解码了。

数据结构(1)TS分组前面提到,TS分组由188个字节构成,其结构如下:

transport_packet(){

sync_byte // 8

transport_error_indicator //1

payload_unit_start_indicator //1

transport_priority //

1 PID //13

transport_scrambling_control // 2

adaptation_field_control //2

continuity_counter //4

if(adaptation_field_control=='10' || adaptation_field_control=='11'){

adaptation_field()

}

if(adaptation_field_control=='01' || adaptation_field_control=='11') {

for (i=0;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

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_32CRC32校验码

上面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 // 8

section_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

reser ved 4

program_info_length // 12

for (i=0; i

descriptor()

}

for (i=0;i

stream_type // 8

reserved // 3

elementary_PID // 13

reserved // 4

ES_info_length // 12

for (i=0; 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该节目相关原始流的描述符的信息长度。

根据前一篇中各数据的定义及数据结构,对数据进行分别解析如下:

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; //PID

unsigned 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.18

return 0;

}

如下为一个TS包数据:

0x47 0x40 0x00 0x120x00 0x00 0xb0 0x0d 0x00 0x00 0xc1 0x00 0x00 0x00 0x01 0xe3 0xe8

0xf0 0x0b 0xd7 0x79 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

分析知道前四位0x47 0x40 0x00 0x12TS头部即为TS包头数据,解析如下:

sync_byte :0x47

transport_error_indicator: 0x00

payload_unit_start_indicator: 0x01

transport_priority : 0x00

PID :0x0000

transport_scrambling_control :0x00

adaptation_field_control :0x01

continuity_counter :0x02

PID = 0x0000,表示此TS包的内容为PSI信息表格的PAT表格数据,在4字节的TS包头之后的第一个字节的Point_field = 0x00, 表示偏移量为0,即紧随其后的即为PAT的数据信息

PAT表格定义如下:

typedef struct TS_PAT_Program

{

unsigned program_number :16; //节目号

unsigned program_map_PID :13; //节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个

}TS_PAT_Program;

//PAT表结构体

typedef struct TS_PAT

{

unsigned table_id : 8; //固定为0x00 ,标志是该表是PAT

unsigned section_syntax_indicator : 1; //段语法标志位,固定为1

unsigned zero : 1; //0

unsigned reserved_1 : 2; // 保留位

unsigned section_length : 12; //表示这个字节后面有用的字节数,包括CRC32

unsigned 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; //分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段

unsigned last_section_number : 8; //最后一个分段的号码

std::vector program;

unsigned reserved_3 : 3; // 保留位

unsigned network_PID : 13; //网络信息表(NIT)的PID,节目号为0时对应的PID为network_PID

unsigned CRC_32 : 32; //CRC32校验码

} TS_PAT;

解析代码如下:

HRESULT CTS_Stream_Parse::adjust_PAT_table( TS_PAT * packet, unsigned char * buffer)

{

packet->table_id = buffer[0];

packet->section_syntax_indicator = buffer[1] >> 7;

packet->zero = buffer[1] >> 6 & 0x1;

packet->reserved_1 = buffer[1] >> 4 & 0x3;

packet->section_length = (buffer[1] & 0x0F) << 8 | buffer[2];

packet->transport_stream_id = buffer[3] << 8 | buffer[4];

packet->reserved_2 = buffer[5] >> 6;

packet->version_number = buffer[5] >> 1 & 0x1F;

packet->current_next_indicator = (buffer[5] << 7) >> 7;

packet->section_number = buffer[6];

packet->last_section_number = buffer[7];

int len = 0;

len = 3 + packet->section_length;

packet->CRC_32 = (buffer[len-4] & 0x000000FF) << 24

| (buffer[len-3] & 0x000000FF) << 16

| (buffer[len-2] & 0x000000FF) << 8

| (buffer[len-1] & 0x000000FF);

int n = 0;

for ( n = 0; n < packet->section_length - 12; n += 4 )

{

unsigned program_num = buffer[8 + n ] << 8 | buffer[9 + n ];

packet->reserved_3 = buffer[10 + n ] >> 5;

packet->network_PID = 0x00;

if ( program_num == 0x00)

{

packet->network_PID = (buffer[10 + n ] & 0x1F) << 8 | buffer[11 + n ];

TS_network_Pid = packet->network_PID; //记录该TS流的网络PID

TRACE(" packet->network_PID %0x /n/n", packet->network_PID );

}

else

{

TS_PAT_Program PAT_program;

PAT_program.program_map_PID = (buffer[10 + n] & 0x1F) << 8 | buffer[11 + n];

PAT_program.program_number = program_num;

packet->program.push_back( PAT_program );

TS_program.push_back( PAT_program );//向全局PAT节目数组中添加PAT节目信息}

}

return 0;

}

因此,PAT数据解析结果如下:

PAT数据

table_id :0x00 //8

section_syntax_indicator :0x01 // 1

'0' :0x00 // 1

reserved 0x03 // 2

section_length :0x00d // 12

transport_stream_id :0x0000 // 16

reserved :0x03 // 2

version_number :0x00 // 5

current_next_indicator :0x01 // 1

section_number :0x00 // 8

last_section_number :0x00 // 8

program_number :0x0001 // 16

reserved :0x07 // 3

program_map_PID :0x03e8 // 13

CRC :0x f0 0b d7 79

由解析结构可知,该PAT表格中没有网络信息包信息,只包含一个节目,其PID为0x03e8 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无关,这个域的值将为0x1FFF。

unsigned reserved_4 : 4; //预留为0x0F

unsigned program_info_length : 12; //前两位bit为00。该域指出跟随其后对节目信息的描述的byte数。

std::vector PMT_Stream; //每个元素包含8位, 指示特定PID的节目元素包的类型。该处PID由elementary PID指定

unsigned reserved_5 : 3; //0x07

unsigned reserved_6 : 4; //0x0F

unsigned CRC_32 : 32;

} TS_PMT;

解析代码为:

HRESULT CTS_Stream_Parse::adjust_PMT_table ( TS_PMT * packet, unsigned char * buffer )

{

packet->table_id = buffer[0];

packet->section_syntax_indicator = buffer[1] >> 7;

packet->zero = buffer[1] >> 6 & 0x01;

packet->reserved_1 = buffer[1] >> 4 & 0x03;

packet->section_length = (buffer[1] & 0x0F) << 8 | buffer[2];

packet->program_number = buffer[3] << 8 | buffer[4];

packet->reserved_2 = buffer[5] >> 6;

packet->version_number = buffer[5] >> 1 & 0x1F;

packet->current_next_indicator = (buffer[5] << 7) >> 7;

packet->section_number = buffer[6];

packet->last_section_number = buffer[7];

packet->reserved_3 = buffer[8] >> 5;

packet->PCR_PID = ((buffer[8] << 8) | buffer[9]) & 0x1FFF; PCRID = packet->PCR_PID;

packet->reserved_4 = buffer[10] >> 4;

packet->program_info_length = (buffer[10] & 0x0F) << 8 | buffer[11];

// Get CRC_32

int len = 0;

len = packet->section_length + 3;

packet->CRC_32 = (buffer[len-4] & 0x000000FF) << 24

| (buffer[len-3] & 0x000000FF) << 16

| (buffer[len-2] & 0x000000FF) << 8

| (buffer[len-1] & 0x000000FF);

int pos = 12;

// program info descriptor

if ( packet->program_info_length != 0 )

pos += packet->program_info_length;

// Get stream type and PID

for ( ; pos <= (packet->section_length + 2 ) - 4; )

{

TS_PMT_Stream pmt_stream;

pmt_stream.stream_type = buffer[pos];

packet->reserved_5 = buffer[pos+1] >> 5;

pmt_stream.elementary_PID = ((buffer[pos+1] << 8) | buffer[pos+2]) & 0x1FFF;

packet->reserved_6 = buffer[pos+3] >> 4;

pmt_stream.ES_info_length = (buffer[pos+3] & 0x0F) << 8 | buffer[pos+4];

pmt_stream.descriptor = 0x00;

if (pmt_stream.ES_info_length != 0)

{

pmt_stream.descriptor = buffer[pos + 5];

for( int len = 2; len <= pmt_stream.ES_info_length; len ++ )

{

pmt_stream.descriptor = pmt_stream.descriptor<< 8 | buffer[pos + 4 + len];

}

pos += pmt_stream.ES_info_length;

}

pos += 5;

packet->PMT_Stream.push_back( pmt_stream );

TS_Stream_type.push_back( pmt_stream );

}

return 0;

}

举例如下:

0x47 0x43 0xe8 0x120x00 0x02 0xb0 0x12 0x00 0x01 0xc1 0x00 0x00 0xe3 0xe9 0xf0

0x00 0x1b 0xe3 0xe9 0xf0 0x00 0xf0 0xaf 0xb4 0x4f 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

TS头部

sync_byte :0x47

transport_error_indicator: 0x00

payload_unit_start_indicator: 0x01

transport_priority : 0x00

PID :0x03e8

transport_scrambling_control :0x00

adaptation_field_control :0x01

continuity_counter :0x02

PMT数据

table_id :0x02 // 8

section_syntax_indicator :0x01 // 1

'0' :0x00 // 1

reserved :0x03 // 2

section_length : 0x012 // 12

program_number :0x00 01 // 16

reserved :0x03 // 2

version_number :0x00 // 5

current_next_indicator 0x01 // 1

section_number :0x00 // 8

last_section_number :0x00 // 8

reserved 0x07 // 3

PCR_PID :0x03 e9 // PCR(节目参考时钟)所在TS分组的PID // 13

reser ved :0x0f //4

program_info_length :0x000 // 12

stream_type :0x1b // 8

reserved 0x07 // 3

elementary_PID :0x03 e9 // 13//该节目中包括的视频流,音频流等对应的TS分组的PID reserved :0x0f // 4

ES_info_length :0x000 // 12

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格式摘录如下:

PS包的长度比较长且可变,主要用于无误码环境里,因为越长的话,同步越困难,且在丢包的情况下,重组也越困难。所以,PS适合于节目信息的编辑和本地内容应用的application。

TS流也是由一个或多个PES组合而来的,他们可以具有相同的时间基准,也可以不同。其基本的复用思想是,对具有相同时间基准的多个PES现进行节目复用,然后再对相互有独立时间基准的各个PS进行传输复用,最终产生出TS。

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

4bytes,自使用区和包数据共占184bytes,整个TS包长度相当于4个ATM包长。TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8

个部分组成。

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. 设计特征

H265封装成TS流

H265封装成TS流 #define STREAM_TYPE_VIDEO_MPEG1 0x01 #define STREAM_TYPE_VIDEO_MPEG2 0x02 #define STREAM_TYPE_AUDIO_MPEG1 0x03 #define STREAM_TYPE_AUDIO_MPEG2 0x04 #define STREAM_TYPE_PRIVATE_SECTION 0x05 #define STREAM_TYPE_PRIVATE_DATA 0x06 #define STREAM_TYPE_AUDIO_AAC 0x0f #define STREAM_TYPE_AUDIO_AAC_LATM 0x11 #define STREAM_TYPE_VIDEO_MPEG4 0x10 #define STREAM_TYPE_VIDEO_H264 0x1b

#define STREAM_TYPE_VIDEO_HEVC 0x24 //Definition of 0x24 HEVC video MPEG TS stream type #define STREAM_TYPE_VIDEO_CAVS 0x42 #define STREAM_TYPE_VIDEO_VC1 0xea #define STREAM_TYPE_VIDEO_DIRAC 0xd1#define STREAM_TYPE_AUDIO_AC3 0x81 #define STREAM_TYPE_AUDIO_DTS 0x82 #define STREAM_TYPE_AUDIO_TRUEHD 0x83

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流录制 播放盒 全球通用 DVB-C DVB-T DVB-S DTMB-TH

码流录制盒播放盒(DVB-C-S-T-TH) 码流录制盒是北京迪未数视最新推出的一款码流录制盒,可以从数字电视网中录制遵循DVB标准的MPEG-2 TS码流。软件操作简单,界面友好。兼备录制与播放DVB传输流为一身的专业数字电视工具。可以完成播放和录制功能。该设备是网口输出,直接接PC网口,TS流就可以通过网络接口录制到电脑硬盘上。 专业的数字电视码流采集设备,免安装驱动,支持各种操作系统,即插即用,既可以实时播放数字电视节目,又可以录制TS码流并保存到电脑上。 支持多种数字电视方式:DVB-C,DVB- S/S2,DVB-T/T2欧标,DTMB-TH国标。 特性: *支持DVB-C\DVB-T\DVB-S\DTMB-TH输入,符合MPEG2系统层规范 *支持100Base-TX网口,符合IEEE 802.3规范 *支持以网口输出,可以不用直接连接pc,直接连接与pc在同一个局域网的网络设备 *在PC端使用免安装的控制软件,不需要安装软件 *支持VLC播放,可以随时对传输流进行数据分析 *支持实时播放,实时录制和预约录制 *提供API,支持二次开发 *支持远程在线升级 *支持各种操作系统:Microsoft Windows 98/ME、2000、XP、Server2003、win7,linux等等

优势之处: 1.尺寸小,与家用路由器相当,携带方便。 2.安装简单,免安装驱动,只要你有信号源和电脑,录制节目流就不是问题。 3.方便保存,录制下来的节目直接保存在电脑硬盘里面,方便使用。 本产品采用以太网接口输出,可以远距离操作。 采用本产品录制TS流时,用户不需要在电脑上面安装任何软件,只需要运行一个免安装的很小的控制软件即可。 本设备体积小、重量轻,价格便宜。当STB厂商也可以把这个设备寄给您的客户,让客户帮忙录制TS。本设备友好的人机界面,使您的用户基本不需要了解数字电视相关的知识,只要会操作电脑就会录制TS。 技术规范: *以太网接口 -网络标准:IEEE 802.3 -接口介质:100Base-TX -传输模式:100Mbps全双工 *射频输入 -接口类型:长F头输入,IEC公头环路输出 -输入频率:50~862MHz -输入电平:45dBuV~80dBuV -输入阻抗:75Ω *电源适配器 -输入:100-240VAC -输出:12VDC 1A *外形尺寸 - 110 x 90 x 24 mm 产品连接 1.电视信号连接 用铜轴线将录制盒的射频输入与数字电视接收信号连接。 2.网络连接 用网线将录制盒的网口与电脑的网卡直接连接。 注意:需要手动配置电脑的网卡(与录制盒连接的网口)的IP地址。

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包语法结构如下:

DVB录制卡 TS流录制 全球通用 DVB-C DVB-T DVB-S DTMB-TH

DVB传输流采集盒是符合MPEG-II/DVB标准的DVB码流盒,提供完备的API接口函数,是数字电视设备理想的硬件开发平台。DVB码流盒主要用于将各种数字电视设备输出的传输流数据采集到计算机的硬盘上。 专业的数字电视码流采集设备,免安装驱动,支持各种操作系统,即插即用,既可以实时播放数字电视节目,又可以录制TS码流并保存到电脑上。 支持多种数字电视方式:DVB-C,DVB- S/S2,DVB-T/T2欧标,DTMB-TH国标。 特性: *支持DVB-C\DVB-T\DVB-S\DTMB-TH输入,符合MPEG2系统层规范 *支持100Base-TX网口,符合IEEE 802.3规范 *支持以网口输出,可以不用直接连接pc,直接连接与pc在同一个局域网的网络设备 *在PC端使用免安装的控制软件,不需要安装软件 *支持VLC播放,可以随时对传输流进行数据分析 *支持实时播放,实时录制和预约录制 *提供API,支持二次开发 *支持远程在线升级 *支持各种操作系统:Microsoft Windows 98/ME、2000、XP、Server2003、win7,linux等等

优势之处: 1.尺寸小,与家用路由器相当,携带方便。 2.安装简单,免安装驱动,只要你有信号源和电脑,录制节目流就不是问题。 3.方便保存,录制下来的节目直接保存在电脑硬盘里面,方便使用。 本产品采用以太网接口输出,可以远距离操作。 采用本产品录制TS流时,用户不需要在电脑上面安装任何软件,只需要运行一个免安装的很小的控制软件即可。 本产品特别适合STB工程师外出采集码流。STB工程师外出采集码流的时候,利用本设备在普通用户家庭或酒店就可以采集实际环境的码流。本设备支持全频搜索,采集工程师不需要了解当地的网络情况。为了获取最原始的码流,本设备支持全频点录制;为了节省存储空间,本设备也支持单节目录制。 本设备体积小、重量轻,价格便宜。当STB厂商也可以把这个设备寄给您的客户,让客户帮忙录制TS。本设备友好的人机界面,使您的用户基本不需要了解数字电视相关的知识,只要会操作电脑就会录制TS。 技术规范: *以太网接口 -网络标准:IEEE 802.3 -接口介质:100Base-TX -传输模式:100Mbps全双工 *射频输入 -接口类型:长F头输入,IEC公头环路输出 -输入频率:50~862MHz -输入电平:45dBuV~80dBuV -输入阻抗:75Ω *电源适配器 -输入:100-240VAC -输出:12VDC 1A *外形尺寸 - 110 x 90 x 24 mm 产品连接

_TS流规范V1.0(IFE口)

COSHIP ITV TS流规范 文档作者:宋小刚日期:2007-08-01 项目经理:日期: 审核:日期: 批准:日期: 深圳同洲视讯传媒有限公司

文档历史发放及记录

目录 1传输流(TRANSPORT STREAM)要求 (6) 1.1TS流必须是符合ISO/IEC13818-1T RANSPORT S TREAM(MPEG-2的传输流)标准和DVB-C 的相关标准; (6) 1.2TS流中只包含一个节目即SPTS流; (6) 1.3TS流由长度为188字节的包组成,由一个完整传送包开始并且包含整数个传送包; 6 1.4TS流中的内容不能被加密或加扰; (6) 1.5在TS流中,节目关联表(PAT)和节目映射表(PMT)须同时成对出现,且PAT在PMT前; (6) 1.6PAT和PMT以0.5秒左右的间隔重复出现; (6) 1.7一个节目可含一个视频流和不多于16个的其他流(音频或私有数据); .6 1.8节目程序参考时钟(P ROGRAM C LOCK R EFERENCE,PCR)的PID(标识符)即PCR_PID 与节目视频流的PID一致; (6) 1.9PCR时间最好是在每个视频帧的开始,且PCR与PCR之间的时间间隔保证在40毫秒左右,波动不能太大;(建议项) (6) 1.10TS流中最好包含10%以内的空包以便片段之间的拼接;(建议项) (6) 1.11视频流中每帧的数据单独成一个视频PES包,即每个视频PES中仅包含一个视频帧的数据;(建议项) (6) 1.12包含视频图片系列(S EQUENCE H EADER,S EQUENCE E XTENSION和G ROUP OF P ICTURES H EADER)开始的包必须带有程序参考时钟(PCR)的时间标记;(建议项) (6) 1.13TS流中的第一个程序参考时钟(PCR)的不连续标记(DISCONTINUITY_INDICATOR FLAG)值须设置为“1”;(建议项) (6) 1.14总码率:标清MPEG2码率3.75M BPS,高清MPEG2码率15M BPS,标清H264码率1.6M BPS,高清H264码率6M BPS;(建议项) (6) 1.15相关PID建议参考如下值:(建议项)1)PAT表中的TRANSPORT_STREAM_ID=1,只有一个节目号PROGRAM_NUMBER=2,PID=32;2)PMT表中的PCR_PID=33,视频流PID=33,音频流PID=34,其他流累加。 (6) 2视频编码要求 (7) 2.1视频流编码格式:MPEG-2格式需符合ISO/IEC13818-2编码标准;MPEG-4格式需符合ISO/IEC14496-2编码标准;H264格式需符合ISO/IEC14496-10编码标准; 7 2.2视频流必须为PAL制式,即帧率25帧/秒,普通画面大小为720*576,高清画面大小为1280*720,全高清画面大小为1920*1080; (7) 2.3MPEG-2格式相关 (7) 2.4H264格式相关 (7) 3音频编码要求 (8) 3.1音频流必须根据ISO/IEC11172-3(A UDIO部分)中MPEG-1L AYER2的标准进行编码; 8 3.2采样率:48K H Z;(建议项) (8) 3.3比特率:单声道96KBPS、双声道192KBPS;(建议项) (8) 3.4单声道、双声道的选择与片源保持一致;(建议项) (8)

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

龙源期刊网 https://www.doczj.com/doc/7e19238272.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值取自视频流中

ps流与ts流

ps流与ts流 在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码流。 简单说就是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主要面向手持设备,接收终端的解析度有限。 ps码流:dvd等本地文件 ts码流:rtp网络传输等 ==================================================== pes,ts,ps 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包没有固定的长度,而是由包头部的数据给出.而PS也是类似TS流分解的方式,逆向的由PES包封装成包,其中要添加 PACKET_HEAD,SYSTEM_HEAD等信息.所以上次所做的程序,并不是TS->PS的转换,而是从一个复杂 的TS流中,过滤去一套节目,构造出一个简单的TS流的过程. mpeg-ts,mpeg-ps的转换 mpeg2文件都是以数据包传递的,同样都是188个字节为一个包,但是作为传输流和节目流,包的组织结构还是不太一样的,作为传输流来说,其包含的包的种类比较多(其实不是包的种类,而是包含不同用途的数 据的种类比较多),比如有PID为0x0000的PAT,EIT,TDT,TOT,还有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流的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;

相关主题
文本预览
相关文档 最新文档