PCR PTS DTS之間的關係及注意問題點

時間戳是容器層的基礎概念,很多人還搞不清楚 PCR,PTS,DTS 到底什麼關係,對於剛入門的朋友來說,確認讓人感到迷惑。

搞清楚三者的區別,本質上就一句話:PCR 是時鐘,PTS,DTS 是時刻。是不是已經頓悟了?

這三個的全稱爲:
PCR: 系統參考時鐘
PTS: 顯示時間
DTS: 解碼時間

PCR 是 TS 流中才有的概念。設想在定義規範的時候,假如只需要支持純視頻,那就不需要使用時間戳了,解碼器只要按固定幀率播放就可以。當需要把音視頻數據合併在一起,控制av同步就是一個問題。時間戳機制被引入用以解決av同步問題。

假設a,b兩人約定某個時刻去做某事,則需要一個前提,他們兩人的手錶必須是同步的,比如都是使用北京時間對時的,如果他們的表不準 ,比北京時間差了幾個小時,就會有人遲到,要做的事情被耽誤。pcr就是北京時間,編碼器將自己的系統時鐘採樣,以pcr形式放入ts,解碼器使用pcr同步自己的系統時鐘,保證編碼器和解碼器的時鐘同步。

dts,收到的數據何時解碼,現在的解碼器已經基本不關心他,收到數據立即解碼。只使用pts

pts控制畫面何時顯示,音頻何時播放。

三者之間的大小關係:

 

1

2

3

 

PCR < DTS < PTS

 

假設現在中午12點,正常情況下,畫面總是在未來某個時刻顯示,所以pts總是大於方式的系統時間,如果pts要求爲上午9點顯示,解碼器就認爲這個畫面遲到了。如果要求晚上7點顯示,就會造成解碼器緩衝溢出。解碼器不知到這些畫面如何播放,丟棄緩衝或其它異常處理,用戶看到的效果都會不流暢,因爲本該顯示的畫面耽擱了太久。所以pts與pcr總是會有合理的間隔值。時間戳的正確性直接決定播出效果。

一些不規範pc播放器並不關心pcr,使用視頻或音頻pts作爲參考時間,對於pcr有錯的ts,他們是可以正常播的。機頂盒也可以採用相同機制,絕大部分機頂盒都是以pcr作爲參考時間的。

沒有相關文章.

(以上轉自 easyice.cn ,請勿用於任何商業用途)

(以下轉自https://blog.csdn.net/xiaojun111111/article/details/40623711

對於PTS_DTS_flags的重設

此字段在PES頭語法中,標識PTS與DTS在PES分組首部的出現情況,當出於某種需求要對此標誌位進行修改,例如由‘3’ 修改爲‘2’,即刪除DTS,但僅僅修改了這個標誌位並沒有達到“刪除DTS”的目的。雖然VLC等播放器可以正常解碼且不報任何錯誤,在一些嚴格的解碼器上,會無法識別新生成的數據。例如elecard分析軟件會報告“無法檢測流”,ipad播放會說“無法播放此影片”

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

 

H264碼流生成快進文件關鍵技術

對於快進/快退文件的生成,行業內一般以VLC正常播放作爲鑑定標準,要使自己抽幀生成的碼流在VLC播放正常,不僅僅是抽取關鍵幀就OK,抽幀

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

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

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

例外情況是,當碼流編碼爲隔行視頻,一個幀被編碼爲兩個片,每個片是一個場。隔行視頻中,I片後經常緊跟一個p片,他們

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


2.PTS, DTS PCR時間戳調整
最好的效果是調整到沒有PCR精度錯誤,間隔錯誤,以及PTS錯誤,不過若做簡單一些,保證PCR精度正確就可以。前提是PTS

變化間隔不要過大,否則影響播放效果流暢程度。


3.frame_num調整
僅當碼流中關鍵幀爲I幀時需要調整,IDR幀則不必。frame_num被解碼器用於控制解碼順序,我不清楚爲什麼

IDR幀的frame_num總爲0而I幀卻不是,事實是,frame_num的不連續造成vlc播放時認爲過多的遲到幀,所以

需要把它調整連續


對於VLC來說,經過上述調整就可以流暢播放,而其他如mplayer類會瞬間播完,因爲這類播放器按fps播放,對此你

需在碼流中填充零動作P幀,以維持幀率恆定

 

對時間戳循環到頭的處理:

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天

發佈了22 篇原創文章 · 獲贊 19 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章