音視頻 (一) —— H.264 中的 NAL 技術(shù)
音視頻 (二) —— H.264中相關(guān)參數(shù)理解
音視頻 (三) —— 視頻相關(guān)參數(shù)的理解
幀率(fps)
幀率(Frame rate)是用于測(cè)量顯示幀數(shù)的量度震缭。所謂的測(cè)量單位為每秒顯示幀數(shù)(Frames per Second偷俭,簡(jiǎn)稱:FPS)或“赫茲”(Hz)
由于人類眼睛的特殊生理結(jié)構(gòu),如果所看畫面之幀率高于24的時(shí)候,就會(huì)認(rèn)為是連貫的搂抒,此現(xiàn)象稱之為視覺暫留。這也就是為什么電影膠片是一格一格拍攝出來穿肄,然后快速播放的滔韵。
而對(duì)游戲,一般來說颖变,第一人稱射擊游戲比較注重FPS的高低生均,如果FPS<30的話,游戲會(huì)顯得不連貫腥刹。所以有一句有趣的話:“FPS(指FPS游戲)重在FPS(指幀率)马胧。
每秒的幀數(shù)(fps)或者說幀率表示圖形處理器處理場(chǎng)時(shí)每秒鐘能夠更新的次數(shù)。高的幀率可以得到更流暢衔峰、更逼真的動(dòng)畫佩脊。一般來說30fps就是可以接受的蛙粘,但是將性能提升至60fps則可以明顯提升交互感和逼真感,但是一般來說超過75fps一般就不容易察覺到有明顯的流暢度提升了威彰。如果幀率超過屏幕刷新率只會(huì)浪費(fèi)圖形處理的能力出牧,因?yàn)楸O(jiān)視器不能以這么快的速度更新,這樣超過刷新率的幀率就浪費(fèi)掉了歇盼。
我們可以根據(jù)幀率得出連續(xù)兩幀的時(shí)間間隔舔痕。比如幀率為30FPS,那么相鄰兩幀的時(shí)間間隔為 33ms
分辨率
顯示分辨率(屏幕分辨率)是屏幕圖像的精密度,是指顯示器所能顯示的像素有多少豹缀。由于屏幕上的點(diǎn)赵讯、線和面都是由像素組成的,顯示器可顯示的像素越多耿眉,畫面就越精細(xì)边翼,同樣的屏幕區(qū)域內(nèi)能顯示的信息也越多,所以分辨率是個(gè)非常重要的性能指標(biāo)之一鸣剪∽榈祝可以把整個(gè)圖像想象成是一個(gè)大型的棋盤,而分辨率的表示方式就是所有經(jīng)線和緯線交叉點(diǎn)的數(shù)目筐骇。顯示分辨率一定的情況下债鸡,顯示屏越小圖像越清晰,反之铛纬,顯示屏大小固定時(shí)厌均,顯示分辨率越高圖像越清晰。
IOS中常見的分辨率有: 1080P(1920 x 1080) 告唆、720P(1280 x 720) 棺弊、480P(640 x 480)、360P
ios設(shè)置分辨率的代碼:
+ (void)resetSessionPreset:(AVCaptureSession *)m_session andHeight:(int)g_height_size
{
[m_session beginConfiguration];
switch (g_height_size) {
case 1080:
m_session.sessionPreset = [m_session canSetSessionPreset:AVCaptureSessionPreset1920x1080] ? AVCaptureSessionPreset1920x1080 : AVCaptureSessionPresetHigh;
break;
case 720:
m_session.sessionPreset = [m_session canSetSessionPreset:AVCaptureSessionPreset1280x720] ? AVCaptureSessionPreset1280x720 : AVCaptureSessionPresetMedium;
break;
case 480:
m_session.sessionPreset = [m_session canSetSessionPreset:AVCaptureSessionPreset640x480] ? AVCaptureSessionPreset640x480 : AVCaptureSessionPresetMedium;
break;
case 360:
m_session.sessionPreset = AVCaptureSessionPresetMedium;
break;
default:
break;
}
[m_session commitConfiguration];
}
DTS和PTS
- DTS(Decoding Time Stamp) : 即解碼時(shí)間戳擒悬,是解碼器進(jìn)行解碼時(shí)相對(duì)于SCR(系統(tǒng)參考時(shí)間)的時(shí)間戳模她。它主要標(biāo)識(shí)讀入內(nèi)存的bit流在什么時(shí)候開始送入解碼器中進(jìn)行解碼。
- PTS(Presentation Time Stamp) : 即顯示時(shí)間戳懂牧,是顯示幀時(shí)相對(duì)于SCR的時(shí)間戳侈净。它主要是度量解碼后的視頻什么時(shí)候被顯示出來。
DTS主要用于視頻的解碼僧凤,在解碼階段使用畜侦。PTS主要用于視頻的同步和輸出,在 display 的時(shí)候使用躯保。在沒有B幀的情況下旋膳,DTS和PTS的輸出順序是一樣的。
以下內(nèi)容摘自網(wǎng)絡(luò)
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ò)誤為止匣沼;
碼率(比特率)
由于保存完整的一幀一幀圖片的視頻原文件太大狰挡,必須要通過某種視頻壓縮算法將視頻中的圖片壓縮,以減小視頻文件大小释涛,那么壓縮比越大加叁,解壓縮還原后用來播放的視頻就會(huì)有越嚴(yán)重的失真,因?yàn)閴嚎s的同時(shí)不可避免的丟失了視頻中原來圖像的數(shù)據(jù)信息唇撬。在理解這個(gè)的前提下它匕,我來舉個(gè)例子,一個(gè)分辨率為1080P的原視頻(未經(jīng)壓縮)被壓縮成分別為4GB 和 1GB的兩個(gè)視頻文件窖认。由于1GB的視頻的壓縮比更大豫柬,所以在觀看1GB視頻的明顯感覺到?jīng)]有4GB視頻清晰(雖然他們的分辨率都是1080P)告希。
碼率又稱比特率,是指在壓縮視頻的時(shí)候給這個(gè)視頻指定一個(gè)參數(shù)烧给,用以告訴壓縮軟件期望的壓縮后視頻的大小燕偶。碼率的英文名為bps(bit per second),就是用平均每秒多少bit來衡量一個(gè)視頻大小础嫡。
- 計(jì)算視頻的碼率
我們可以根據(jù)一個(gè)視頻的長(zhǎng)度和大小來推斷出該視頻的比特率是多少指么。下面是一個(gè)具體的例子。
一段1080P的視頻長(zhǎng)度為100分鐘榴鼎,大小為1GB伯诬,那么該視頻的比特率是多少?
100min = 100*60s = 6000s;
1G = 1024M = 1024*1024KB = 1024*1024*1024Bit = 1024*1024*1024*8bit = 8589934592bit;
比特率 = 8589934592/6000s = 1431655b/s = 1.4Mbit/s;
那么這個(gè)視頻的碼率大概就是 1.4Mbit/s,這個(gè)比特率在在線視頻中已經(jīng)是非常高的了巫财,一般主流視頻平臺(tái)的最高碼率在1Mbit左右盗似,比如直播網(wǎng)站斗魚的高清選項(xiàng)實(shí)際播放的視頻碼率是900Kbit/s(0.9Mbit)。
我們可以得出結(jié)論:對(duì)于時(shí)間長(zhǎng)度相同的視頻平项,碼率越大赫舒,視頻的大小越大,視頻的畫質(zhì)就越清晰(不考慮各種壓縮算法的優(yōu)劣)葵礼,這是最直觀的感覺号阿。碼率對(duì)于視頻是非常重要的
音視頻同步
上面說了視頻幀、DTS鸳粉、PTS 相關(guān)的概念扔涧。我們都知道在一個(gè)媒體流中,除了視頻以外届谈,通常還包括音頻枯夜。音頻的播放,也有 DTS艰山、PTS 的概念湖雹,但是音頻沒有類似視頻中 B 幀,不需要雙向預(yù)測(cè)曙搬,所以音頻幀的 DTS摔吏、PTS 順序是一致的。
音頻視頻混合在一起播放纵装,就呈現(xiàn)了我們常痴鹘玻看到的廣義的視頻。在音視頻一起播放的時(shí)候橡娄,我們通常需要面臨一個(gè)問題:怎么去同步它們诗箍,以免出現(xiàn)畫不對(duì)聲的情況。
要實(shí)現(xiàn)音視頻同步挽唉,通常需要選擇一個(gè)參考時(shí)鐘滤祖,參考時(shí)鐘上的時(shí)間是線性遞增的筷狼,編碼音視頻流時(shí)依據(jù)參考時(shí)鐘上的時(shí)間給每幀數(shù)據(jù)打上時(shí)間戳。在播放時(shí)匠童,讀取數(shù)據(jù)幀上的時(shí)間戳埂材,同時(shí)參考當(dāng)前參考時(shí)鐘上的時(shí)間來安排播放。這里的說的時(shí)間戳就是我們前面說的 PTS俏让。實(shí)踐中楞遏,我們可以選擇:同步視頻到音頻茬暇、同步音頻到視頻首昔、同步音頻和視頻到外部時(shí)鐘。