一、TS流概述
ES流(ElementaryStream,基本流):数字电视各组成部分编码后所形成的直接表示基本元素内容的流,包含视频、音频或数据的连续码流。
PES流(Paketized ElementaryStream,打包基本码流):是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。
PS (ProgramStream,节目流):将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码流。PS流是一种多路复用数字音频、视频等的封装容器,它一个或多个具有共同的时间基准的PES流合并成一个整体流,主要用于节目存储。其包长不固定,且较长,一旦失去同步信息,接收机无法确定下一包的同步位置,会造成失步,导致严重的信息丢失。PS流适用于误码小、信道较好的环境,如演播室、家庭环境和存储介质中。
TS流(TransportStream,传输流):是将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述和节目组成信息,并进一步封装成传输包后的码流。TS流是将视频、音频、PSI等数据打包成传输包进行传送。主要用于节目传输。TS的传输包长度固定,一般为188字节。
TS流和PS流是MPEG-2标准中规定的两种输出码流。TS格式中,从视频流的任意一片断开始都可以独立解码,而PS格式不可以。由于TS流具备较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS流的包格式。
TS流的播放:播放前将TS流文件的后缀名该为.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打开播放即可。
TS流的优点:
1、动态带宽分配:由于TS的传输包长度是固定的,因此可过PID可以将规定的信道总频带在视频、音频和数据信息见进行实时的、灵活的分配。利用这一特性,可在广播付费节目前实时地将解密钥匙插入到TS流中送给广大用户。
2、可分级性:允许一个复用的传输码流与其他视音频基本码流进行二次复用,生产占用频带给宽的更高一级的TS流。
3、可扩展性
4、抗干扰性
5、接收机成本低廉
TS流的形成过程:
1、 压缩【显示单元】产生【进入单元】,连续的【进入单元】组成一个基本码流。
2、 对ES(基本码流)进行打包形成PES。
3、 在PES包中加入定时信息(PTS/DTS)。
4、 将PES包内容分配到一系列固定长度的传输包中。
5、 在传输包中加入定时信息(PCR)。
6、 在传输包中加入节目专用信息(PSI) 。
7、 连续输出传输包形成具有恒定比特率的MPEG-TS流。
二、TS流传输包(简称TS包)结构分析
MPEG-2中规定TS传输包的长度为188字节。但通信媒介会为包添加错误校验字节,从而有了不同于188字节的包长。例如:
DVB 规定中,使用204字节作为包长:1、通过调制器时,在每个传输包后增加了16字节的里德所罗门前向纠错码,因而形成了204字节的数据包。调制后总存在204字节的数据包。2、调制之前存复用器插入RS码或虚构
的RS码。
ATSC规定中,使用208字节作为包长:添加20 字节的RS(Reed-Solomon)前向纠错码。与DVB不同,ATSC规定RS码只能出现在调制的TS流中。
所有的TS包都分为包头和净荷部分。TS包中可以填入很多东西(填入的东西都是填入到净荷部分),有:视频、音频、数据(包括PSI、SI以及其它任何形式的数据)。
1、TS包包头
TS包的包头提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。TS包的包头长度不固定,前32比特(4个字节)固定,后面可能跟有自适应字段(适配域)。32个比特(4个字节)是最小包头。包头的结构固定如下:
同步字节 | 传输错误指示 | 开始指示 | 传输优先级 | PID | 加扰控制 | 适配域控制 | 连续性计数器 | 适配域 |
8 | 1 | 1 | 1 | 13 | 2 | 2 | 4 |
typedef struct TS_packet_header
{
unsigned sync_byte : 8;
unsigned transport_error_indicator :1;
unsigned payload_unit_start_indicator :1;
unsigned transport_priority : 1;
unsigned PID : 13;
unsigned transport_scrambling_control :2;
unsigned adaption_field_control : 2;
unsigned continuity_counter : 4;
} TS_packet_header;
sync_byte (同步字节):固定为0100 0111(0x47);该字节由解码器识别,使包头和有效负载可相互分离。
transport_error_indicator(传输错误指示):‘1’表示在相关的传输包中至少有一个不可纠正的错误位。当被置1后,在错误被纠正之前不能重置为0。
payload_unit_start_indicator(开始指示):为1时,在前4个字节之后会有一个调整字节,其的数值为后面调整字段的长度length。因此有效载荷开始的位置应再偏移1+[length]个字节。
transport_priority(传输优先级):‘1’表明优先级比其他具有相同PID但此位没有被置‘1’的分组高。
PID:指示存储与分组有效负载中数据的类型。PID 值 0x0000—0x000F保留。其中0x0000为PAT保留;0x0001为CAT保留;0x1fff为分组保留,即空包。
transport_scrambling_control(加扰控制):表示TS流分组有效负载的加密模式。空包为‘00’,如果传输包包头中包括调整字段,不应被加密。
adaptation_field_control(适配域控制):表示包头是否有调整字段或有效负载。‘00’为ISO/IEC未来使用保留;‘01’仅含有效载荷,无调整字段;‘10’无有效载荷,仅含调整字段;‘11’调整字段后为有效载荷,调整字段中的前一个字节表示调整字段的长度length,有效载荷开始的位置应再偏移[length]个字节。空包应为‘10’。
continuity_counter(连续性计数器):随着每一个具有相同PID的TS流分组而增加,当它达到最大值后又回复到0。范围为0~15。
适配域:
2、TS包净荷部分
TS包中净荷所传输的信息包括两种类型:
1、视频、音频的PES包以及辅助数据;
2、节目专用信息PSI。
当然,TS包也可以是空包。空包用来填充TS流,可能在重新进行多路复用时被插入或删除。
在系统复用时,视频、音频的ES流需进行打包形成视频、音频的PES流,辅助数据(如图文电视信息)不需要打成PES包。PES包非定长,音频的PES包小于等于64K,视频的一般为一帧一个PES包。一帧图象的PES包通常要由许多个TS包来传输。MPEG-2中规定,一个PES包必须由整数个TS包来传输。如果承载一个PES包的最后一个TS包没能装满,则用填充字节来填满;当下一个新的PES包形成时,需用新的TS包来开始传输。
节目专用信息PSI(Program SpecificInformation)
了管理各种类型的TS数据包,需要有些特殊的TS包来确立各个TS数据包之间的关系。这些特殊的TS包里所包含的信息就是节目专用信息。在不同的标准中它有不同的名字:
• MPEG-2中称为PSI;
• DVB标准根据实际需要,对PSI扩展,称为SI信息;
• ATSC标准中为PSIP信息
MPEG-2中,规定的对PSI信息的描述方法有以下几种:
• 1、表Table: 节目信息的结构性的描述;
–节目关联表Program Association Table (PAT) 0x0000
–节目映射表Program Map Tables (PMT)
–条件接收表Conditional Access Table (CAT) 0x0001
–网络信息表Network Information Table(NIT) 0x0010
–传送流描述表Transport Stream Description Table (TSDT)
• 2、节Section: 将表格的内容映射到TS流中;
专用段 Private_ section
•3、描述符Descriptor:提供有关节目构成(视频流、音频流、语言、层次、系统时钟和码率等多方面)的信息;
ITU-T Rec.H.222.0|ISO /IEC 13818-1 中定义的PSI表可被分成一段或多段置于传输流分组中。一段就是一个语法结构,用来将 ITU-T Rec.H.222.0|ISO /IEC13818-1 中定义的 PSI表映射到传输流分组中。
PAT:
TS流中包含一个或者多个PAT表。PAT表由PID为0x0000的TS包传送,其作用是为复用的每一路传送流提供出所包含的节目和节目编号,以及对应节目的PMT的位置即PMT的TS包的PID值,同时还提供NIT的位置,即NIT的TS包的PID的值。
Table ID | Section syntax indicator | 0 | Section length | Transport stream ID | Version number | Current next indicator | Section Number | Last section number | N loop | ||
8 | 1 | 1 | 2 | 12 | 16 | 2 | 5 | 1 | 8 | 8 |
N loop中为:
Program number0 | Network PID | …… | Program number1 | Program map PID-1 | …… | CRC 32 | ||
16 | 3 | 13 | 16 | 3 | 13 | 32 |
table_id:固定为0x00,标志该表是PAT表。
section_syntax_indicator:段语法标志位,固定为1。
section_length:表示这个字节后面有用的字节数,包括CRC32。节目套数:(sectionlength-9)/4
transport_stream_id:16位字段,表示该TS流的ID,区别于同一个网络中其它多路复用流。
version_number:表示PAT的版本号。
current_next_indicator:表示发送的PAT表是当前有效还是下一个PAT有效。
section_number:表示分段的号码。PAT可能分为多段传输,第一段为0,以后每个分段加1,最多可能有256个分段。
last_section_number:表示PAT最后一个分段的号码。
Program number:节目号
network_ PID:网络信息表(NIT)的PID,节目号为0时对应ID为network_PID。
Program mapPID:节目映射表(PMT)的PID号,节目号为大于等于1时,对应的ID为program_map_PID。一个PAT中可以有多个program_map_PID。
CRC_32:32位字段,CRC32校验码Cyclic RedundancyCheck。
PMT:
PMT在传送流中用于指示组成某一套节目的视频、音频和数据在传送流中的位置,即对应的TS包的PID值,以及每路节目的节目时钟参考(PCR)字段的位置。
Table id | Section syntax indicator | 0 | Section length | Transport stream id | Version number | Current next indicator | Section number | Last section number | PCR PID | Program info length | N loop descriptors | N loop | CRC 32 | ||||
8 | 1 | 1 | 2 | 12 | 16 | 2 | 5 | 1 | 8 | 8 | 3 | 13 | 4 |
N loop中为:
Stream type | Elementary PID | ES info length | N loop descriptors | ||
8 | 3 | 13 | 4 | 12 |
Table id:固定为0x02,标志该表是PMT表。
Section syntaxindicator:对于PMT表,设置为1。
Sectionlength:表示这个字节后面有用的字节数,包括CRC32。
Programnumber:它指出该节目对应于可应用的Program map PID。
Versionnumber:指出PMT的版本号。
Current nextindicator:当该位置’1’时,当前传送的Program mapsection可用;当该位置’0’时,指示当前传送的Program map section不可用,下一个TS流的Programmapsection有效。
Sectionnumber:总是置为0x00(因为PMT表里表示一个service的信息,一个section的长度足够)。
Last sectionnumber:该域的值总是0x00。
PCRPID:节目中包含有效PCR字段的传送流中PID。
Program infolength:12bit域,前两位为00。该域指出跟随其后对节目信息的描述的byte数。
Streamtype:8bit域,指示特定PID的节目元素包的类型。该处PID由elementaryPID指定。下表所示为对应原始流的类型。
原始流的类型
值 | 描述 |
0x00 | ITU-T|ISO/IEC保留 |
0x01 | ISO/IEC 11172视频 |
0x02 | ITU-T Rec.H.262|ISO/IEC 13818-2视频 |
0x03 | ISO/IEC 11172音频 |
0x04 | ISO/IEC 13818-3音频 |
0x05 | ITU-T Rec.H.222.0|ISO/IEC 13818-1私用分段 |
0x06 | 含有私用数据的ITU-T Rec.H.222.0|ISO/IEC13818-1分组 |
0x07 | ISO/IEC 13522 MHEG |
0x08 | ITU-T Rec.H.222.0|ISO/IEC 13818-1 DSMCC |
0x09 | ITU-T Rec.H.222.0|ISO/IEC13818-1/11172-1 |
0x10 ~ 0x7F | ITU-T Rec.H.222.0|ISO/IEC 13818-1保留 |
0x80 ~ 0xFF | 用户私用 |