分类: LINUX
2008-07-27 10:23:39
1. 简述
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. 提供多个数据流的复用和解复用协议;
3. 提供数据流加密的协议。
以包形式存储和传送数据流是MPEG2系统之要点。
2. ES数据流
ES是直接从编码器出来的数据流,可以是编码过的视频数据流,音频数据流,或其他编码数据流的统称。ES流经过PES打包器之后,被转换成PES包。PES包由包头和payload组成,具体格式摘录如下:
在PES层,主要是在PES包头信息中加入PTS(显示时间标签)和DTS(解码时间标签)用于视频、音频同步。
其实,Mpeg-2用于视音频同步以及系统时钟恢复的时间标签分别在ES,PES和TS这3个层次中。在ES层,与同步有关的主要是视频缓冲验证VBV(Video Buffer Verifier),用以防止解码器的缓冲器出现上溢或下溢;在PES层,主要是在PES头信息里出现的显示时间标签PTS(Presentation Time Stamp)和解码时间标签DTS(Decoding Time Stamp);在TS层中,TS头信息包含了节目时钟参考PCR(Program Clock Reference),用于恢复出与编码端一致的系统时序时钟STC(System Time Clock)。
我们先看看从ES到PES的过程:
基本流程如下:首先MPEG-2压缩编码得到的ES基本流,这个数据流很大,并且只是I,P,B的这些视频帧或音频取样信息,然后加入一些同步信息,打包成长度可变长度的数据包PES,原来是流的格式,现在成了数据包的分割形式。同时要注意的是,ES是只包含一种内容的数据流,如只含视频,或只含音频等,打包之后的PES也是只含一种性质的ES,如只含视频ES的PES,只含音频ES的PES等。可以知道,ES是编码视频数据流或音频数据流,每个ES都由若干个存取单元(AU)组成,每个视频AU或音频AU都是由头部和编码数据两部分组成,1个AU相当于编码的1幅视频图像或1个音频帧,也可以说,每个AU实际上是编码数据流的显示单元,即相当于解码的1幅视频图像或1个音频帧的取样。PEG-2对视频的压缩产生I帧、P帧、B帧。把帧顺序I1,P4,B2,B3,P7,B5,B6帧的编码ES,通过打包并在每个帧中插入 PTS/DTS标志,变成PES。在插入PTS/DTS标志时,由于在B帧PTS和DTS相等,所以无须在B帧多插入DTS。而对于I帧 和P帧,由于经过复用后数据包的顺序会发生变化,显示前一定要存储于视频解码器的从新排序缓存器中,经过从新排序后再显示,所以一定要同时插入PTS和 DTS作为从新排序的依据。
其中,有否PTS/DTS标志,是解决视音频同步显示、防止解码器输入缓存器上溢或下溢的关键所在。PTS表明显示单元出现在系统目标解码器(STD-
System Target Decoder)的时间, DTS表明将存取单元全部字节从STD的ES解码缓存器移走的时刻。视频编码图像帧次序为 I1,P4,B2,B3,P7,B5,B6,I10,B8,B9的ES,加入PTS/DTS后,打包成一个个视频PES包。每个PES包都有一个包头,用于定义PES内的数据内容,提供定时资料。每个I、P、B帧的包头都有一个PTS和DTS,但PTS与DTS对B帧都是一样的,无须标出B帧的DTS。对I帧和P帧,显示前一定要存储于视频解码器的重新排序缓存器中,经过延迟(重新排序)后再显示,一定要分别标明PTS和DTS。例如,解码器输入的图像帧次序为I1,P4,B2,B3,P7,B5,B6,I10,B8,B9,依解码器输出的帧次序,应该P4比B2、B3在先,但显示时P4一定要比B2、B3在后,即P4要在提前插入数据流中的时间标志指引下,经过缓存器重新排序,以重建编码前视频帧次序I1,B2,B3,P4,B5,B6,P7,B8,B9,I10。显然,PTS/DTS标志表明对确定事件或确定信息解码的专用时标的存在,依靠专用时标解码器,可知道该确定事件或确定信息开始解码或显示的时刻。例如,PTS/DTS标志可用于确定编码、多路复用、解码、重建的时间。
3. PS数据流
上节说过,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格式摘录如下:
byte 0 |
byte 1 |
byte 2 |
byte 3 |
||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0000 0000 0000 0000
0000 0001 start code |
1011 1010 PACK identifier |
||||||||||||||||||||||||||||||
byte 4 |
byte 5 |
byte 6 |
byte 7 |
byte 8 |
byte 9 |
||||||||||||||||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
01 |
SCR 32..30 |
1 |
SCR 29..15 |
1 |
SCR 14..00 |
1 |
SCR_ext |
1 |
|||||||||||||||||||||||||||||||||||||||
byte 10 |
byte 11 |
byte 12 |
byte 13 |
||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Program_Mux_Rate |
1 |
1 |
reserved |
pack_stuffing_length |
|||||||||||||||||||||||||||
PS包的长度比较长且可变,主要用于无误码环境里,因为越长的话,同步越困难,且在丢包的情况下,重组也越困难。所以,PS适合于节目信息的编辑和本地内容应用的application。
4. TS数据流
TS流也是由一个或多个PES组合而来的,他们可以具有相同的时间基准,也可以不同。其基本的复用思想是,对具有相同时间基准的多个PES现进行节目复用,然后再对相互有独立时间基准的各个PS进行传输复用,最终产生出TS。TS包由包头和包数据2部分组成,其中包头还可以包括扩展的自适用区。包头长度占4bytes,自使用区和包数据共占184bytes,整个TS包长度相当于4个ATM包长。TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。
对上面的各个字段简单说明一下:
Partial Transport Stream Packet Format |
||
Name |
Number |
Description |
|
8 |
0x47 |
Transport Error
Indicator (TEI) |
1 |
Set by
if can't correct errors in the stream |
Payload Unit Start
Indicator |
1 |
1 means start of data or otherwise zero only . |
Transport Priority |
1 |
One means higher
priority than other packets with the same PID. |
PID |
13 |
Packet ID |
Scrambling control |
2 |
'00' = Not
scrambled. The following per spec :
'01' = Reserved for future use, '10' = Scrambled with even key,
'11' = Scrambled with odd key |
Adaptation field
exist |
1 |
1 means presence of
the adaptation field |
Payload data exist |
1 |
1 means presence of
data |
Continuity counter |
4 |
|
|
|
Note: the total
number of bits above is 32 and is called the transport stream 4-byte prefix. |
Adaptation field |
0 or more |
Depends on flags |
|
0 or more |
Depends on flags |
Adaptation Field Format |
||
Name |
Number |
Description |
Adaptation Field
Length |
8 |
Number of bytes in
the adaptation field immediately following this byte |
Discontinuity
indicator |
1 |
Set to 1 if a
discontinuity occurred in the continuity counter of the TS packet |
Random Access
indicator |
1 |
Set to 1 if the PES
packet in this TS packet starts a video/audio sequence |
priority indicator |
1 |
1 = higher priority |
PCR flag |
1 |
1 means adaptation
field does contain a PCR field |
OPCR flag |
1 |
|
Splicing point flag |
1 |
1 means presence of
splice countdown field in adaptation field |
Transport private
data flag |
1 |
1 means presence of
private data bytes in adaptation field |
Adaptation field
extension flag |
1 |
1 means presence of
adaptation field extension |
Below fields are
optional |
variable |
Depends on flags |
PCR |
33+9 |
Program clock
reference |
OPCR |
33+9 |
Original Program clock
reference. Helps when one TS is copied into another |
Splice countdown |
8 |
Indicates how many
TS packets from this one a splicing point occurs (may be negative) |
stuffing bytes |
variable |
|
其中,在包头中:
同步字节()的自动相关特性,检测数据流中的包限制,建立包同步;
传输误码指示符(Transport Error Indicator),指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;
有效载荷单元起始指示符(Payload Unit Start Indicator),表示该数据包是否存在确定的起始信息;
传输优先级(Transport Priority),是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;
传输加扰控制(Scrambling control),可指示数据包内容是否加扰,但包头和自适应区永远不加扰;
自适应区控制存在字段(Adaptation field exist),用2 bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;
载荷存在标记字段(Payload data exist),1一位着存在载荷;
连续计数器(Continuity counter)可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。显然,包头对TS包具有同步、识别、检错及加密功能。
TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。重要的是标志部分的PCR字段,可给编解码器的27MHz时钟提供同步资料,进行同步。其过程是,通过PLL,用解码时本地用PCR相位与输入的瞬时PCR相位锁相比较,确定解码过程是否同步,若不同步,则用这个瞬时PCR调整时钟频率。因为,数字图像采用了复杂而不同的压缩编码算法,造成每幅图像的数据各不相同,使直接从压缩编码图像数据的开始部分获取时钟信息成为不可能。为此,选择了某些(而非全部)TS包的自适应区来传送定时信息。于是,被选中的TS包的自适应区,可用于测定包信息的控制bit和重要的控制信息。自适应区无须伴随每个包都发送,发送多少主要由选中的TS包的传输专用时标参数决定。标志中的随机存取指示符和接点标志,在节目变动时,为随机进入I帧压缩的数据流提供随机进入点,也为插入当地节目提供方便。自适应区中的填充数据是由于PES包长不可能正好转为TS包的整数倍,最后的TS包保留一小部分有用容量,通过填充字节加以填补,这样可以防止缓存器下溢,保持总码率恒定不变。