MPEG-1的扩展性有限,于是MPEG在1995年发布了MPEG-2,编号为ISO/IEC13818,名称为“运动图像及其伴音信息的通用编码”(Generic coding of moving pictures and associated audioinformation)。目前最新的版本是2000版,分为10个部分:
² Part 1 系统 与MPEG-1的Part 1作用类似,规定了将视音频及其它相关数据组合成一个单一数据流的方法,并针对不同的应用场合提供了两种格式:应用于无错环境的节目流(PS: ProgramStream)和应用于恶劣环境的传输流(TS: TransportStream);
² Part 2 视频 规定了视频编码的方法;
² Part 3 音频 规定了音频编码的方法,本质上与MPEG-1的Part 3相同,但进行了扩展,可以支持5.1声道和7.1声道的环绕立体声;
² Part 4 符合性测试 规定了测试方法,相关厂家可据此测试某个具体实现是否遵从了前三部分的规定;
² Part 5 软件模拟 给出了一个包含Part1,2,3的完整软件实现;
² Part 6 DSM-CC数字存储媒体-命令与控制 描述交互式多媒体网络中服务器与用户间的会话信令集;
² Part 7 规定了一种与MPEG-1 Part 3不兼容的音频编码算法,又被称为AAC(Advanced Audio Coding),同时支持多达48个音轨、15个低频音轨、高达96kHz采样率和比特率、多种语言的兼容能力、更高的效率,AAC可以在比MP3文件缩小30%的前提下提供更好的音质;
² Part 8 原计划开发一种针对10bit采样数据的视频编码算法,但后来发现业界对此欠缺兴趣,现已中止开发;
² Part 9 定义了用于传输流的实时接口;
² Part10 与Part 6的符合性测试有关,目前正在开发中;
另外,1990年成立的ATM视频编码专家组与MPEG在MPEG-2的Part 1和Part 2进行了合作,故MPEG-2的Part 1和Part 2同时也是ITU的标准,编号分别为H.220和H.262。
上图虚线右侧就是MPEG-2 Part 1的定义范围,首先将来自视音频编码期器的数据(即ES流,ElementaryStream)封装为PES(PacketisedElementary Streams),然后再视环境和用途不同进一步封装成两种码流:
² Program Stream节目流 用于相对无错的环境(如各种存储介质),封装后的包不定长,而且尺寸较大,DVD就是节目流的一种应用,MPEG-2的节目流与MPEG-1的系统层后向兼容。
² TransportSream传输流 适用于在各种恶劣环境(如ATM、SDH等)传输MPEG-2码流,采用定长包,并规定了相应的检错手段。IPTV的应用场景是IP网络,链路质量比ATM和SDH恶劣得多,显然应该采用TS格式,后面将加以详细描述。
MPEG-2传输流由一个个连续的TS包(TransportStream Packet)组成,TS包长固定为188个字节,之所以确定这个长度,其中有点故事:
MPEG-2的系统层标准是由ISO和ITU联合制定的,而在标准制定的时期,ATM炙手可热,作为ITU的标准自然要有所考虑:ATM信元的大小是53字节,其中负荷字段48字节,但其中有一个特殊字节,实际可用的负载长度是47字节,这样一个TS包刚好可以封装为4个ATM信元!
上图给出了TS包结构的语法,各字段含义如下:
² sync_byte 同步字节,固定取值为0x47,接收端可以通过这个字段从连续的字节流中正确定位TS包的起始位置——这个过程称为同步,由于0x47这个取值也可能出现在TS包的其它位置,故在进行同步时必须利用同步字节固定间隔和固定数值的特性,连续多次(通常为5-6次)在期望的位置接收到同步字节才能认为实现了同步;
² transport_error_indicator 传输错误指示,通常由MPEG-2标准范围以外的实体设置,表明TS包出错;
² payload_unit_start_indicator 负荷起始标志,TS包的负荷数据可能被封装在多个TS包中,而本字段则表示本TS包携带有其负荷数据的起始字节;
² transport_priority 优先级标志,如果此标志被置位,则负责传输TS的设备必须为这个包分配较高的优先级;
² PID 包标识,TS可以将不同用途的数据复用到同一路码流中,而不同用途的数据则靠PID彼此区分,相同用途的数据具有相同的PID。如下图所示:
PID的取值需要遵循一定的规则,其中一些被保留用于特殊用途:
PID |
用途 |
0x0000 |
PAT (Program Association Table),节目关联表,描述本路TS流中有哪些节目以及如何访问这些节目。 |
0x0001 |
CAT (Conditional Access Table),条件访问表,与加密有关 |
0x0002 |
Transport Stream Description Table,传输流描述表 |
0x0003-0x000F |
保留给系统使用 |
0x0010 |
NIT (Network Information Table),网络信息表,描述承载TS流的传输网络的情况。在MPEG-2标准中其实并没有为NIT指定特定的PID,但厂家在具体实现时,都是使用0x0010这个值。 |
0x0011-0x1FFFE |
供应用使用 |
0x1FFF |
Null Packe,用于填充的空包,TS流最初被设计为在E3、T3等时隙链路上传输,如果有效数据不足的话,就要使用空包来填充。 |
² transport_scrambling_control 传输加密标识,用来说明包负荷数据的加密方式,全0表示无加密,其余取值则由用户定义;
² adaptation_field_control 调整字段控制,用来指示TS包头是否有调整字段,取值及含义如下:
PID |
含义 |
0x00 |
本TS包没有调整字段也没有负荷 |
0x01 |
本TS包仅有负荷,没有调整字段 |
0x10 |
本TS包仅有调整字段,没有负荷 |
0x11 |
本TS包既有调整字段,又有负荷 |
调整字段类似于RTP的扩展头,逻辑上属于包头的一部分,通常用来携带一些不是专属于单个TS包的信息,某个节目的参考时钟PCR(Program Clock Reference)就是通过调整字段来传递的。PCR是一个42比特的时钟计数,其频率为27MHz,作为媒体PTS和DTS的基准,在MPEG-2中,PTS和DTS计数的时钟频率为90KHz,精度仅为PCR的1/300。
² continuity_counter 连续性计数,该字段在具有相同PID的TS包之间保持单调递增,如发生溢出则取值回绕,对于前面介绍PID时给出的例子,各TS包的连续性计数可能取值如下:
如果某个TS包没有携带负荷(调整字段控制取值为0x00或0x10,比如说空包),则该包的连续性计数字段不必递增。设计TS时的目标环境是较低差错率的时隙链路,极少发生连续数百个字节都丢失的情况,所以这个字段只分配了4个比特。在IPTV环境,连续丢包极为常见,TS的这个字段宽度显然不够用,所以在IPTV中检测TS包的丢包数,无法做到100%准确。
TS流中有多个节目,而每个节目又有音频、视频、字幕等多种数据,如何将其复用为一路码流?各个PID之间的关系是什么?MPEG-2将这些信息称为PSI (Program Specific Information),TS设计了一系列的表格来传输PSI,下面做一简单介绍:
Ø PAT Program AssociationTable,节目关联表,一个TS流中有且仅有一个PAT。PAT里面有多个条目,通常每个条目描述一个节目,每个条目有两个内容:节目的节目号和对应的PMT表的PID。MPEG-2中的“节目”与通常的频道概念相近,16位(二进制位)的节目号是其唯一标识,其中节目号0被保留给网络信息表NIT使用,下图为PAT的表结构。
Ø PMT Program MapTable,节目映射表,一个节目有一个PMT,PMT中有多个条目,每个条目给出属于该节目的一个数据流的信息,包括两部分:该数据流的类型(视频、音频、字幕等)及其对应的PID。除此之外,PMT中还可携带了与节目有关的其它信息,如PCR的PID、节目描述等,下图为PMT的表结构:
Ø NIT Network InformationTable,网络信息表,提供了传输流的相关数据以及网络自身特性相关的信息,比如网络名称,传输参数(如频率,调制方式等),NIT的PID由PAT给出,但基本固定。NIT采用PrivateSection即私有段的格式来定义,在此不做介绍。
Ø CAT Conditional AccessTable,条件接收表,用于节目的加密和解密,所在分组的PID为1,其中给出了条件控制信息(ECM)和条件管理信息(EMM)所在分组的PID。下图为其表结构:
以PAT为入口的节目复用体系如下图所示:
上图给出了PSI表格的一个例子,可见PAT和PMT中的条目基本相当于指针,PAT里面的指针指向PMT,而PMT里面的指针指向组成节目的具体媒体流。上图中ProgramB有两路音频,可能是配音语言不同,而ProgramC使用了与ProgramB同样的音频内容,这在MPEG-2的规范中也是允许的。
在实际运行时,节目的情况可能发生改变,所以在PAT和PMT的结构中,还有一个版本号字段,通过版本号的变化通知接收端需要重新解析节目信息。TS流最初被设计为用于无上行链路的环境,接收端开始接收TS流的时机是任意的,为了让接收端能正常获得节目信息,PAT和PMT必须不断重复发送(就算版本号无变化时也是如此)。为了不让接收端为此等待太长时间,重复发送的时间间隔不能太长,但MPEG-2标准本身并没有给出任何相关的建议,一般是希望不要超过500ms,也有些标准规定了比这更小的值。
上图中没有考虑CA,以CAT为入口的加扰码流结构如下图所示: