來自極客時間的視訊教程學習:
1、像素:
像素是圖像的基本單元,一個個像素就組成了圖像。你可以認為像素就是圖像中的一個 點
2、分辨率
圖像(或視訊)的分辨率是指圖像的大小或尺寸。我們一般用像素個數來表示圖像的尺
寸。比如說一張 1920x1080 的圖像,前者 1920 指的是該圖像的寬度方向上有 1920 個像
素點,而後者 1080 指的是圖像的高度方向上有 1080 個像素點。
視訊行業常見的分辨率有 QCIF(176x144)、CIF(352x288)、D1(704x576 或
720x576),還有我們比較熟悉的 360P(640x360)、720P(1280x720)、
1080P(1920x1080)、4K(3840x2160)、8K(7680x4320)等。
3、
位深
一般來說,我們看到的彩色圖像中,都有三個通道,這三個通道就是 R、G、B 通道。簡單
來說就是,彩色圖像中的像素是有三個顔色值的,分别是紅、綠、藍三個值。也就是說我
們看到的那個帶有顔色的塊其實是由 R、G、B 三個值組成的(有的時候還會有 Alpha
值,代表透明度,我們這裡不展開讨論)。
通常 R、G、B 各占 8 個位,也就是一個位元組。8 個位能表示 256 種顔色值,那 3 個通道
的話就是 256 的 3 次方個顔色值,總共是 1677 萬種顔色。我們稱這種圖像是 8bit 圖
像,而這個 8bit 就是位深。
4、
Stride
接下來我們來看一個特别的概念——Stride。這個 Stride 不是圖像本身的屬性,但是視訊
開發者經常會碰到,也是經常會出問題的一個東西。我們團隊在工作中就多次遇到過由于
客戶沒有處理好這個東西,進而導緻播放的圖像出現“花屏”的情況。
Stride 也可以稱之為跨距,是圖像存儲的時候有的一個概念。
它指的是圖像存儲時記憶體中
每行像素所占用的空間。
你可能會問,一張圖像的分辨率确定了,那一行的像素值不就确
定了嗎?為什麼還需要跨距這個東西呢?其實,為了能夠快速讀取一行像素,我們一般會
對記憶體中的圖像實作記憶體對齊,比如 16 位元組對齊。
舉個例子,我們現在有一張 RGB 圖像,分辨率是 1278x720。我們将它存儲在記憶體當中,
一行像素需要 1278x3=3834 個位元組,3834 除以 16 無法整除。是以,沒有 16 位元組對
齊。是以如果需要對齊的話,我們需要在 3834 個位元組後面填充 6 個位元組,也就是 3840
個位元組做 16 位元組對齊,這樣這幅圖像的 Stride 就是 3840 了。如下圖所示:
這個地方你一定要注意,
每讀取一行資料的時候需要跳過這多餘的 6 個位元組
。如果沒有跳
過的話,這 6 個位元組的像素就會被我們誤認為是下一行開始的 2 個像素(每個像素 R、
G、B 各占 1 個位元組,2 個像素共 6 個位元組)。那這樣得到的圖像就完全錯了,顯示出來
的就是“花屏”現象,螢幕會出現一條條的斜線。
幀率
1 秒鐘内圖像的數量就是幀率
。據研究表明,一般幀率達到 10~12 幀每秒,人眼就
會認為是流暢的了。當然,可能會有個體差異。
通常,我們在電影院看的電影幀率一般是 24fps(幀每秒),監控行業常用 25fps,而我
們聲網常用的幀率有 15fps、24fps 和 30fps。你可以根據自己的使用場景來具體設定你想
使用的幀率值
碼率
我們已經知道,視訊的幀率越高,1 秒鐘内的圖像資料量就會越大。通常我們存儲視訊的
時候需要對圖像進行壓縮之後再存儲,否則視訊會非常大。
那麼壓縮之後的視訊我們一般如何描述它的大小呢?一般對于一個視訊檔案,我們直接看
視訊的大小就可以了。但是在實時通信或者直播的時候,視訊是視訊流的形式,我們怎麼
衡量呢?
這就涉及到我接下來要介紹的概念——碼率。碼率是指視訊在機關時間内的資料量的大
小,一般是 1 秒鐘内的資料量,其機關一般是 Kb/s 或者 Mb/s。通常,
我們用壓縮工具壓
縮同一個原始視訊的時候,碼率越高,圖像的失真就會越小,視訊畫面就會越清晰
。但同