MPEG-2系统任务包括:1、规定以包传输数据的协议,2、规定收发两端数据流同步协议,3、提供多个数据流复用和解复用协议,4、提供数据流加密协议。该系统的要点是以包形式存储与传送数据流。
MPEG-2标准主要规定了传输流(TS)和程序流(PS)两种结构。Transport Stream(传输流),则主要 应用于实时传送的节目,比如实时广播的电视节目。Program Stream主要应用于存储的具有固定时长的节目,如DVD电影,可添加字幕等一些程序操作。二者的区别在于,TS流的包结构是定长的,而PS流的包结构是变长的。简单的说,你将DVD上的VOB文件的前面一截cut掉(或者干脆就是数据损坏),那么就会导致整个文件无法解码了,而电视节目是你任何时候打开电视机都能解码(收看)的,所以,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以解码的。
TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。因此在信道环境较为恶劣、传输误码较高时一般采用TS码流。
TS格式是一种较为先进的“封装格式”,BD蓝光原盘即采用TS封装,它在视频和音频打包时提供时间戳,保证了任何时间段(分离)的音画同步,TS封装支持几乎所有编码的高清视频和音轨编码。
本文的目的是将AAC编码出来的码流进行TS封装,具体过程是:AAC编码出来的码流属于基本流(Elementary Stream,ES);基本流加上PES头部信息打包形成打包的基本流PES,PES头部信息包含显示时间戳PTS和解码时间戳DTS;打包的基本流加上TS头部信息和系统信息后再分割成固定长度的包,就形成了传输流。当然也可以进一步打包成RTP以便进行网络实时传输。如下图:
将ES流加上PES头部信息打包形成PES流,PES包的长度不是固定的,但是音频PES包一般不超过字节,视频一般一帧一个PES包,一个PES包由包起始码,包头和净荷组成,包起始码长度是固定的9个字节,PES包如下图:
其中,PES Packet Length(PES包长度)表明该PES包的具体长度(尽管该值不是固定的),该长度域占两个字节,即16bit,因此该包的最大长度是65535字节,上面已经提到,用于音频码流时,该包长不超过字节,而用于视频时一般一帧一包。有一点需要指出的是,若该值设为0,则说明该包长度无或者不规定,这个仅用于视频PES包;PES Header Length(PES包头长度)表明该PES包中PES Header Fields(包头)的长度;其余的参数,我们就不在这里赘述了,下面来介绍TS(传输流)的包结构。
MPEG2-TS包结构如下:
其中一个一个的传输包就是TS包。PES包被封装到定长的TS包(TS包头4字节,净荷184字节),过程如下:首先PES的头(包括起始码和包头)被封装到一个TS包的净荷开始部分,若该PES包长度大于184字节,则该包的剩余部分分块(每块184字节,不足的用合适大小的AF填充)打包到接下来的TS包的净荷中,若该PES包长度小于184字节,则用合适大小的AF来对齐。由此可见,PES的头一定开始于TS净荷的开始部分。
TS包的分析如下:
同步字节为固定值(0x47),在选择其他经常出现的字段时应避免与该字段发生冲突。
传输错误指示符(即误码表示)为一个标志位,置1时表示相关传输流包中至少有一个不可纠正的比特差错。
负载数据单元起始指示符(即单元起始表示)为一个标志位,在Ts净荷中包含PES时,该标志位的意义是,1表示TS包的净荷以PES的首字节开始,有且仅有1个PES包在TS包的净荷开始,0表示该TS包的净荷不以PES开始;在TS净荷中包含PSI时,1表示TS包的净荷以PSI段的第一个字节开始,反之为0。
传输加扰控制(即扰码控制)指出TS包的净荷的加扰方式,对空的包该字段为00,同时置为00也意味着不加扰,置为01为保留,置为10为采用偶密钥加扰,置为11为采用奇密钥加扰,对于PES包采用相同的指示。
传输优先级(即优先权标志)置1时表示PID相同的包中有更高的优先级。
PID为13比特,指示该包净荷中存储的数据类型,PID为0x0000被保留用于节目相关表(PAT),PID为0x0001被保留用于条件接收表(CAT),PID 为0xO002~0x001F也被保留用于PSI和SI,PID为0xlFFF被保留用于空的TS包。
适应域控制(即AF控制)指TS包头后面是否有适应域,该字段置00为保留,标准解码器会丢弃该包,置为01表示没有适应域仅有有效负载,置为10表示仅有适应域没有有效负载,置为11表示跟有有效负载的适应域,如果有适应域则位于TS包净荷的开始部分。
连续性计数器(即循环计数器)为4个比特,随着每个具有相同PID值的包而递增,达到最大值回卷为0,但是当适应域控制为00和10时该字段不递增。数据字节为来自PES或PSI和SI的连续字节的数据或填充字节,当PID为0xlFFF空包时可以是任意值。
TS包中净荷所传输的信息包括两种类型:1)视频、音频的PES包以及辅助数据;2)描述节目复用信息的节目映射表(PAT:Program Associate Table)以及节目映射表(PMT:Program Map Table)、其他PSI的表格和SI的表格。
TS(传输流)在IP网上传输,为保证可靠性,紧接着数据需要打成RTP包;待传输的RTP包要以IP形式在网络上传输,需要将RTP包封装成UDP包,然后在将UDP包打成IP包发送到网络上;客户端在接收到载有视频信息的IP数据后,去掉IP头送往UDP层;再UDP层去掉UDP头,解出RTP信息:解析RTP包,得到TS数据流。
但是,关键问题是,前面解包各个层次得到一些长度信息对于得到TS流中PES的长度信息没有意义,因为TS包的长度是固定的,就是188个字节,所以IP、UDP、RTP包的长度信息起不到作用。TS长度一定,虽然其中有没有适应域我们可以解包TS头部信息得到,但是这个适应域多长,我们不可得知,但是由于我们要传输的是音频码流,而音频码流的PES包一般不超过字节,因此我们可以推断,一般情况下,这个适应域是肯定存在,但是长度不确定。由于适应域的长度不确定,因此我们无法求得PES包的长度,如下:
PES包的长度=188字节-TS包头长度(4字节)-适应域长度(未知)
即便我们知道PES包的长度,我们也无法进一步去求AAC码流的长度,因为:
AAC码流长度=PES包的长度-PES包起始码长度(9字节)-PES包头域长度(未知)
而上式中,PES包头域的长度不是固定的,它的值可以根据PES起始码中的PES Header Length来得到,但由于不允许解PES包,因此这个值无法取得,因而,AAC码流的长度是无法计算的。
当然,如果可以得到AAC码流长度,那我们就可以进一步判断该码流是语音帧还是静音帧了。下载本文