网上写了好多pcr的文章,大多数是相互copy的哦,对于分析码流来说,不明晰,自己弄了几周,才根据一些资料,大概弄清了来龙去脉。
一、PCR用途:
1.PCR(program clock reference),即节目时钟基准。每一个节目都有一个独立的PCR字段。
理解:每套节目1套pcr来记录时间,它可能是单独的一个pid内存储,也可能在这套节目的视频pid里面的某些包中存在。1个频点上的1个TS流共5套节目,则应该有5个pcr,它们之间计时相互独立,并非5套pcr之间的值按时间值顺序排列,但1套PCR值是按时间顺序逐渐增大的,直到最大值清零(这个最大值大概26.5小时,之后我们可以看到计算的过程)。
PCR以秒为单位,整数部分+小数部分组成。如pcr=pcr_base*300+pcr_ext=2515301065809,时间值:time_value=(pcr_base*300+pcr_ext)/27000000=93159.29873367(s)。
转换方法可参见:“PCR和时间线相互转化” https://blog.csdn.net/rell336/article/details/110921566
2.码率计算
(1) pcr是个数值,那实际上就是一个时间刻度的数值。TS流一直按包发送(每个包通常188字节),在一定时间发送的字节数即是码率。
比如,1秒钟发送了1000字节,那码率就为1000字节/秒=1000*8bit/s=8000bps(每秒8000bit)。
(2)知道pcr值,换算时间刻度:
t = PCR/27 000 000 (单位为秒)
计算码率公式:
rate = (2个PCR相隔的包的个数*188*8 *27000000)/(PCR_TWO - PCR_ONE),单位为bps,这个就好理解的了。
上式,实际可以看成2个PCR之间开始统计,△t=27000000 /(PCR_TWO - PCR_ONE),单位为秒;发送的字节数,自然为这一时间段内的包个数*188*8bit了。
3.有效码率,当前码率,包码率
有效码率:在一段时间内,除了空包之外的其他pid的码率之和。 即除了0x1FFF的空包外,其他pid的码率全部相加。
当前码率:在一段时间内,所有pid的码率之和。
包码率:在一段时间内,某一个pid的码率。
上面讲的码率公式是所有包的码率还是pcr所在的那一套节目的码率呢?!答案是所有包的总码率。即上式的rate是当前的有效码率,系统的总码率(经常包含空包在内的约38Mbps)。
那么,我们如何统计各个包pid的码率呢?在上面的2个pcr之间,分别计数各个pid的包数量,在用上面的格式算出来的就是pid的码率的了。
理论上是这样的,但是,实际上2个相邻的PCR之间时间间隔是相当短的,规定的最大间隔为40ms,而PAT、PMT、CAT最大间隔100ms,SDT为2s,其他表可能更长,则2个相邻的PCR之间可能会不存在这些表,那我们必须取更长的时间,这些表才可能被统计出来。比如,PCR1和PCR25之间,40ms*25=1秒。或者更长50个pcr再统计。选择的pcr间隔数量决定了统计方法不同,导致统计各个pid码率之间有一定误差。我做的码流分析仪软件,选择的是25。
二、PCR的查找
1.PCR已经说过,规定是从PMT表中指定了PCR由哪个pid的包存放。
2.有调整字段的包将存储PCR信息,含pcr的pid包的包头信息中:
①由Adaption_field_control=2或者=3决定本包存在调整字段Adaption_field字段;
②Adaption_field字段中有PCR_flag=1,则含有PCR信息。
图1 含PCR的包(pid=0x21)
三、PCR间隔和PCR精度
(1).PCR间隔:指同一节目里两个连续的PCR之间最大的时间间隔。
(2).PCR 抖动: 就是 PCR 的不准确度,是相对于平均值的偏移。
对于(1)的理解:pcr是2个时间刻度信息,2个连续PCR直接的差值就是PCR间隔,这间隔时间不能太长,否则影响解码。
对于(2)的理解:PCR抖动应该就是PCR精度。假设共有10个PCR值,它们的平均值就是10个PCR值相加后除以10,每个点减去平均值=PCR(i)的精度,理论上全部在0线附近最佳【PCR(i)的精度=0最佳】,即都等于平均值是最好的;实际会在平均值上下波动,形成PCR精度折线。
DVB标准:
– 每个节目PCR的最大间隔为40ms。
– PCR的抖动小于±500ns。
MPEG2标准:
最大间隔为100ms。
PCR抖动量≤±4ms(±4000ns);
四、附录:
备注一个公式,也不知道是否完全正确的:
根据码速率控制发送速度,Sleep_Time=(SendBytes*8*1000)/rate-1 //发送的间隔时间ms
14:42 2021/01/18