概念:緩存
將具備共同時間基準的一個或多個PES組合(複合)而成的單一的數據流稱爲節目流(Program Stream)。ide
ES是直接從編碼器出來的數據流,能夠是編碼過的視頻數據流,音頻數據流,或其餘編碼數據流的統稱。ES流通過PES打包器以後,被轉換成PES包。oop
構成:ui
PS包由包頭、系統頭、PES包3部分構成。包頭由PS包起始碼、系統時鐘基準(SCR-System Clock Reference)的基本部分、SCR的擴展部分和PS複用速率4部分組成。this
維基百科對應的圖表(包頭、系統頭):編碼
字節順序,以下所示:spa
4B的包起始碼:code
byte 0視頻 |
byte 1htm |
byte 2 |
byte 3 |
||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0000 0000 0000 0000 0000 0001 |
1011 1010 |
PACK identifier -- 0xBA
系統時鐘基準(SCR-System Clock Reference)的基本部分、SCR的擴展部分:
byte 4 |
byte 5 |
byte 6 |
byte 7 |
byte 8 |
byte 9 |
||||||||||||||||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
01 |
SCR 32..30 |
1 |
SCR 29..15 |
1 |
SCR 14..00 |
1 |
SCR_ext |
1 |
PS複用速率:
byte 10 |
byte 11 |
byte 12 |
byte 13 |
||||||||||||||||||||||||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Program_Mux_Rate |
1 |
1 |
reserved |
pack_stuffing_length |
兩個頭以後即是PES包(payload):
參考一段代碼理解:http://read.pudn.com/downloads104/sourcecode/multimedia/mpeg/427188/PESdecode/pesdecode.cpp__.htm
能夠看到PTS/DTS(流識別碼,用於區別不一樣性質ES)是打在PES包裏面的,這兩個參數是解決視音頻同步顯示,防止解碼器輸入緩存上溢或下溢的關鍵。PTS表示顯示單元出如今系統目標解碼器(STD: system target decoder)的時間,DTS表示將存取單元所有字節從STD的ES解碼緩存器移走的時刻。每一個I、P、B幀的包頭都有一個PTS和DTS,但PTS與DTS對B幀都是同樣的,無須標出B幀的DTS。對I幀和P幀,顯示前必定要存儲於視頻解碼器的從新排序緩存器中,通過延遲(從新排序)後再顯示,必定要分別標明PTS和DTS。
關於音視頻的同步:
除了PTS和DTS的配合工做外,還有一個重要的參數是SCR(system clock reference)。在編碼的時候,PTS,DTS和SCR都是由STC(system time clock)生成的,在解碼時,STC會再生,並經過鎖相環路(PLL-phase lock loop),用本地SCR相位與輸入的瞬時SCR相位鎖相比較,以肯定解碼過程是否同步,若不一樣步,則用這個瞬時SCR調整27MHz的本地時鐘頻率。最後,PTS,DTS和SCR一塊兒配合,解決視音頻同步播放的問題。