pcr计算码率的过程

  网上写了好多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

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值