一种MPEG-2编码复用的方法
技术领域
本发明涉及数字电视技术领域,尤其涉及一种MPEG-2编码复用的方法。
背景技术
伴随科学技术的发展,“数字化”席卷全球。由于数字电视具有不可比拟的优越性,广播电视从模拟向数字全面转变已经成为不可抗拒的发展潮流。由于人们对节目、业务和各种增值服务的需求始终在增长,因此如何利用技术更好地提高图像质量,并保证节目在网络上可靠传输成为具有价值和吸引力的研究课题。
在数字电视系统中,MPEG-2编码复用器是系统传输的核心环节,所有的节目、数据以及各种增值服务都是通过复用打包成传输流(Transport Stream,TS)传输出去的。目前,只有国外少数公司掌握复用器的核心算法技术,能够保证高质量图像传输,但进口设备价格极其昂贵,而且算法都较为复杂,无法保证软硬件的简单实现。由于目前正处广播电视全面向数字化过渡期间,市场潜力巨大,因此对复用器以及码率控制算法的研究开发非常重要。
目前的技术方案是以传输流的节目时钟参考(Program Clock Reference,PCR)数据包为基准来进行计算。首先设定一个恒定的TS流码率,再根据码率值,以及相邻两个PCR数据包的差值,估算出这两个PCR数据包之间应该包含的TS数据包个数,然后将估算出的TS数据包个数跟实际的TS数据包个数相减,得到的差值即为要添加的空包数目。
这个技术方案虽然总体上能很好地控制码率,但是由于没有考虑到帧级的控制策略,导致显示时间标签(Play Time Stamp,PTS)和解码时间标签(Decode Time Stamp,DTS)的值有时会小于PCR数据包的值,使得图像产生马赛克和抖动等现象。
发明内容
本发明的目的在于提出一种MPEG-2编码复用的方法,能够快速高效地生成恒定码率的传输流,并且提高图像的主观质量。
为达此目的,本发明采用以下技术方案:
一种MPEG-2编码复用的方法,包括以下步骤:
A、从输入的基本流文件的基本流数据中检测出帧头;
B、插入节目关联表数据包和节目映射表数据包;
C、插入含有打包的基本流数据包头和基本流数据的传输流数据包,其中所述打包的基本流数据包头包括显示时间标签和解码时间标签;
D、插入节目时钟参考数据包;
E、判断当前帧的基本流数据是否处理完毕,如果否,则继续将剩余的基本流数据打包成传输流数据包,直到当前帧的基本流数据处理完毕,形成传输流数据帧,转至步骤F,如果是,则形成传输流数据帧,转至步骤F;
F、在每个图组的传输流数据帧中插入空包,使得图组的大小固定为一个预设值;
G、判断基本流文件是否处理完毕,如果是,则输出打包后的传输流文件,完成复用,如果否,则返回到步骤A,继续检测帧头。
步骤C中,显示时间标签和解码时间标签的生成进一步包括以下步骤:
计算一帧图像的帧历时,计算公式为frame_time=90000/frame_rate,其中frame_time是帧历时,90000赫兹是27兆赫兹系统时钟的1/300,frame_rate是帧率;
从快进快退模块传来的参数得到初始参考值,包括显示时间标签初始参考 值PTS(1)和解码时间标签初始参考值DTS(1);
此后传输流数据帧中第i帧图像的显示时间标签PTS(i)和解码时间标签DTS(i)通过以下计算公式获得:
DTS(i)=DTS(1)+frame_time*(i-1),
PTS(i)=PTS(1)+frame_time*(N+temp_ref+1),其中N是第i帧所在图组的图组头之前帧的总数,temp_ref是第i帧图像头中10bit字段的十进制值,表示在这个图组中第i帧所在的位置。
显示时间标签和解码时间标签每隔700毫秒至少出现1次。
节目时钟参考数据包包括33位的节目时钟参考基准pcr_base和9位的节目时钟参考扩展pcr_ext。
节目时钟参考数据包在传输流数据帧中每隔40毫秒至少出现1次。
节目时钟参考基准pcr_base以27兆赫兹的1/300为基准,即90千赫兹,节目时钟参考扩展pcr_ext以27兆赫兹系统时钟为基准,节目时钟参考的值根据当前所在传输流数据包的包号和传输码率采用以下计算公式来确定:
pcr_base=(90000*8*((188*ts_packet_num+12)/ts_rate)),
pcr_ext=(27000000*(((188*ts_packet_num+12)*8)/ts_rate))%300
pcr=300*pcr_base+pcr_ext,
其中ts_packet_num是当前所在传输流数据包的包号,ts_rate是传输流传输码率。
传输流数据包包括4个字节的包头和184个字节的基本流数据。
步骤F进一步包括以下步骤:
预先设定图组大小GOP_size;
根据基本流原始的图组大小GOP_size_org和预先设定图组大小GOP_size的差值,算出当前图组平均每个传输流数据帧应该插入的空包数量average_num,average_num=(GOP_size-GOP_size_org)/188,其中188 是一个传输流数据包中的字节个数,并对average_num取整,得到每个传输流数据帧插入的空包数量;
在每个传输流数据帧插入所述空包数量的空包;
在图组的最后一个传输流数据帧,根据预先设定图组大小GOP_size和图组当前已经打包了的传输流数据包的个数total_num之间的差值,得出最后一个传输流数据帧末尾应该插入的空包数量stuff_num,stuff_num=GOP_size/188-total_num,从而使得图组的大小固定。
采用了本发明的技术方案,通过对TS流复用过程中的码率、PCR、PTS和DTS值的调整,能够快速高效地生成恒定码率的TS流,复用的效率大幅提高,码率波动较小,解决了马赛克和图像抖动的问题,图像主观质量较高。
附图说明
图1是本发明具体实施方式中MPEG-2编码复用的流程图。
具体实施方式
下面结合附图并通过具体实施方式来进一步说明本发明的技术方案。
图1是本发明具体实施方式中MPEG-2编码复用的流程图。如图1所示,该MPEG-2编码复用的流程包括以下步骤:
步骤101、输入基本流文件,并对输入的基本流数据进行检测,判断是否帧头,如果是帧头,则转至步骤102,否则循环检测基本流数据,直到检测到第一个帧头。
步骤102、在每帧的开始插入一个节目关联表(Program AssociationTable,PAT)数据包。每个传输流必须有一完整有效的PAT,PAT给出了节目号(program number)和带有此节目数据的传输流分组PID(PMT_PID)之间的 对应关系。
步骤103、在PAT数据包后插入一个节目映射表(Program Map Table,PMT)数据包。节目映射表(PMT)提供一个节目号(program number)和组成此节目的基本流之间的映射。
步骤104、在PMT数据包后插入一个含有打包的基本流(PacketElementary Stream,PES)数据包头和部分基本流数据的传输流数据包。
PES包头里的两个关键数据是33位的PTS和33位的DTS,在每个PES包头中都加入这两个数据。其中,每个传输流的PTS和DTS每隔700毫秒至少要出现一次。
PTS和DTS的计算,是保证码率恒定的关键,可采取如下方法:
计算一帧图像的帧历时,计算公式为frame_time=90000/frame_rate,其中frame_time是帧历时,90000赫兹是27兆赫兹系统时钟的1/300,frame_rate是帧率;
从快进快退模块传来的参数得到初始参考值,包括显示时间标签初始参考值PTS(1)和解码时间标签初始参考值DTS(1);
此后传输流数据帧中第i帧图像的显示时间标签PTS(i)和解码时间标签DTS(i)通过以下计算公式获得:
DTS(i)=DTS(1)+frame_time*(i-1),
PTS(i)=PTS(1)+frame_time*(N+temp_ref+1),其中N是第i帧所在图组的图组头之前帧的总数,temp_ref是第i帧图像头中10bit字段的十进制值,表示在这个图组中第i帧所在的位置。
步骤105、插入节目时钟参考数据包。
TS流中的PCR数据包至少每隔40毫秒出现一次,解码器通过TS流中节目的PCR可以使解码器恢复系统时钟,PTS和DTS又参考PCR,这样就能够达到音频数据和视频端到端恒定延时,从而保证了音视频的同步以及码率的恒定。DTS是视频数据从主缓冲区中输出的时刻,每一帧数据的输入时刻都要早于这帧数据 的DTS。
节目时钟参考数据包包括33位的节目时钟参考基准pcr_base和9位的节目时钟参考扩展pcr_ext。节目时钟参考基准pcr_base以27兆赫兹的1/300为基准,即90千赫兹,节目时钟参考扩展pcr_ext以27兆赫兹系统时钟为基准,节目时钟参考的值根据当前所在传输流数据包的包号和传输码率采用以下计算公式来确定:
pcr_base=(90000*8*((188*ts_packet_num+12)/ts_rate)),
pcr_ext=(27000000*(((188*ts_packet_num+12)*8)/ts_rate))%300
pcr=300*pcr_base+pcr_ext,
其中ts_packet_num是当前所在传输流数据包的包号,ts_rate是传输流传输码率。
步骤106、判断当前帧的基本流数据是否处理完毕,如果否,则继续将剩余的基本流数据打包成传输流数据包,该传输流数据包由4个字节的包头和184字节的基本流数据组成,直到当前帧的基本流数据处理完毕,形成传输流数据帧,转至步骤107,如果是,则形成传输流数据帧,转至步骤107。
步骤107、因为传输流的帧率是恒定的,再设定一个固定的图组(Group OfPictures,GOP)大小GOP_size,每个传输流数据帧都插入一定数目的空包,这样就达到码率的恒定。
首先预先设定图组大小GOP_size。
根据基本流原始的图组大小GOP_size_org和预先设定图组大小GOP_size的差值,算出当前图组平均每个传输流数据帧应该插入的空包数量average_num。
其中average_num=(GOP_size-GOP_size_org)/188,188是一个传输流数据包中的字节个数,再对average_ num取整,得到每个传输流数据帧插入的空包数量。
在每个传输流数据帧插入需要的空包数量的空包。
在图组的最后一个传输流数据帧,根据预先设定图组大小GOP_size和图组当前已经打包了的传输流数据包的个数total_num之间的差值,得出最后一个传输流数据帧末尾应该插入的空包数量stuff_num。
其中stuff_num=GOP_size/188-total_num,从而使得图组的大小固定。
步骤108、判断输入的整个基本流文件是否处理完毕,如果已经处理完毕,则直接输出打包后的传输流文件,完成复用过程,如果否,则返回到步骤101,继续检测帧头,如此循环往复,直到将整个基本流文件处理完毕,这样就完成了基本流到传输流的复用过程。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。