I frame :幀內(nèi)編碼幀 又稱intra picture,I 幀通常是每個(gè) GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個(gè)幀,經(jīng)過適度地壓縮,做為隨機(jī)訪問的參考點(diǎn),可以當(dāng)成圖象。I幀可以看成是一個(gè)圖像經(jīng)過壓縮后的產(chǎn)物。
P frame: 前向預(yù)測編碼幀 又稱predictive-frame,通過充分將低于圖像序列中前面已編碼幀的時(shí)間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測幀;
B frame: 雙向預(yù)測內(nèi)插編碼幀 又稱bi-directional interpolated prediction frame,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時(shí)間冗余信息來壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫雙向預(yù)測幀;
DTS Decode Time Stamp(解碼時(shí)間戳)DTS主要是標(biāo)識(shí)讀入內(nèi)存中的bit流在什么時(shí)候開始送入解碼器中進(jìn)行解碼。
PTS Presentation Time Stamp(顯示時(shí)間戳)PTS主要用于度量解碼后的視頻幀什么時(shí)候被顯示出來
DTS和PTS分別是解碼器進(jìn)行解碼和顯示幀時(shí)相對于SCR(系統(tǒng)參考)的時(shí)間戳。SCR可以理解為解碼器應(yīng)該開始從磁盤讀取數(shù)據(jù)時(shí)的時(shí)間。
mpeg文件中的每一個(gè)包都有一個(gè)SCR時(shí)間戳并且這個(gè)時(shí)間戳就是讀取這個(gè)數(shù)據(jù)包時(shí)的系統(tǒng)時(shí)間。通常情況下,解碼器會(huì)在它開始讀取mpeg流時(shí)啟動(dòng)系統(tǒng)時(shí)鐘(系統(tǒng)時(shí)鐘的初始值是第一個(gè)數(shù)據(jù)包的SCR值,通常為0但也可以不從0開始)。
DTS 時(shí)間戳決定了解碼器在SCR時(shí)間等于DTS時(shí)間時(shí)進(jìn)行解碼,PTS時(shí)間戳也是類似的。通常,DTS/PTS時(shí)間戳指示的是晚于音視頻包中的SCR的一個(gè)時(shí) 間。例如,如果一個(gè)視頻數(shù)據(jù)包的SCR是100ms(意味著此包是播放100ms以后從磁盤中讀取的),那么DTS/PTS值就差不多是200 /280ms,表明當(dāng)SCR到200ms時(shí)這個(gè)視頻數(shù)據(jù)應(yīng)該被解碼并在80ms以后被顯示出來(視頻數(shù)據(jù)在一個(gè)buffer中一直保存到開始解碼)
下溢通常發(fā)生在設(shè)置的視頻數(shù)據(jù)流相關(guān)mux率太高。如果mux率是1000000bits/sec(意味著解碼器要以1000000bits/sec的速率 讀取文件),可是視頻速率是2000000bits/sec(意味著需要以2000000bits/sec的速率顯示視頻數(shù)據(jù)),從磁盤中讀取視頻數(shù)據(jù)時(shí) 速度不夠快以至于1秒鐘內(nèi)不能夠讀取足夠的視頻數(shù)據(jù)。這種情況下DTS/PTS時(shí)間戳就會(huì)指示視頻在從硬盤中讀出來之前進(jìn)行解碼或顯示(DTS/PTS時(shí)間戳就要比包含它們的數(shù)據(jù)包中的SCR時(shí)間要早了)。
如今依靠解碼器,著基本已經(jīng)不是什么問題了(盡管MPEG文件因?yàn)閼?yīng)該沒有下溢而并不完全符合MPEG標(biāo)準(zhǔn))。一些解碼器(很多著名的基于PC的播放器)盡可能快的讀取文件以便顯示視頻,可以的話直接忽略SCR。
注意在你提供的列表中,平均的視頻流速率為~3Mbps(3000000bits/sec)但是它的峰值達(dá)到了14Mbps(相當(dāng)大,DVD限制在 9.8Mbps內(nèi))。這意味著mux率需要調(diào)整足夠大以處理14Mbps的部分, bbMPEG計(jì)算出來的mux率有時(shí)候太低而導(dǎo)致下溢。
你計(jì)劃讓視頻流速率這么高么?這已經(jīng)超過了DVD的說明了,而且很可能在大多數(shù)獨(dú)立播放其中都不能播放。如果你不是這么計(jì)劃,我會(huì)從1增加mquant的值并且在視頻設(shè)置中將最大碼流設(shè)置為9Mbps以保持一個(gè)小一點(diǎn)的碼流。
如果你確實(shí)想讓視頻碼率那么高,你需要增大mux率。從提供的列表可以得出bbMPEG使用14706800bits/sec或者1838350bytes /sec的mux率(總數(shù)據(jù)速率為:1838350bytes/sec(14706800bits/sec)行)。你在強(qiáng)制mux率字段設(shè)置的值應(yīng)該是以 bytes/sec為單位并被50整除。所以我會(huì)從36767(1838350/50)開始,一直增加直到不會(huì)再出現(xiàn)下溢錯(cuò)誤為止.
在沒有B幀存在的情況下DTS的順序和PTS的順序應(yīng)該是一樣的。
I P B幀的不同:
I frame:自身可以通過視頻解壓算法解壓成一張單獨(dú)的完整的圖片。
P frame:需要參考其前面的一個(gè)I frame 或者B frame來生成一張完整的圖片。
B frame:則要參考其前一個(gè)I或者P幀及其后面的一個(gè)P幀來生成一張完整的圖片。
兩個(gè)I frame之間形成一個(gè)GOP,在x264中同時(shí)可以通過參數(shù)來設(shè)定bf的大小,即:I 和p或者兩個(gè)P之間B的數(shù)量。
通過上述基本可以說明如果有B frame 存在的情況下一個(gè)GOP的最后一個(gè)frame一定是P.
DTS和PTS的不同:
DTS主要用于視頻的解碼,在解碼階段使用.PTS主要用于視頻的同步和輸出.在display的時(shí)候使用.在沒有B frame的情況下.DTS和PTS的輸出順序是一樣的.
例子:
下面給出一個(gè)GOP為15的例子,其解碼的參照frame及其解碼的順序都在里面:

如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame.B frame的解碼則依賴于其前的最近的一個(gè)I frame或者P frame 及其后的最近的一個(gè)P frame.
sample_rate 采樣率