一种基于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
三,在计算占用比率时,可能会出现小数,如果使用浮点数将会导致丢失精度,精度的丢失对长时间运行来讲会出现大的偏差,因此,所有计算需要采用分数来进行。