TS中的pcr dts pts問題

2021-07-25 01:19:54 字數 1367 閱讀 7819



對於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能表示多長時間 (33高位+6無用+9低位)

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.屬性介面function printlabel labelinfo void printlabel aaa 錯誤寫法 printlabel 傳入引數必須是以label為屬性名的物件對批量方法進行約束 可選屬性介面firstname?string 定義標準 i...

ts定義陣列型別 ts中型別

1 vscode配置自動編譯 1.第一步 tsc inti 生成tsconfig.json 改 outdir js 2 第二步 任務 執行任務 監視tsconfig.json 2 typescript中的資料型別 typescript中為了使編寫的 更規範,更有利於維護,增加了型別校驗,在types...