1. 程式人生 > >學習總結1—TS解碼和打包總結

學習總結1—TS解碼和打包總結

最近一直在做一個關於TS流解析和打包的工作,這裡是做一次總結,也是第一次總結,以後將陸續嘗試些更多的總結。

1.     在ts的前面四個位元組中,如果PID==0,表明這裡是PAT表,這個時候需要解析PAT資訊,得到PMT表的PID。然後尋找下一個ts包。

2    在TS頭中,PID等於PMT表的PID,這個時候解析PMT表,得到音訊和視訊的PID。解析下一個TS流。

3    在TS頭中,如果PID等於視訊或者音訊的PID,進入相應的解析中。這裡以視訊為例。

3.1   TS頭的PID等於視訊PID,此時第一個TS包中會有一個七個位元組的自適應區,裡面放有PCR資訊,參考https://blog.csdn.net/evsqiezi/article/details/51781057

,比如47 40 08 32 07 10 00 b9 f8 23 fe 00,此時PCR中與後面PES流中的PTS和DTS存在對應關係,通常PTS==DTS==PCR。不過注意PCR種有部分是填充位元組。一會兒再來補充如何尋找對應關係。

3.2    而另一個需要注意的是,在一個TS流中,我們需要注意的是PAT表的TS頭計數器也是不斷遞增的,從0-f,然後迴圈,同理也有PMT表的計數器也在0-f遞增變化,當然,對於視訊流也是一樣的。

3.3   在正常的視訊編解碼中,一般情況00 00 01 06 後面放的是SEI資訊。

3.4 然後00 00 01 e0,這裡表示視訊,如果是c0就應該是音訊

只要這幾個因素都滿足後,基本就可以將壓縮好的H264碼流編碼或者解碼成功了。

下面講講PCR中的資訊如何和PTS和DTS對應。如一個PCR是00 c9 29 8B 7e,一個PTS是31 06 49 ab 2d,如此,對應的二進位制就是0000 0000 1100 1001 0010 1001 1000 1011 0111 1110和0001 0001 0000 0110 0100 1001 1010 0110 0010 1101

這就是對應關係。而PTS和時間的轉換關係,就是如下:

PCR(i) = PCR_base(i)*300 + PCR_ext(i)
PCR_base 33 位,最大值:0x1FFFFFFFF
PCR_ext 9 位,根據定義,取值 0-299
因此PCR最大值為:0x1FFFFFFFF*300 + 299
可表示的小時數:(0x1FFFFFFFF*300 + 299) / 27000000 / 3600 約為 26.5 小時
以前認為是兩天多,大概是這樣算的,PCR一共42位,把2的42次方作為PCR最大值,算出來大約是1.8天。

PCR分兩部分編碼:一個以系統時鐘頻率的 1/300 為單位,稱為PCR_base,共33bit;另一個以系統時鐘頻率為單位,稱為PCR_ext,共9bit,共42bit。
具體規定如下:
PCR_base(i) = ((系統時鐘頻率 x t(i)) div 300) % 2^33
PCR_ext(i) = ((系統時鐘頻率 x t(i)) div 1) % 300

PCR(i) = PCR_base(i) x 300 + PCR_ext(i)

例如:
  時間"03:02:29.012"的PCR計算如下:
  03:02:29.012 = ((3 * 60) + 2) * 60 + 29.012 = 10949.012s
  PCR_base = ((27 000 000 * 10949.012) / 300) % 2^33 = 98 541 080
  PCR_ext   = ((27 000 000 * 10949.012) / 1  ) % 300  = 0 
  PCR = 98 541 080 * 300 + 0 = 295 623 324 000

程式的計算,明天放進來。

然後PES的講解如下:

參考