【方法一】
這個方法適用於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. 用公式計算。
【方法一】
這個方法適用於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. 用公式計算。