计算传输流码率的两种方法

【方法一】

这个方法适用于DVBS制式,没有仔细研究过,只列出公式吧。

公式:RateInBits = SymbolRate * FECRate * ModRate * (188/204)

 

FEC:前向纠错,取值为1(none), 1/2, 2/3, 3/4, 5/6, 6/7, 7/8, 8/9, 1/4, 1/3, 2/5, 5/11, 3/5, 4/5, 9/10。

Mod:QPSK: 2; 8PSK: 3。

188/204:RS(里德-所罗门码)的编码效率,即传送204个字节,其中有用的数据为188个字节。

 

【方法二】

这个方法适用于DVBT, DVBS, DVBS2制式,根据PCR来计算。参考【ISO/IEC 13818-1 Information technology——Generic coding of moving pictures and associated audio information: Systems.】

 

Page10-11 给出了计算公式:

TransportRateInBits = 2个PCR间隔的包个数 * 188 * 8 * 系统时钟频率27000000 / 2个PCR的差值。

PCR=PCR_Base * 300 + PRC_Ext

PCR_Base是以系统时钟频率的1/300为单位的。

 

Page18:Transport packet结构。

Page22:Adaptation field结构。

 

步骤描述:

1. 从ts文件中每次读取188字节(TS包的长度)。找到开始字节sync byte 0x47,如何确定这个0x47就是sync byte而不是数据中碰巧出现的呢?查看下一个188字节的开始是不是0x47,如果是,就可以认为第一次找到的sync byte是ts包的开始。在寻找PCR计算的过程中,每次都是读取188个字节,如果不是以sync byte开始,可能流数据corrupted了,要重新找sync byte,重复这个过程。

 

 

2. 找Adaptation field,继而查看PCR flag是否为1,找到PCR_Base 和 PCR_Ext,记录此包的PID值。找到第一个PCR0。

 

UINT64 t = ((tsBuf[6] << 24) +(tsBuf[7] << 16) + (tsBuf[8] << 8) + tsBuf[9]) & 0xFFFFFFFF;

UINT64 pcr_base = (t << 1) + ((tsBuf[10] & 0x80) >> 7);

UINT64 pcr_ext = ((tsBuf[10] & 0x01) << 8) + tsBuf[11];

UINT64 pcr = pcr_base * 300 + pcr_ext;

 

3. 记录两个PCR之间的包的个数。找下一个具有相同PID值的TS包的PCR值,PCR1。

 

 

4. 用公式计算。   

 

 

你可能感兴趣的:(计算传输流码率的两种方法)