ChinaFFmpeg

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7361|回复: 1

[转帖]单节目变码率TS流复用算法的研究及实现

[复制链接]
发表于 2013-12-13 11:44:40 | 显示全部楼层 |阅读模式

关键词

       节目,变码率,音视频交织,PCR,DTS,PTS,PSI/SI

前言

数字电视中,节目的音视频信息经过编码后的数据,称为基本流(ES),为了满足传输需要,这些ES数据一般还要经过打包(PES)复用成传输流(TS)。TS流有两种,一种是仅包括单个节目的音视频的TS流,我们称为单节目流,另一种是多个节目打包复用成一个TS流,我们称之为多节目复用流。在本文中,我们对单节目的变码率TS的复用方法进行探讨,提出了一种解决方案,并通过试验得到了良好的效果。

节目复用需要解决的问题音视频数据交织

音视频数据的交织,是TS复用中的关键环节。音视频的交织要保证音视频的同步,避免解码器在解复用和解码时的缓冲器溢出。音视频的交织方法有很多种,在本文中,我们提出一种基于音频的交织方法。我们知道,编码后的音频数据一般来讲比较接近于恒定码率,而编码后的视频数据,每帧数据码率变化相对校大。基于音频的交织方法步骤如下:

1 每次交织取相同时间长度的视频数据和音频数据,分别存放在两个缓冲中。

2 将音频数据和视频数据分别进行PES打包,并根据TS流的生成规则生成成TS包。TS流的生成规则主要包括分配PID,连续计数的处理,起始标志的设置等。

3 为每包TS流音频数据做一个计数标志,从0开始,每次加1,依次递增。最大值记为N。

4 为每包TS流视频数据做一个计数标志,从0开始,每次加1,依次递增。最大值记为M,计算视频数据包除以音频数据包的倍数n(n可以为非整数):

n=M/N   

5 修改视频数据的计数标志,每包视频TS流数据的原计数标志除以n作为新的计数标志。

6 开始交织,每次比较音视频两个缓冲的第一个TS包的计数值,取每次值较小的那个音频或视频TS包作为目标TS流的新一包数据,如果计数值相等先取音频。

7 依次类推,直到缓冲中没有数据。

8 重复1~7,直到停止复用

对于每次交织的数据时间长度(InterlaceDuration),即可以以帧为单位进行计算,如果视频每帧时间长度为40ms,音频每帧时间长度为8ms,可以每次取40ms的视频数据和40ms的音频数据进行交织。如果视频每帧时间长度为40ms,音频每帧为24ms,则可以每次取120ms的视频和120ms的音频进行交织;当然也可以每次取整帧音频数据,视频长度根据音频的长度进行截取。

PCR的生成

PCR作为节目参考时钟,是解码端解码和播放的时间基准。DVB标准需求PCR的间隔不能大于40ms。在变码率中,PCR的生成也可以根据每包音频TS包的时间进行计算。在上一节交织步骤中,我们为每包音频的TS包打上了一个计数标志,通过每次交织时音频TS的初始时间,和当前的计数标志,我们可以计算出每包TS流数据的时间:

TS_Time(i) = TS_Time(0) +InterlaceDuration_Duration * i/N

其中:

       TS_Time(i)  是要计算的当前TS包的时间值。

       TS_Time(0) 是本次交织时第一包数据的时间。

InterlaceDuration 是参与交织的数据的时间长度。

N 是参与交织的TS数据包的数量。

通过计算TS_Time(i),我可以用当前时间减去上次添加PCR时间,如果差值大于30ms时,添加一次PCR,从而保证PCR的间隔符合DVB标准。

在计算PCR值时需要注意两点,一是PCR节目时钟为27MHz,我们计算的时间以ms为单位,需要进行时间单位的转化,转化的详细步骤不再赘述;二是复用时第一包TS流数据的TS_Time可以作为PCR初始值,这样我们简单地认为每次添加的PCR就等于每次计算的TS_Time。

DTS/PTS的生成

DTS/PTS描述了ES流的解码时间和显示时间,在对ES数据进行PES打包时添加在PES的包头中。对于视频而言,DTS/PTS根据IBP帧类型不同而不同, I帧的DTS一般和PTS相同或早于PTS,P帧的DTS一般早于PTS,而B帧中一般只有PTS,它的DTS和PTS相同。对于音频而言,只有PTS,表示DTS和PTS相同。

对DTS而言,如果它的值和DTS所在TS包的TS_Time值(见上一节介绍)相差太大(即DTS-PCR),就会造成缓冲区的上溢,如果太小甚至是负数,就会造成下溢,所以在DTS和TS_Time之间选择一个合适的差值是一个非常关键的问题。对于视频而言,在每个PES的图像头中有一个vbv_delay,它用来设置解码器的缓冲区,以避免解码器缓冲区上溢或下溢。一般我们取这个差值为:

0 < Video_Distance(DTS- TS_Time) <= vbv_delay

每帧视频数据vbv_delay值一般为700ms左右,也可能是一个不断变化的值,所以一般我们可以取这个差值在200ms到400ms,保证不接近临界值即可。

对于音频,根据实验情况,一般取

0 < Audio_Distance(PTS- TS_Time) <= 90ms

DTS和PTS是90KHz时钟,在实际的PES打包中,也需要进行时间单位的转换。

PSI/SI表格的生成

在DVB标准中,对不同的PSI/SI表格规定了不同的发送间隔。我们可以根据当前的TS_Time值进行发送间隔的控制。用当前包的TS_Time值减去上次发送表格时TS包的TS_Time,如果这个时间间隔大于我们指定的间隔(这个间隔一般取小于表格要求的发送间隔,比如PAT表需求每500ms发送一次,我们可以控制在400ms左右),就发送一次表格。表格的生成方式,请参阅DVB相关标准,在此不再赘述。

实验结果

在实验中,我们取40ms每帧的视频数据和24ms每帧的音频数据进行复用试验,每次参与复用交织的数据长度为120ms,PCR从0开始,视频的DTS从200ms开始,音频的PTS从80ms开始,在实验中,对于PSI/SI表格,我们仅生成了PAT和PMT表。复用后的单节目流使用码流分析工具分析结果如下:


TR101290分析结果



PCR分析结果



视音频PES分析结果

结束语

       随着数字电视的普及,基于DVB的数字电视复用技术在行业内的应用也越来越广泛,在本文中,我们通过对单节目变码率TS流复用方法的探索和试验,提出了一种基于音频数据进行复用算法,希望能对复用技术的发展和应用尽微薄之力。

参考文献

1 钟玉琢,王琪等                     《MPEG-2运动图像压缩编码国际标准及MPEG的新进展》

2 方涛                                       《数字电视业务信息及编码》

3 王东兴 余松煜 梁龙飞           《关于复用器数据插入方式的研究

4 杜江洪                                   《基于CATV网MPEG-2 TS复用器包调度算法

5 杨峰 白新跃 何建                 《变码率TS流动态复用算法设计》

6 陈卫兵 徐重阳 刘卫忠           ES复用MPEG-2 TS流的缓冲区控制策略及实现

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

发表于 2014-6-20 16:27:28 | 显示全部楼层
顶,这是必须的,大牛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|Archiver|ChinaFFmpeg

GMT+8, 2024-4-20 05:03 , Processed in 0.051144 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表