像素
**像素是圖像的基本單元,一個個像素就組成了圖像。你可以認為像素就是圖像中的一個點。**在下面這張圖中,你可以看到一個個方塊,這些方塊就是像素。
分辨率
圖像(或視訊)的分辨率是指圖像的大小或尺寸。我們一般用像素個數來表示圖像的尺寸。比如說一張1920x1080的圖像,前者1920指的是該圖像的寬度方向上有1920個像素點,而後者1080指的是圖像的高 度方向上有1080個像素點。
視訊行業常見的分辨率有QCIF (176x144)、CIF (352x288)、D1 (704x576或720x576),還有我們 比較熟悉的360P (640x360)、720P (1280x720)、1080P (1920x1080)、4K (3840x2160)、8K (7680x4320)等。
1 .像素就隻是一個帯有顔色的小塊。
2.不能簡單地認為分辨率數值越高的圖像就越清晰。
原始圖像的話,分辨率越高确實會越清晰,但是我們看到的 圖像往往是經過後期處理的,比如放大縮小,或者磨皮美顔。經過處理過後的圖像,尤其是放大之後的圖 像,分辨率很高,但是它并沒有很清晰。
因為放大的圖像是通過"插值"處理得到的,而插值的像素是使用鄰近像素經過插值算法計算得到的, 跟實際相機拍攝的像素是不一樣的,相當于"腦補"出來的像素值。
位深
一般來說,我們看到的彩色圖像中,都有三個通道,這三個通道就是R、G、B通道,(有的時候還會有Alpha值,代表透明度)
通常R、G、B各占8個位,我們稱這種圖像是8bit圖像,而這個8bit就是位深,位深越大,我們能夠表示的顔色值就越多,目前我們大多數情 況下看到的圖像以及視訊還是8bit位深的。
Stride
Stride也可以稱之為跨距,指的是圖像存儲時記憶體中每行像素所占用的 空間。跨距為了能夠快速讀取一行像素,我們一般會對記憶體中的圖像實作記憶體對齊,比如16位元組對齊。
舉個例子,我們現在有一張RGB圖像,分辨率是1278x720。我們将它存儲在記憶體當中,一行像素需要 1278x3 = 3834個位元組,3834除以16無法整除。是以,沒有16位元組對齊。是以如果需要對齊的話,我們需 要在3834個位元組後面填充6個位元組,也就是3840個位元組做16位元組對齊,這樣這幅圖像的Stride就是3840 了。如下圖所示:
也就是說,每讀取一行資料時候需要跳過這多餘的6個位元組
幀率
FPS(frame per second 每秒鐘要多少幀畫面)
幀率:影響畫面流暢度,與畫面流暢度成正比:
幀率越大,畫面越流暢;
幀率越小,畫面越有跳動感。
碼率
編碼器每秒編出的資料大小,機關是kbps,比如800kbps代表編碼器每秒産生800kb(或100KB)的資料。
RGB
RGB中的值不一定是按R-G-B順序排列的,也可能是G-B-R順序
YUV
YUV 顔色編碼采用的是 明亮度 和 色度 來指定像素的顔色。
其中,Y 表示明亮度(Luminance、Luma),而 U 和 V 表示色度(Chrominance、Chroma)。
YUV主要分為YUV 4:4:4,YUV 4:2:2,YUV 4:2:0幾種常用類型。
1.YUV 4:4:4, 每一個Y對應一組UV。
2.YUV 4:2:2,每兩個Y共用一組UV。
3.YUV 4:2:0,每四個Y共用一組UV。
1.YUV 4:4:4采樣
1個像素存儲示意圖
舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最後映射出的像素點依舊為 [Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
這種采樣方式的圖像和 RGB 顔色模型的圖像大小是一樣,并沒有達到節省帶寬的目的
2.YUV 4:2:2 采樣
有4種類型
1)YU16 (或者稱為I422、YUV422P),Planar格式
2)YV16 (YUV422P),Planar格式
3)NV16(YUV422SP),Packed格式
4)NV61(YUV422SP),Packed格式
舉個例子 :
假如圖像像素為:[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那麼采樣的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一個采集一個。
最後映射出的像素點為 [Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
一張 1280 * 720 大小的圖檔,在 YUV 4:2:2 采樣時的大小為:
(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB 。
3.YUV 4:2:0
1)YU12(I420,YUV420P),Planar格式
2)YV12(YUV420P),Planar格式
3)NV12(YUV420SP),Packed格式
4)NV21(YUV420SP),Packed格式
舉個例子 :
假設圖像像素為:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那麼采樣的碼流為:Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
其中,每采樣過一個像素點,都會采樣其 Y 分量,而 U、V 分量就會間隔一行按照 2 : 1 進行采樣。
最後映射出的像素點為:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
一張 1280 * 720 大小的圖檔,在 YUV 4:2:0 采樣時的大小為:
(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 1.32 MB 。
YUV 存儲格式
YUV 的存儲格式,有兩種:
planar 平面格式
指先連續存儲所有像素點的 Y 分量,然後存儲 U 分量,最後是 V 分量。
packed 打包模式
指每個像素點的 Y、U、V 分量是連續交替存儲的。
RGB 到 YUV 的轉換
對于圖像顯示器來說,它是通過 RGB 模型來顯示圖像的,而在傳輸圖像資料時又是使用 YUV 模型,這是因為 YUV 模型可以節省帶寬。是以就需要采集圖像時将 RGB 模型轉換到 YUV 模型,顯示時再将 YUV 模型轉換為 RGB 模型。
RGB 到 YUV 的轉換,就是将圖像所有像素點的 R、G、B 分量轉換到 Y、U、V 分量。
有如下公式進行轉換:
更多音視訊項目Demo代碼詳見我的GitHub:https://github.com/king-ma1993