前言:計算機存儲本質(zhì)
記住一點,計算機所有的文件均為二進(jìn)制文件流济,包括文本文件(它是特殊的二進(jìn)制文件锐锣,為什么特殊?因為它里面全部可直接翻譯為字符)绳瘟,這些二進(jìn)制文件就是一群0101集合(特定軟件能打開就能看到)雕憔,他們的讀取與寫入,過程完全相同:
讀入內(nèi)存:文件-->二進(jìn)制流-->-->按格式解碼-->應(yīng)用程序內(nèi)存數(shù)據(jù)
寫出文件:應(yīng)用程序內(nèi)存數(shù)據(jù)-->按格式編碼-->二進(jìn)制流-->文件
一直以來糖声,我們對于文本文件的處理是比較好理解的斤彼,不論是前端的表格還是表單等參數(shù),傳到后端的本質(zhì)都是字符串蘸泻,所以很好理解琉苇,也很好處理。
但對于音頻悦施,圖像并扇,視頻等多媒體文件,我就一直不理解它們的本質(zhì)抡诞。
于是穷蛹,我詳細(xì)查詢了網(wǎng)上資料,整合成如下幾篇完整的《前世今生漫談》
圖片文件前世今生和衍生技術(shù)原理
補檔:http://www.reibang.com/p/3f31b72be674
http://www.reibang.com/p/830202931e59
音頻文件前世今生和衍生技術(shù)原理
http://www.reibang.com/p/2f097ab27051
視頻文件前世今生和衍生技術(shù)原理
http://www.reibang.com/p/aa78924ee4da
視頻文件前世今生漫談
一沐绒、視頻的原理
視頻的本質(zhì):連續(xù)的圖像序列俩莽,拍視頻就是拍一組連續(xù)的圖片
視頻是連續(xù)的圖像序列,由連續(xù)的幀構(gòu)成乔遮,一幀即為一幅圖像扮超。由于人眼的視覺暫留效應(yīng),當(dāng)幀序列以一定的速率播放時,我們看到的就是動作連續(xù)的視頻出刷。(人眼的幀率是24幀)于是就變成了視頻璧疗。視頻只有一系列的圖片,音頻需要后期配置馁龟,并加以音頻視頻同步調(diào)整崩侠。
其中音頻視頻同步還是有些復(fù)雜的,但大致原理是以音頻的播放為基準(zhǔn)坷檩,動態(tài)調(diào)節(jié)視頻的渲染却音。因為人耳對聲音的快慢感知度是比較強的,而對畫面的快慢感知不強矢炼。
一般來說系瓢,畫面放的快,聲音放的慢為多句灌。
拿視頻幀的時間戳去和音頻幀的時間戳對比夷陋,如果超過一定閾值,就讓視頻的改幀不渲染(掉幀)胰锌,大概就是這么個意思骗绕。
有興趣詳細(xì)了解的可以看下幾篇博客:
視頻編解碼基礎(chǔ)概念
https://www.cnblogs.com/leisure_chn/p/10285829.html
二、視頻的壓縮技術(shù)簡介
視頻的壓縮技術(shù)其實和音頻资昧、圖片的壓縮技術(shù)原理上差不多酬土,主要是減少冗余。講個故事來描述大致發(fā)展榛搔,可能就更容易理解(這個故事僅當(dāng)理解用诺凡,如有不對的地方,歡迎指正):
最初的視頻践惑,其實就是連續(xù)圖片的疊加腹泌,比如1秒20幀,拍個5秒就是100幀尔觉,也就是100張圖片凉袱,但問題很明顯,100張圖片之間可能非常相似侦铜,冗余度太高专甩,體積太大,即便采用高壓縮比的jpeg格式钉稍,這100張圖片起碼也得30-40M涤躲,對于早期存儲技術(shù)不發(fā)達(dá)的年代,5s視頻40M贡未,這顯然是沒法用的种樱,即便存儲能跟上蒙袍,網(wǎng)絡(luò)傳輸帶寬也跟不上。
于是人們就想到一個辦法嫩挤,所謂【動】害幅,實際就是一段時間內(nèi)連續(xù)的位移,如果我們先確定一個參考圖片岂昭,然后后續(xù)的圖片只負(fù)責(zé)記錄與該參考圖片不同的地方以现,記錄少量的一些位移差值,那豈不是大大減少文件大小了约啊。
于是邑遏,視頻的壓縮標(biāo)準(zhǔn)就產(chǎn)生了,即按照上述原理編碼解碼的一套規(guī)則棍苹。
比如1s 20幀无宿,20張圖片,第一張圖片是參考圖片枢里,它包含了所有完整的信息,是一張不依賴于其他圖片的獨立幀蹂午,我們管它叫I幀(關(guān)鍵幀)栏豺,從第二張圖片開始,到第20張圖片豆胸,我們都不再記錄完整圖片奥洼,而是每一張圖片只記錄與前面一張圖片的運動矢量,也就是差值晚胡,而這些幀灵奖,他們依賴于前面一張圖片,我們管它叫P幀(差別幀估盘,單向預(yù)測幀)瓷患。編碼的時候后面19張圖片都是不完整的,解碼的時候只需要利用內(nèi)存中的第一張圖片數(shù)據(jù)和這些變化的差值拼接即可還原遣妥。
這樣20張圖片一組完整的組擅编,就叫GOP(group of pictures 一組圖片)。
舉個例子:比如描述一個點的運動箫踩,比如用了5s從坐標(biāo)5移動到了14爱态,一共10張圖片,
那么過程就是
5--6--7--8--9--10--11--12--13--14
對應(yīng)幀的變化信息就是5 +1 +1 +1 +1 +1 +1 +1 +1 +1
對應(yīng)幀就是I--P--P--P--P--P--P--P--P--P
I幀記錄的這個點的初始位置(0境钟,5)以及完整的圖片必要信息
而P幀只是記錄了這個變化差值锦担,每次+1
編碼和解碼都是上述從左到右順序來的,于是【I幀P幀】的視頻壓縮技術(shù)誕生了慨削,原先1s 20張圖片被壓縮成了1s (1張完整圖片+19張少量細(xì)節(jié)變化圖片)
隨著時代的發(fā)展洞渔,人們對于壓縮技術(shù)的要求也朝著更小的方向發(fā)展鱼的,于是就想,上述的壓縮邏輯能否進(jìn)一步壓縮呢痘煤?還是以上面這個點的運動為例:
我們知道凑阶,一般情況,很小一段時間內(nèi)運動都是規(guī)則連續(xù)的衷快,像上面
5 +1 +1 +1 +1 +1 +1 +1 +1 +1
這樣規(guī)則的運動是否可以壓縮成5 (+1*9)
呢宙橱?
當(dāng)然可以,但是首要解決的問題是蘸拔,我得清楚這個點的運動是5-14均勻連續(xù)的才行呀师郑,如果不連續(xù)肯定不能這么壓縮。那怎么判斷出這個點確實是這樣子均勻連續(xù)的呢调窍?于是人們想到了【求平均】:每三張圖進(jìn)行對比宝冕,如果第二張圖運動矢量恰好是第一張圖和第三張圖的平均值,那不就說明是均勻的變化嘛邓萨,那第二張圖就不用單獨記錄了地梨,只需要第一張和第三張就夠了。
類似這樣:
5--6--7--8--9
5-- -- 7-- --9
6恰好是(5和7)的平均值缔恳,說明5 6 7的變化是連續(xù)的宝剖,6編碼時自身可以不用記錄,只需要特殊標(biāo)記一下就行歉甚,解碼時只需在5 和 7 的已渲染基礎(chǔ)上万细,兩者疊加求平均即可還原。
我們管6這種【同時依賴于前面和后面幀的雙向預(yù)測幀】叫B幀纸泄,B幀與P幀類似赖钞,卻可以做到比P幀更高的壓縮率:你P幀可以只記錄變化量,我B幀甚至可以做到不記錄任何變化量聘裁,你P幀服不服雪营。
于是上述過程 5--6--7--8--9--10--11--12--13--14--15
對應(yīng)幀變化信息 5--B--7--B--9--B-- 11--B--13--B--15
對應(yīng)幀 I--B--P--B--P--B-- P-- B-- P-- B-- P
有時候為了追求更高的壓縮率:可能出現(xiàn)更多的B幀
如 I B B P B B P B B P,不過不論怎么樣I幀和P幀是必須的咧虎,因為它們可以作為參考幀卓缰,來修正調(diào)整誤差,而B幀是基于它們的前后算出來的結(jié)果砰诵,不能直接作為參考幀征唬。而且有個很重要的注意點:
B幀由于依賴前后幀的數(shù)據(jù)信息,就會導(dǎo)致編碼和解碼的順序與自然順序不同茁彭,也就是非線性編碼总寒。比如1 2 3 三張圖片,在編碼時理肺,順序就是1 3 2摄闸,解碼時也需要按照1 3 2 順序解碼善镰,再重排列還原成顯示順序1 2 3苹享,所以每兩個參考幀間插入越多的B幀博其,算法也就越復(fù)雜。
這種非線性編碼解碼的方式揉抵,導(dǎo)致了后來出現(xiàn)的音頻視頻不同步(音畫不同步)熏兄,后來就衍生出了DTS(編碼時間戳)和PTD(顯示時間戳)等一系列概念與技術(shù)手段品洛,來解決音頻視頻不同步現(xiàn)象。