2024年4月6日发(作者:)

MPEG2-TS打包AAC码流:

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

TS

RTP

将ES流加上PES头部信息打包形成PES流,PES包的长度不是固定的,但是音频PES

包一般不超过64字节,视频一般一帧一个PES包,一个PES包由包起始码,包头和净荷组

成,包起始码长度是固定的9个字节,PES包如下图:

包起始码

包头

净荷

其中,PES Packet Length(PES包长度)表明该PES包的具体长度(尽管该值不是固定的),

该长度域占两个字节,即16bit,因此该包的最大长度是65535字节,上面已经提到,用于

音频码流时,该包长不超过64字节,而用于视频时一般一帧一包。有一点需要指出的是,

若该值设为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包一般

不超过64字节,因此我们可以推断,一般情况下,这个适应域是肯定存在,但是长度不确定。

由于适应域的长度不确定,因此我们无法求得PES包的长度,如下:

PES包的长度=188字节-TS包头长度(4字节)-适应域长度(未知)

即便我们知道PES包的长度,我们也无法进一步去求AAC码流的长度,因为:

AAC码流长度=PES包的长度-PES包起始码长度(9字节)-PES包头域长度(未知)

而上式中,PES包头域的长度不是固定的,它的值可以根据PES起始码中的PES Header

Length来得到,但由于不允许解PES包,因此这个值无法取得,因而,AAC码流的长度是无法

计算的。

当然,如果可以得到AAC码流长度,那我们就可以进一步判断该码流是语音帧还是静音

帧了。