音視頻處理基礎知識掃盲:數字視頻YUV像素表示法以及視頻幀和編解碼概念介紹

一、引言

筆者本人對音視頻編碼處理的基本概念基本上可以說是個白癡,在通過moviepy進行音視頻處理時,發現幀數據就是一個大的numpy數組,很好奇這個數組的內容是什麼,因此就到處找各種資料瞭解一些幀相關的基本概念,在這中間會發現“YUV”是個繞不過去的坎,但看了好多文章才理解這些相關概念的含義,在此寫出來供各位與本人差不多的缺乏音視頻基礎知識的人士掃盲使用。

二、數字視頻像素YUV編碼格式

我們知道不同權重的R、G、B可以組成不同的顏色(又稱爲色調(hue)或色相,用於區別顏色的名稱或種類,通常說的顏色七色即是指色調),但電視或視頻的像素顏色表示不是使用的RGB來表示,而是使用的一種叫Y、U、V的維度來表示。

  • Y表示亮度(Luminance或Luma),也稱爲灰階值,是不同權重的R、G、B的組合值。實際上亮度是對顏色的明度(brightness)的一種度量,明度是指視覺系統對可見物體輻射或發光多少的感知屬性,明度的一個極端是黑色沒有光,另一個極端是白色,二者之間是灰色。明度很難度量,因此使用亮度(luminance)來度量,亮度(luminance)即輻射的能量。不同顏色的像素有不同的Y值,亮度信號可用來傳送黑白圖像,黑白視頻只有Y(Luminance)視頻,也就是灰階值。
  • UV色差信息:色彩信息可以表示爲色差(Chrominance或Chroma),每一個色差表示了對應像素RGB值與Y的差,紅色差=R-Y,藍色差=B-Y。通過Y信息和色差信息就可以還原出RGB色彩信息。而UV信號(稱爲色度信號)是通過壓縮紅色差和藍色差數值信號對視頻頻帶高頻端的色副載波進行調製而成的信號,經壓縮後的藍色差和紅色差信號就稱爲U、V。UV信號告訴了顯示器要偏移某象素的的顏色,而不改變其亮度。或者UV信號告訴了顯示器使得某個顏色亮度依某個基準偏移。UV的值越高,代表該像素會有更飽和的顏色。

爲什麼色差信號能壓縮呢?這是因爲人類的視覺系統(HVS)對色度的敏感程度低於亮度,人眼對彩色細節的分辨能力遠比對亮度細節的分辨能力低,這樣就可以把幾個相鄰像素不同的彩色值當作相同的彩色值來處理,從而減少所需的存儲容量和傳輸量。例如可以將相鄰N個像素各自的Y值保留成N個不同的Y值,但它們可以共用一個相同的UV值,這種N+1的模式壓縮了存儲空間但還原RGB色彩後不影響人的感知。

不同的壓縮方式對應不同的YUV編碼格式,YUV細分的話有Y’UV,YUV,YCbCr,YPbPr等類型,這些YUV模型的區別主要在於UV數據的採樣方式和存儲方式。上述YUV編碼類型中YCbCr主要用於數字信號,其中Y與YUV 中的Y含義一致, Cb , Cr 同樣都指色彩, Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異,而Cb反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異,此即所謂的色差信號。一般所講的YUV大多是指YCbCr。因此在數字圖像處理中通常YUV指代YCbCr,JPEG、MPEG,H264均採用此格式。

YCbCr與RGB之間的換算公式如下:
 Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
 Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
 Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128

與顏色相關的其他名詞:

  • 飽和度(saturation):指顏色的純潔性,用來區別顏色的明暗程度,完全飽和的顏色是指沒有滲入白光所呈現的顏色
  • 光亮度(lightness):是人的視覺系統對亮度(luminance)的感知響應值,而明度僅限於發光體,用於描述反射或透射表面。
  • 顏色空間:顏色空間是表示顏色的一種數學方法,人們用它來指定和產生顏色,使顏色形象化。顏色空間中的顏色通常使用代表三個參數的三維座標來指定,這些參數描述的是顏色在顏色空間中的位置,但並沒有告訴我們是什麼顏色,其顏色要取決於使用的座標。從技術上角度區分,顏色空間可分成如下三類:
  • RGB型顏色空間/計算機圖形顏色空間:這類模型主要用於電視機和計算機的顏色顯示系統
  • XYZ型顏色空間/CIE顏色空間:這類顏色空間是由國際照明委員會定義的顏色空間,通常作爲國際性的顏色空間標準,用作顏色的基本度量方法
  • YUV型顏色空間/電視系統顏色空間:由廣播電視需求的推動而開發的顏色空間,主要目的是通過壓縮色度信息以有效地播送彩色電視圖像。關於YUV更多的介紹請參考《YUV格式初探》。

三、視頻幀

我們知道數字視頻播放是將一幅幅連續的靜態圖像按一定的頻率快速切換所形成的圖像流(可以稱爲視頻流),這個播放頻率即爲fps(每秒播放的幀數),每個圖像就稱爲視頻的一個幀,在固定fps(幀率)播放速率情況下,在視頻流中每個幀的位置可以通過時間作爲位置來獲取。

視頻流存在兩種形式,一種是沒有基於流進行壓縮的視頻流,這種視頻流是由YUV格式的圖像組成,雖然YUV本身對應的幀有壓縮但整個流沒有壓縮,這種流稱爲“原始流”或“YUV流”;另一種是基於流進行了壓縮的視頻流,稱爲“編碼流”,又因爲目前壓縮/編碼算法以H264爲主,因此也常常稱爲“H264碼流”。編碼/壓縮在流媒體領域是一項非常重要的技術:從“H264碼流”到“YUV流”的過程稱爲解碼,反之稱爲編碼。對於視頻編碼/壓縮而言,它的核心是採用儘量小的空間存儲一組時間上連續的幀數據;而對於視頻解碼而言,就是把被編碼/壓縮後的一組幀數據儘量恢復成原來的樣子,能夠被100%恢復的編碼/壓縮算法稱爲無損壓縮,反之稱爲有損壓縮。

視頻和幀相關的名詞:
  • 幀率(FPS)
    FPS,全稱Frames Per Second,指每秒傳輸的幀數,或者每秒顯示的幀數,一般來說,FPS影響畫面流暢度,且成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。一個較權威的說法:當視頻幀率不低於24fps時,人眼纔會覺得視頻時連貫的,稱爲“視覺暫留”現象。因此,纔有說法:儘管『幀率』越高越流暢,但在很多實際應用場景中24fps就可以了。
  • 分辨率(Resolution)
    分辨率也常被俗稱爲“圖像的尺寸”或者"圖像的大小"。指一幀圖像包含的像素的多少,常見有1280x720(720P),1920X1080(1080P)等規格。『分辨率』影響圖像大小,且與之成正比:分辨率越高,圖像越大;反之,圖像越小。
  • 碼率(BPS)
    碼率BPS,全稱Bits Per Second,指每秒傳送的數據位數,常見單位KBPS(千位每秒)和MBPS(兆位每秒)。幀率、分辨率和壓縮率都會影響碼率。高幀率高分辨率就意味着高碼率,也意味着需要高帶寬和強大的硬件能力進行編解碼和圖像處理。高分辨率意味着圖片可以包括更多的細節,低壓縮率意味着圖片壓縮損失越少,即失真越少,越清晰。
  • I幀,英文全寫Intra Picture,又稱幀內編碼幀,俗稱關鍵幀。一般來說I幀不需要依賴前後幀信息,可獨立進行解碼
  • P幀,英文全寫predictive-frame,又稱前向預測編碼幀,也有幀間預測編碼幀。顧名思義,P幀需要依賴前面的I幀或者P幀才能進行編解碼,因爲一般來說,P幀存儲的是當前幀畫面與前一幀(前一幀可能是I幀也可能是P幀)的差別,較專業的說法是壓縮了時間冗餘信息,或者說提取了運動特性。P幀的壓縮率約在20左右,幾乎所有的H264編碼流都帶有大量的P幀
  • B幀,英文全寫bi-directional interpolatedprediction frame,又稱 雙向預測內插編碼幀,簡稱雙向預測編碼幀。B幀非常特殊,它存儲的是本幀與前後幀的差別,因此帶有B幀的視頻在解碼時的邏輯會更復雜些,CPU開銷會更大。因此,不是所有的視頻都帶有B幀,B幀的壓縮率能夠達到50甚至更高
  • IDR幀,英文全寫Instantaneous Decoding Refresh,翻譯過來是即時解碼刷新。IDR幀是一種特殊的I幀,它是爲了服務於編解碼而提出的概念,IDR幀的作用是立刻刷新,使錯誤不致傳播,從IDR幀開始,重新算一個新的序列開始編碼
  • GOP,英文全稱Group Of Pictures,一般來說,指的就是兩個I幀之間的間隔,嚴格來說,是兩個IDR幀之間的間隔。GOP在一定程度上會影響視頻畫面質量 - 在碼率相同的情況下,GOP越大,意味着P\B幀越多,也就更容易獲取較好的圖像質量”這個說法存疑。
  • DTS,英文全稱Decoding Time Stamp,即解碼時間戳,這個時間戳的意義在於告訴解碼器該在什麼時候解碼這一幀的數據。
  • PTS,英文全稱Presentation Time Stamp,即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的數據。DTS和PTS在做視音頻同步的時候特別重要,尤其是PTS,目前常見的視音頻同步的三種策略“同步到音頻的PTS”、“同步到視頻的PTS”和“同步到系統/外部時鐘”,都是基於PTS完成的。
  • 視頻格式是視頻播放軟件爲了能夠播放視頻文件而賦予視頻文件的一種識別符號,視頻格式規定了和播放器的通信協議。

關於視頻和幀的更多內容請參考《視頻和視頻幀:視頻和幀基礎知識整理》。

跟老猿學Python、學5G!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章