總結TS中的pcr dts pts問題

2021-07-17 05:47:24 字數 1342 閱讀 8589

對於pts_dts_flags的重設

這是因為忽略了乙個問題,在pts語法中,前4個bit要求與 pts_dts_flags 取值相同。因此,在修改 pts_dts_flags 的之後,pts語法前4bit也要做相應的修改。這樣目前已知的解碼器就可以正常工作

h264碼流生成快進檔案關鍵技術

抽幀只是第一步,總結來說,需要以下舉措:

1.抽取關鍵幀

這個過程中,需要抽取完整的關鍵幀,在264碼流中,碼流層次沒有幀的概念,幀由若干slice組成,如果編碼器編碼過程採用了分片,

那麼你需要將屬於同一幀的slice都拿出來。一般來說,應用與廣電行業的264編碼器不採取分片,乙個幀就是乙個片。

他們具有相同的frame_num,這時你需要將p片也拿出來,否則i幀是不完整的

2.pts, dts pcr時間戳調整

最好的效果是調整到沒有pcr精度錯誤,間隔錯誤,以及pts錯誤,不過若做簡單一些,保證pcr精度正確就可以。

3.frame_num調整

僅當碼流中關鍵幀為i幀時需要調整,idr幀則不必。frame_num被解碼器用於控制解碼順序,我不清楚為什麼idr幀的frame_num總為0而i幀卻不是,

以維持幀率恆定

對時間戳迴圈到頭的處理:

ts流中的三個時間戳,pts(33bit),dts(33bit),pcr(42bit)

當時間戳增加到語法無法容納時,產生時間戳迴圈,時間線開始變小,迴圈點計算方式是:將要設定的值減去時間戳最大值,將差值寫入語法結構。

編碼器設定時鐘,以及解碼器自己的系統時鐘在達到最大值後,都根據此方式計算,不會產生時鐘的不連續。

pcr能表示多長時間

pcr最大值是多少,多長時間會迴圈一次,這是個非常簡單的問題,但一直以來我們對他的認識是錯誤的,我們認為是兩天多

先說正確的應該是多少,根據:

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天

TS中的pcr dts pts問題

對於pts dts flags的重設 這是因為忽略了乙個問題,在pts語法中,前4個bit要求與 pts dts flags 取值相同。因此,在修改 pts dts flags 的之後,pts語法前4bit也要做相應的修改。這樣目前已知的解碼器就可以正常工作 h264碼流生成快進檔案關鍵技術 抽幀只...

ts型別總結

1.ts保留了js語法的全部型別 8種 number string boolean null undefind symbol array object 例 let str string zhangsan let nul null null let num number 123 注 陣列的書寫方式有所...

TS中的介面

介面也是定義標準,他比抽象類更加全面 1.屬性介面function printlabel labelinfo void printlabel aaa 錯誤寫法 printlabel 傳入引數必須是以label為屬性名的物件對批量方法進行約束 可選屬性介面firstname?string 定義標準 i...