圖像基礎(chǔ)知識(shí)
像素
像素是圖像的基本單元俘侠,一個(gè)個(gè)像素就組成了圖像酌泰。你可以認(rèn)為像素就是圖像中的一個(gè)點(diǎn)购撼。在下面這張圖中跪削,你可以看到一個(gè)個(gè)方塊,這些方塊就是像素
分辨率
圖像(或視頻)的分辨率是指圖像的大小或尺寸迂求。我們一般用像素個(gè)數(shù)來表示圖像的尺寸碾盐。比如說一張1920x1080的圖像,前者1920指的是該圖像的寬度方向上有1920個(gè)像素點(diǎn)揩局,而后者1080指的是圖像的高 度方向上有1080個(gè)像素點(diǎn)毫玖。
Stride
Stride也可以稱之為跨距,指的是圖像存儲(chǔ)時(shí)內(nèi)存中每行像素所占用的 空間凌盯「斗悖跨距為了能夠快速讀取一行像素,我們一般會(huì)對(duì)內(nèi)存中的圖像實(shí)現(xiàn)內(nèi)存對(duì)齊十气,比如16字節(jié)對(duì)齊励背。
比如有一張RGB圖像,分辨率是1278x720砸西。我們將它存儲(chǔ)在內(nèi)存當(dāng)中叶眉,一行像素需要 1278x3 = 3834個(gè)字節(jié),3834除以16無法整除芹枷。因此衅疙,沒有16字節(jié)對(duì)齊。所以如果需要對(duì)齊的話鸳慈,我們需 要在3834個(gè)字節(jié)后面填充6個(gè)字節(jié)饱溢,也就是3840個(gè)字節(jié)做16字節(jié)對(duì)齊,這樣這幅圖像的Stride就是3840了走芋。
圖像顯示格式
RGB
我們看到的彩色圖像中绩郎,都有三個(gè)通道潘鲫,這三個(gè)通道就是R、G肋杖、B通道,(有的時(shí)候還會(huì)有Alpha值溉仑,代表透明度) 通常R、G状植、B各占8個(gè)位浊竟,我們稱這種圖像是8bit圖像。
YUV
對(duì)于圖像顯示器來說津畸,它是通過RGB模型來顯示圖像的振定。而在傳輸圖像數(shù)據(jù)時(shí)是使用YUV模型的,因?yàn)閅UV模型可以節(jié)省帶寬肉拓。所以就需要采集圖像時(shí)將RGB模型轉(zhuǎn)換到Y(jié)UV模型后频,顯示時(shí)再將YUV模型轉(zhuǎn)換為RGB模型。
YUV解決了彩色電視機(jī)與黑白電視的兼容問題帝簇,它將亮度信息(Y)與色彩信息(UV)分離徘郭,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的丧肴。
YUV更方便對(duì)視頻信號(hào)進(jìn)行壓縮残揉,占用的帶寬更低。符合人眼的視覺特性芋浮,人眼對(duì)亮度的敏感度要大于紅藍(lán)抱环,所以我們可以保留Y原始值的基礎(chǔ)上,降低U和V的值纸巷,而不影響觀看镇草,從而更加有效的存儲(chǔ)圖像數(shù)據(jù)。
YUV不像RGB那樣要求三個(gè)獨(dú)立的的視頻信號(hào)同時(shí)傳輸瘤旨,所以YUV方式傳送占用極少的頻寬梯啤。
YUV 顏色編碼采用的是 明亮度 和 色度 來指定像素的顏色。其中存哲,Y 表示明亮度(Luminance因宇、Luma),而 U 和 V 表示色度(Chrominance祟偷、Chroma)察滑。YUV主要分為YUV 4:4:4,YUV 4:2:2,YUV 4:2:0幾種常用類型。
YUV 4:4:4采樣
意味著Y修肠、U贺辰、V三個(gè)分量的采樣比例相同,所以在生成的圖像里,每個(gè)像素的三個(gè)分量信息都是8bit饲化,所以相比RGB顏色模型的圖片大小一樣莽鸭。
YUV 4:2:2采樣
UV分量是Y分量的一半,Y分量和UV分量按照2:1的比例采樣吃靠,如果水平方向有10個(gè)像素點(diǎn)蒋川,那么采樣了10個(gè)Y分量,就只采樣了5個(gè)UV分量撩笆,第一個(gè)像素和第二個(gè)像素共用一個(gè)UV ,相較RGB可以節(jié)省1/3 的空間缸浦,更利于圖像傳輸夕冲。
YUV 4:2:0采樣
YUV 4:2:0 采樣,并不是指只采樣 U 分量而不采樣 V 分量裂逐。而是指歹鱼,在每一行掃描時(shí),只掃描一種色度分量(U 或者 V)卜高,和 Y 分量按照 2 : 1 的方式采樣弥姻。比如,第一行掃描時(shí)掺涛,YU 按照 2 : 1 的方式采樣庭敦,那么第二行掃描時(shí),YV 分量按照 2:1 的方式采樣薪缆。對(duì)于每個(gè)色度分量來說秧廉,它的水平方向和豎直方向的采樣和 Y 分量相比都是 2:1 。 相較RGB 可以節(jié)省1/2的存儲(chǔ)空間拣帽,也是當(dāng)下主流的采樣方式 (Android Camera 預(yù)覽流返回格式)疼电。
音頻基礎(chǔ)知識(shí)
由物理學(xué)可知,復(fù)雜的聲波由許多具有不同振幅和頻率的正弦波組成减拭。代表聲音的模擬信息是個(gè)連續(xù)的量蔽豺,不能由計(jì)算機(jī)直接處理,必須將其數(shù)字化拧粪。數(shù)字聲音信息才能夠像文字和圖形信息一樣進(jìn)行存儲(chǔ)修陡、檢索、編輯和其它處理既们。
采樣:以適當(dāng)?shù)臅r(shí)間間隔觀測模擬信號(hào)波形不連續(xù)的樣本值替換原來的連續(xù)信號(hào)波形的操作濒析,又稱為取樣 。為了復(fù)原波形啥纸,一次振動(dòng)中号杏,必須有2個(gè)點(diǎn)的采樣,人耳能夠感覺到的最高頻率為20kHz,因此要滿足人耳的聽覺要求盾致,則需要至少每秒進(jìn)行40k次采樣
量化:數(shù)字音頻中主经,把表示聲音強(qiáng)弱的模擬電壓用數(shù)字表示。模擬電壓的幅度庭惜,即使在某電平范圍內(nèi)罩驻,仍然可以有無窮多個(gè),如1.2V,1.21V,1.215V…护赊。而用數(shù)字來表示音頻幅度時(shí)惠遏,只能把無窮多個(gè)電壓幅度用有限個(gè)數(shù)字表示。即把某一幅度范圍內(nèi)的電壓用一個(gè)數(shù)字表示骏啰,這稱之為量化节吮。
編碼: 將量化后的數(shù)據(jù)轉(zhuǎn)為二進(jìn)制
視頻基礎(chǔ)知識(shí)
下圖可以很清晰的說明決定視頻畫質(zhì)的幾個(gè)要素
分辨率
視頻分辨率又可稱為視頻解析度、解像度判耕,指的是視頻圖像在一個(gè)單位尺寸內(nèi)的精密度透绩。
幀率
在視頻中,一個(gè)幀(Frame)就是指一幅靜止的畫面壁熄。幀率帚豪,就是指視頻每秒鐘包括的畫面數(shù)量(FPS,F(xiàn)rame per second)草丧。
碼率
編碼器每秒編出的數(shù)據(jù)大小狸臣,單位是kbps,比如上圖的3000kbps代表編碼器每秒產(chǎn)生 375kb 的數(shù)據(jù)
編碼
編碼的終極目的方仿,就是為了壓縮固棚。各種視頻編碼方式,都是為了讓視頻變得體積更小仙蚜,有利于存儲(chǔ)和傳輸此洲。
要實(shí)現(xiàn)壓縮,就要設(shè)計(jì)各種算法委粉,將視頻數(shù)據(jù)中的冗余信息去除呜师。
如果一幅圖,全是紅色的贾节,我有沒有必要說2073600次[255,0,0] 汁汗,還是我只要說一次[255,0,0],然后再說2073599次“同上”栗涂?
如果一段視頻知牌,大部分畫面是不動(dòng)的,或者斤程,有80%的圖像面積角寸,整個(gè)過程都是不變的。那么,是不是這塊存儲(chǔ)開銷扁藕,就可以節(jié)約掉了?
基本原理:
空間冗余:圖像相鄰像素之間有較強(qiáng)的相關(guān)性沮峡;
時(shí)間冗余:視頻序列的相鄰圖像之間內(nèi)容相似;
編碼冗余:不同像素值出現(xiàn)的概率不同亿柑;
視覺冗余:人的視覺系統(tǒng)對(duì)某些細(xì)節(jié)不敏感邢疙;
知識(shí)冗余:規(guī)律性的結(jié)構(gòu)可由先驗(yàn)知識(shí)和背景知識(shí)得到。
宏塊
每一幀圖像望薄,又是劃分成一個(gè)個(gè)塊來進(jìn)行編碼的疟游,這一個(gè)個(gè)塊在H264中叫做宏塊,而在VP9痕支、AV1 中稱之為超級(jí)塊乡摹,其實(shí)概念是一樣的。宏塊大小一般是16x16 (H264采转、VP8) , 32x32 (H265、VP9), 64x64 (H265瞬痘、VP9故慈、AV1) , 128x128 (AV1)這幾種。這里提到的H264框全、H265察绷、VP8、VP9和AV1都是市面上常見的編碼標(biāo)準(zhǔn)津辩。
幀類型
幀間預(yù)測需要參考已經(jīng)編碼的幀拆撼,幀間編碼幀可以分為只參考前面幀的前向編碼幀和前后都可以參考的雙向編碼幀。
I幀:是自帶全部信息的獨(dú)立幀喘沿,是最完整的畫面(占用的空間最大)闸度,無需參考其它圖像便可獨(dú)立進(jìn)行解碼。視頻序列中的第一個(gè)幀蚜印,始終都是I幀莺禁。
P幀:“幀間預(yù)測編碼幀”,需要參考前面的I幀和/或P幀的不同部分窄赋,才進(jìn)行編碼哟冬。P幀對(duì)前面的P和I參考幀有依賴性。
B幀:“雙向預(yù)測編碼幀”忆绰,以前幀后幀作為參考幀浩峡。不僅參考前面,還參考后面的幀错敢,所以翰灾,它的壓縮率最高,可以達(dá)到200:1。
如圖预侯,箭頭是從參考幀指向編碼幀
GOP(序列)和IDR
在H264中圖像以序列為單位進(jìn)行組織致开,一個(gè)序列是一段圖像編碼后的數(shù)據(jù)流。
一個(gè)序列的第一個(gè)圖像叫做 IDR 圖像(立即刷新圖像)萎馅,IDR 圖像都是 I 幀圖像双戳。H.264 引入 IDR 圖像是為了解碼的重同步,當(dāng)解碼器解碼到 IDR 圖像時(shí)糜芳,立即將參考幀隊(duì)列清空飒货,將已解碼的數(shù)據(jù)輸出或拋棄,重新查找參數(shù)集峭竣,開始一個(gè)新的序列塘辅。如果前一個(gè)序列出現(xiàn)重大錯(cuò)誤,在這里可以獲得重新同步的機(jī)會(huì)皆撩。IDR圖像之后的圖像永遠(yuǎn)不會(huì)使用IDR之前的圖像的數(shù)據(jù)來解碼扣墩。
一個(gè)序列就是一段內(nèi)容差異不大的圖像編碼后生成的一串?dāng)?shù)據(jù)流。當(dāng)運(yùn)動(dòng)變化比較少時(shí)扛吞,一個(gè)序列可以很長呻惕,所可以編一個(gè)I幀,然后一直P幀滥比、B幀了亚脆。當(dāng)運(yùn)動(dòng)變化多時(shí),可能一個(gè)序列就比較短了盲泛,比如就包含一個(gè)I幀和1濒持、2個(gè)P幀。
在視頻編碼序列中寺滚,GOP即Group of picture(圖像組)柑营,指兩個(gè)I幀之間的距離,Reference(參考周期)指兩個(gè)P幀之間的距離村视。兩個(gè)I幀之間形成一組圖片由境,就是GOP(Group Of Picture)。
PTS和DTS
如果IBP數(shù)據(jù)流并非有序返回蓖议,存在先到的B虏杰、P幀等I幀的情況,就需要引入 PTS和DTS概念
DTS(Decoding Time Stamp):即解碼時(shí)間戳勒虾,這個(gè)時(shí)間戳的意義在于告訴播放器該在什么時(shí)候解碼這一幀的數(shù)據(jù)纺阔。
PTS(Presentation Time Stamp):即顯示時(shí)間戳,這個(gè)時(shí)間戳用來告訴播放器該在什么時(shí)候顯示這一幀的數(shù)據(jù)修然。
假設(shè)編碼器采集到的幀是這個(gè)樣子的:I B B P B B P 1 2 3 4 5 6 7
假設(shè) 編碼器的編碼順序是: I P B B P B B 1 4 2 3 7 5 6
接收端 根據(jù)PTS 顯示對(duì)應(yīng)的數(shù)據(jù)