常见视频编码格式解析
1、MPEG2-TS编码技术
1.1. MPEG-TS简介
MPEG2-TS(Transport Stream“传输流”;又称TS、TP、MPEG-TS或M2T)是用于音效、图像与数据的通信协定,最早应用于DVD的实时传送节目。
区别:
DVD节目中的MPEG2格式,确切地说是MPEG2-PS,全称是Program Stream(程序流),而TS的全称则是Transport Stream(传输流)。MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,可添加字幕等一些程序操作。而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。
简单地说,将DVD上的VOB文件的前面一截cut掉(或者是数据损坏数据)就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码(收看)的。所以MPEG2-TS格式的特点就是从视频流的任一片段开始都是可以独立解码。
1.2. 基本概念及TS流概述
(1)ES流(Elementary Stream,基本流):基本码流,不分段的音频、视频或其他信息的连续码流。
(2)PES流(Paketized Elementary Stream,打包基本码流):是将基本的码流ES流根据需要分成长度不等的数据包,并加上包头就形成了打包的基本码流PES流。
(3)PS流(Program Stream,节目流):将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述后的码流。PS流是一种多路复用数字音频、视频等的封装容器,它是一个或多个具有共同的时间基准的PES流合并成一个整体流,主要用于节目存储。其包长不固定,且较长,一旦失去同步信息,接收机无法确定下一包的同步位置,会造成失步,导致严重的信息丢失。PS流适用于误码小、信道较好的环境,如演播室、家庭环境和存储介质中。
(4)TS流(Transport Stream,传输流):是将一个节目的多个组成部分按照它们之间的互相关系进行组织并加入各组成部分关系描述和节目组成信息,并进一步封装成传输包后的码流。TS流是将视频、音频、PSI等数据打包成传输包进行传送。主要用于节目传输。TS的传输包长度固定,一般为188字节。
(5)TS流和PS流是MPEG-2标准中规定的两种输出码流。TS格式中,从视频流的任意一片断开始都可以独立解码,而PS格式不可以。由于TS流具备较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS流的包格式。
(6)TS流的播放:播放前将TS流文件的后缀名改为.mpg或者.mpeg,用可以直接播放MPEG-TS流的播放器(一般的播放器都可以)打开播放即可。
(7)TS流的优点:
- 动态带宽分配:由于TS的传输包长度是固定的,因此可过PID将规定的信道总频带在视频、音频和数据信息进行实时的、灵活的分配。利用这一特性,可在广播付费节目前实时地将解密钥匙插入到TS流中送给广大用户。
- 可分级性:允许一个复用的传输码流与其他视音频基本码流进行二次复用,生产占用频带给宽的更高一级的TS流。
- 可扩展性
- 抗干扰性
- 接收机成本低廉
(8)TS流的形成过程:
- 压缩【显示单元】产生【进入单元】,连续的【进入单元】组成一个基本码流。
- 对ES(基本码流)进行打包形成PES。
- 在PES包中加入定时信息(PTS/DTS)。
- 将PES包内容分配到一系列固定长度的传输包中。
- 在传输包中加入定时信息(PCR)。
- 在传输包中加入节目专用信息(PSI) 。
- 连续输出传输包形成具有恒定比特率的MPEG-TS流。
1.3. 基本流程
下图是在MPEG-2系统中编码端实现单一码流的详细过程:
图1-1 MPEG-2 TS编码流程
(1)A/D转换后,通过MPEG-2压缩编码得到ES基本流。该流数据量很大,并且只是I P B帧的取样信息。
(2)通过PES打包器,打包并在每个帧中插入PTS/DTS标识,编程PES。原来是流的格式,现在成了数据包的分割形式。
(3)PES根据需要打包成PS或者TS包进行存储。
1.4. TS流传输包(简称TS包)结构分析
MPEG-2中规定TS传输包的长度为188字节。但通信媒介会为包添加错误校验字节,从而有了不同于188字节的包长。例如:
DVB规定中,使用204字节作为包长:① 通过调制器时,在每个传输包后增加了16字节的里德所罗门前向纠错码,因而形成了204字节的数据包。调制后总存在204字节的数据包。② 调制之前存复用器插入RS码或虚构的RS码。
ATSC规定中,使用208字节作为包长:添加20字节的RS(Reed-Solomon)前向纠错码。与DVB不同,ATSC规定RS码只能出现在调制的TS流中。
所有的TS包都分为包头和净荷部分。TS包中可以填入很多东西(填入的东西都是填入到净荷部分),有:视频、音频、数据(包括PSI、SI以及其它任何形式的数据)。
TS流是基于Packet的位流格式,每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。整个TS流组成形式如下:
包头信息分析见1.4.1。TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也为插入当地节目提供方便。自适应区中的填充数据是由于PES包长不可能正好转为TS包的整数倍,最后的TS包保留一小部分有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。
1.4.1. TS包包头
TS包的包头提供关于传输方面的信息:同步、有无差错、有无加扰、PCR(节目参考时钟)等标志。TS包的包头长度不固定,前32比特(4个字节)固定,后面可能跟有自适应字段(适配域)。32个比特(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:Packet ID号码,唯一的号码对应不同的包,指示存储与分组有效负载中数据的类型。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。
PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。
表 | PID值 |
---|---|
PAT | 0x0000 |
CAT | 0x0001 |
TSDT | 0x0002 |
EIT,ST | 0x0012 |
RST,ST | 0x0013 |
TDT,TOT,ST | 0x0014 |
1.4.2. TS包净荷部分
TS包中净荷所传输的信息包括两种类型:
① 视频、音频的PES包以及辅助数据;
② 节目专用信息PSI。
当然,TS包也可以是空包。空包用来填充TS流,可能在重新进行多路复用时被插入或删除。
在系统复用时,视频、音频的ES流需进行打包形成视频、音频的PES流,辅助数据(如图文电视信息)不需要打成PES包。PES包非定长,音频的PES包小于等于64K,视频的一般为一帧一个PES包。一帧图象的PES包通常要由许多个TS包来传输。MPEG-2中规定,一个PES包必须由整数个TS包来传输。如果承载一个PES包的最后一个TS包没能装满,则用填充字节来填满;当下一个新的PES包形成时,需用新的TS包来开始传输。
(1)PES相关
PES是打包过的ES,已经插入PTS和DTS,一般一个PES是一帧图像。
图1-2 一个打包基本流(PES)包的组成
PES经过打包成TS或PS流,往往一个PES会分存到多个TS包中。
- PES包的包起始码:包起始码前缀是一个固定的码字结构,它的值是0x000001,用于收发两端对PES包进行同步。
- PES包的长度:PES包的长度是可变的,PES包长度域有两个字节,共16比特,因此PES包的最大长度是65535字节
- PES包头:PES包头的功能根据特定的应用场合有所不同,包括加扰控制,优先级,ES流速率和CRC等,其中有两个重要的工作:PTS和DTS。
可以看到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。
(2)节目专用信息PSI(Program Specific Information)
管理各种类型的TS数据包,需要有些特殊的TS包来确立各个TS数据包之间的关系。这些特殊的TS包里所包含的信息就是节目专用信息。在不同的标准中它有不同的名字:
① MPEG-2中称为PSI;
② DVB标准根据实际需要,对PSI扩展,称为SI信息;
③ ATSC标准中为PSIP信息;
MPEG-2中,规定的对PSI信息的描述方法有以下几种:
- 表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)
- 节Section:将表格的内容映射到TS流中;
专用段Private_ section - 描述符Descriptor:提供有关节目构成(视频流、音频流