【方法一】
这个方法适用于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. 用公式计算。