一种基于TS包比例占用的固定码率TS流复用算法
多节目TS流复用的主要技术难点在于参与复用的各数据单元——包括PSI/SI表格,PCR,音视频及空包——的交织算法。
在这些参与复用的数据单元中,PSI/SI和PCR需要按照固定的间隔进行插入,可以认为是固定码率,音频一般来讲也接近固定码率,而视频码率则变化不定,这主要是由于编码时IBP帧的编码方法不同产生的,但对于一个特定的视频帧而言,我们可以认为在这一帧时间内,视频的码率是固定的,我们可以称之为瞬时码率。
对于多节目的TS流复用,输出码率一般来讲为固定码率,这种情况下,我们可以通过计算每个数据单元的瞬时码率占复用后的TS流的总码率的的比率(mux-ratio,我们称其为每个数据单元的复用比率)进行复用。又因为TS流复用时的基本单位是TS包,所以可以认为复用比率就是每个数据单元在一个TS包中的比率,每复用一个TS包,就把该数据单元所占用的实际总比率加上复用比率,当总比率大于100%时,我们就认为该数据单元应该参与复用了。
对于按照固定间隔插入的数据单元,复用比率的计算方法为:
mux-ratio=((1/interval)*每次插入的TS包数*TS_LEN*8)/MPTS_Bitrate
对于有瞬时码率的数据单元,直接通过码率之比进行计算:
mux-ratio=瞬时码率/ MPTS_Bitrate
下面我们通过一组数据来说明上述算法。
MPTS(Bitrate=10000000bps) | ||||||
| PAT(1%) | PMT(1%) | PCR(5%) | Audio(20%) | Video(45%) | NULL |
TS No |
|
|
|
|
|
|
0 | 99 | 99 | 95 | 80 | 55 |
|
1 | 99+1=100 | 99+1=100 | 95+5=100 | 80+20=100 | 55+45=100 |
|
2 | 1+0=1 | 100+1=101 | 100+5=105 | 100+20=120 | 100+45=145 |
|
3 | 1+1=2 | 1+1=2 | 105-100=5 | 120+20=140 | 145+45=190 |
|
4 | 2+1=3 | 2+1=3 | 10+5=15 | 140+20=160 | 190+45=235 |
|
5 | 3+1=4 | 3+1=4 | 15+5=20 | 60+20=80 | 235+45=280 |
|
6 | 4+1=5 | 4+1=5 | 20+5=25 | 80+20=100 | 180+45=225 |
|
7 | 5+1=6 | 5+1=6 | 25+5=30 | 0+20=20 | 225+45=270 |
|
8 | 6+1=7 | 6+1=7 | 30+5=35 | 20+20=40 | 170+45=215 |
|
9 | 8+1=9 | 8+1=9 | 35+5=40 | 40+20=60 | 115+45=160 |
|
10 | 9+1=10 | 9+1=10 | 40+5=45 | 60+20=80 | 60+45=105 |
|
11 | 10+1=11 | 10+1=11 | 45+5=50 | 80+20=100 | 5+45=50 |
|
12 | 11+1=12 | 11+1=12 | 50+5=55 | 0+20=20 | 50+45=95 | NULL |
13 | 12+1=13 | 12+1=13 | 55+5=60 | 20+20=40 | 95+45=140 |
|
表1
在上表中,MPTS的输出码率为10000000bps。MPTS中,假设PAT表的复用比率为1%,PMT表的复用比率为1%,PCR的复用比率为5%,音频的复用比率为20%,视频的复用比率为45%。TS No列为每次复用TS包的序号。在复用之初,我们使用100%减去每个复用单元的比率作为初始比率(这样每个复用单元处于复用的临界状态)。
通过码率之比计算出来的每个复用单元的占用比率,即为TS中的每个复用单元应该占用的比率,从微观层面看,如果每个TS包可以分割的话,其中应该包括1%的PAT数据,1%的PMT数据,5%的PCR数据,20%的音频数据,45%的视频数据,剩下28%为空包数据;因此,每复用一个TS包,我们把该复用单元实际所占的比率加上它的复用比率。当实际占的比率大于100%时,表明应该复用该数据单元了,此时如果实际复用了该数据单元的一个TS包,应该减去100%。上表中,红色的部分表示本次参与复用的数据单元。如果所有的数据单元都没有达到100%,则插入空包。
在实际的复用过程中,可能会遇到以下几个问题。
一,如果有多个数据单元的实际所占比率同时达到了100%,应该选择哪个参与复用呢?在上表中,我们只是简单的按照从左到右的顺序,但在实际复用时,需要做特别的处理。一般来讲,对于同时可以复用的相同类型的数据单元(比如都是视频),这时可以选择实际占用百分比最大的哪个参与复用;对于不同类型的数据单元,需要设置复用的优先级,一般讲复用的优先级是:PSISI>PCR>音频>视频。
二,如前所述,因为我们使用的是瞬时码率,尤其对于视频来讲,通常每帧数据码率都是变化的。当码率出现变化时,需要注意两点,一是更新复用比率,二是如果当前实际的占用比率不为0,需要根据新的码率进行实际占用的比率,以上表中的视频为例,如果在第11包时,因为码率的变化,复用比率变更为60%,此时实际占用比率为50%,新的实际占用的比率的公式为:
X/(当前实际占用的比率)=新的应该占用比率/新的应该占用比率
X/50=60/45
X=50*60/45
三,在计算占用比率时,可能会出现小数,如果使用浮点数将会导致丢失精度,精度的丢失对长时间运行来讲会出现大的偏差,因此,所有计算需要采用分数来进行。