天天看點

音視訊基礎——視訊基礎知識

感情中特能折騰的人,很多都是之前戀情裡受過創傷的人。人總有一種“補償情結”,希望把之前吃過的虧在日後一股腦兒地補回來。那些陳年舊帳就這樣算到了新人頭上。殊不知,成熟的愛,是傷口處開出的玫瑰。容得下委屈的,才留得住真愛。——蘇芩

文章目錄

    • 一、視訊格式
    • 二、視訊協定
    • 三、視訊流
        • 1. 顔色空間
        • 2. 采樣率
        • 3、編碼/存儲格式
    • 四、視訊編解碼
        • 1、視訊編碼方式
        • 2、幀率(FPS)
        • 3、分辨率(Resolution)
        • 4、碼率(BPS)
    • 參考

一、視訊格式

我們經常在各大視訊網站上(如哔哩哔哩、騰訊視訊)觀看視訊,我們也經常在電影天堂上下載下傳電影,我們偶爾會把他們儲存到本地,我們會看到我們儲存的檔案格式都是.avi、.mp4、.mkv之類的檔案,我們在網絡直接觀看就是觀看的視訊流,儲存到本地的檔案都是各種視訊檔案

本地視訊檔案常見有MP4、MKV、AVI等,這些都是什麼?有什麼差別?

我們在解答這個問題之前,我們需要引入一個名詞:視訊封裝格式,簡稱 視訊格式,我們有時候也叫容器

常見的視訊格式如下:

視訊檔案格式 視訊封裝格式
.avi AVI(Audio Video Interleaved)
.wmv、.asf WMV(Windows Media Video)
.mpg、.mpeg、.vob、.dat、.3gp、.mp4 MPEG(Moving Picture Experts Group)
.mkv Matroska
.rm、.rmvb Real Video
.mov QuickTime File Format
.flv Flash Video

二、視訊協定

在騰訊視訊、哔哩哔哩網上看的視訊,與本地播放的MP4、MKV、AVI檔案,有什麼差別?

在回答這個問題,我們需要解釋視訊協定

『視訊協定』是針對網絡流媒體而言的,也就是隻有在有網絡時通過浏覽器或者移動端APP才能看到的視訊,目前常見的協定有RTSP、RTMP、HLS、HTTP等。筆者短暫地接觸過GStreamer開發,在連接配接到RSTP視訊時,發現除了視音頻流和metadata之外,還攜帶了播放的信令。

而剝開視訊協定的外殼之後我們後面會介紹視訊流本身

三、視訊流

就視訊流而言,相信大家平時一定經常聽到類似“h264碼流”、“yuv流”、“編碼流”、“解碼流”,“原始流”、“裸流”,“壓縮後的流”或者“未壓縮的流”等等。歸納而言,提到『視訊流』的時候,一定隻有兩種形式:

  • 經過壓縮算法壓縮的流資料,稱為『編碼流』,又因為目前壓縮/編碼算法以H264為主,是以也常常稱為『H264碼流』。
  • 未經壓縮的流資料,是解碼後的流資料,稱為『原始流』,可以想象視訊是由一幅一幅在時間上連續的“圖像”組成的,而因為視訊内部的“圖像”是『YUV』(後文将介紹),是以也常常稱為『YUV流』。

我們這裡會引入一個概念叫做幀,『幀』是視訊流媒體領域的核心

『幀』,可以聯想成我們平時看到的一幅幅“圖像”,隻不過我們平時接觸的圖檔是『RGB』格式的,而視訊幀通常是『YUV』格式的。既然提到了『RGB』和『YUV』,那麼就來了解下幀的格式『YUV』,

  • 在達到最大壓縮率的情況下,能夠保證對人眼感覺的失真度最小。『YUV』的三通道中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰階值;而"U"和"V"表示的則是色度(Chrominance或Chroma)。有一堆科學家研究發現,人眼對UV的敏感度最低,是以可以極大比例地壓縮UV兩個通道的數值。見視訊編解碼學習一 yuv格式。
  • 為了向前相容黑白電視。這個就涉及曆史原因了,非常推薦零基礎入門音視訊開發。曆史上在制定視訊幀格式時,是有人提出過用RGB的,最終決定用YUV

1. 顔色空間

“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度(Chrominance)、濃度(Chroma)。這裡表示的是色彩空間的基,即類似XYZ坐标系的一種色标表示基準,也就是說每一種顔色可以通過三維向量<yi,ui,vi>來表示。與其類似的還有RGB顔色空間、HSV顔色空間等。下圖來自How does the YUV color coding work?

音視訊基礎——視訊基礎知識

随着通信行業的發展,實際應用之多之複雜,導緻『YUV』衍生出了一個大家族。接觸視訊領域的一定聽說過YCbCr,甚至還有YPbPr、YIQ等。它們有的已經被時代淘汰,有的現在還在使用。之是以出現『YUV』大家族,完全是因為實際電路系統之間的差異,導緻要從『YUV』轉到『RGB』空間,實際對應的轉化系數是有些許差異的,于是各個部門開始制定各種規範,才有了我們現在看到的『YUV』大家族。

YCbCr是專門針對數字電路而誕生的;YPbPr則是模拟電路。但是,現在是數字時代,是以為了模拟電路而生的YPbPr已經逐漸被淘汰了,而YCbCr還一直發揮着作用。是以現在,YCbCr有時也會被簡單地稱為/認為『YUV』。

2. 采樣率

讀者可能聽說過“YUV444”,“YUV422”,“YUV420”,到這裡可能會納悶:“YUV不是顔色空間嗎?為什麼後面還會跟着一串數字?” 因為當你看到YUV後面跟着一串數字的時候,『YUV』已經不再是顔色空間的基的含義了,而是意味着在原始『YUV流』上的采樣。

在以前流媒體剛剛興起時,還沒有什麼4G/5G,當時為了減小網絡傳輸的帶寬的壓力,可謂做了種種努力。除了編碼/壓縮之外,YUV采樣率也是一種。

444,422和420是三種『YUV』(在數字電路中指代YCbCr)的采樣,三位數分别代表Y\U\V(數字電路中為Y\Cb\Cr,本段後同)通道的抽樣比。是以可以了解,444是全采樣;而422是對Y進行全采樣,對U\V分别進行1/2均勻采樣。有趣的問題來了,420難道是完全丢棄了V通道/分量資料嘛?答案是否定的。

首先,必須要搞明白一個問題,一幀圖像是由一個個像素組成的矩形,譬如4x4的尺寸的圖像,就是由16個像素點組成的。在平時接觸的『RGB』圖像中,每個像素必然至少由R\G\B這三個通道組成的(有的圖像還有\alpha分量),每個分量的取值一般都是[0,255],也就是[20,28],是以經常說一個像素占用3位元組(如果還有其他分量,比如RGBA,就另當别論)。『YUV』圖像同理,它的每個像素是由Y\U\V組成的。

接下來,從整張圖像宏觀考慮采樣問題。還是以4X4的圖像為例,444的如下圖2-1,這個是形象化成圖像的樣子,實際在機器記憶體儲并不是這樣,具體可以參見部落格《圖像原始格式一探究竟》。422和420分别如下圖2-2和2-3。

音視訊基礎——視訊基礎知識

圖2-1. YUV444采樣示意圖

音視訊基礎——視訊基礎知識

圖2-1對應YUV444采樣,即全采樣,圖示中可以看出每個像素中的Y\U\V通道都保留下來了,一般來說YUV444太大了,是以很少使用。

圖2-2. YUV422采樣示意圖

圖2-2對應YUV422采樣,這種采樣方式是:每個掃描線或者說每行相鄰2個像素,隻取1個像素的U\V分量。此外,可以計算出來,每個像素占用的大小為原來的2/3,是以說YUV422是YUV444的2/3大小。

這個時候就有一個問題,在『YUV』轉『RGB』時,被抽走了U\V分量的像素要怎麼辦呢?做法很簡單,就是相鄰2個像素的Y分量公用保留着的U\V分量。

音視訊基礎——視訊基礎知識

圖2-2. YUV420采樣示意圖

圖2-3對應YUV420采樣,這種采樣方式是:隔行進行YUV422每行采樣的辦法,即相鄰2個像素隻取1個像素的U\V分量;下一行丢棄所有的U\V分量。此外,可以計算出來,每個像素占用的大小為原來的1/2,是以說YUV420是YUV444的1/2大小。恢複U\V分量的辦法同YUV422,隻不過這裡是2X2的矩陣共享保留着的U\V分量。

這種設計辦法真的很巧妙!前文提到的**“人眼對UV的敏感度最低,是以可以極大比例地壓縮UV兩個通道的數值”**,且對于圖像而言,相鄰的區域像素的色彩、飽和度一般非常接近,是以這種以2X2矩陣為基本機關,隻保留1組U\V分量合情合理。

3、編碼/存儲格式

大家肯定還聽說過YV12、YU12、NV12、NV21吧,看到這裡是不是又納悶:“後面的數字怎麼變成2個了?而且前面的英文字母還變了?”

以上統稱為『視訊的存儲格式』,也就是說,計算機是如何存儲一幀視訊的。

首先,『視訊的存儲格式』總分為兩大類:『打包格式(packed)』和『平面格式(planar)』。前者又被稱作『緊湊格式(packed)』。其實除此之外還有『半平面模式(Semi-Planar)』,估計是使用的比較少,是以在很多文章中常被忽略。

筆者很感興趣,為什麼會出現『打包格式』和『平面格式』兩大派系,網上搜了很多資料也沒找到原因,部落格【音視訊基礎】:I420、YV12、NV12、NV21等常見的YUV420存儲格式提到了需要約定存儲格式,但也沒提到為什麼會分成這兩種。要麼就是派系之争,類似貝葉斯學派和頻率學派;要麼就是實際應用中逐漸衍生出這兩大格式。時至今日,這兩個格式還在被使用,是以對于多媒體開發者們都有必要了解。

『打包格式』是把Y\U\V分量交叉存儲,『平面格式』則是把Y\U\V嚴格分開存儲,『半平面模式』介于兩者之間,Y分量分開存儲,U\V交叉存儲。

以下圖為例說明『打包格式』、『平面格式』和『半平面模式』應該是非常清楚的,圖摘自部落格YUV格式初探:

音視訊基礎——視訊基礎知識

圖3-1. YUV420P存儲示意圖

音視訊基礎——視訊基礎知識

圖3-2. YUV420SP存儲示意圖

音視訊基礎——視訊基礎知識

圖3-3. YUV420Packet存儲示意圖

四、視訊編解碼

1、視訊編碼方式

  • 視訊編碼的作用: 将視訊像素資料(RGB,YUV 等)壓縮成視訊碼流,進而降低視訊的資料量。
名稱 推出機構 推出時間 目前使用領域
HEVC(H.265) MPEG/ITU-T 2013 研發中
H.264 MPEG/ITU-T 2003 各個領域
MPEG4 MPEG 2001 不溫不火
MPEG2 MPEG 1994 數字電視
VP9 Google 2013 研發中
VP8 Google 2008 不普及
VC-1 Microsoft Inc. 2006 微軟平台

常見的幀名詞

2、幀率(FPS)

『幀率』,FPS,全稱Frames Per Second。指每秒傳輸的幀數,或者每秒顯示的幀數,一般來說,『幀率』影響畫面流暢度,且成正比:幀率越大,畫面越流暢;幀率越小,畫面越有跳動感。一個較權威的說法:

當視訊幀率不低于24fps時,人眼才會覺得視訊時連貫的,稱為“視覺暫留”現象。

是以,才有說法:盡管『幀率』越高越流暢,但在很多實際應用場景中24fps就可以了。

3、分辨率(Resolution)

『分辨率』,也常被俗稱為『圖像的尺寸』或者『圖像的大小』。指一幀圖像包含的像素的多少,常見有1280x720(720P),1920X1080(1080P)等規格。『分辨率』影響圖像大小,且與之成正比:『分辨率』越高,圖像越大;反之,圖像越小。

4、碼率(BPS)

『碼率』,BPS,全稱Bits Per Second。指每秒傳送的資料位數,常見機關KBPS(千位每秒)和MBPS(兆位每秒)。筆者認為這個概念真正要了解起來還是需要好好說明的,網上一說:“『碼率』與體積成正比:碼率越大,體積越大;碼率越小,體積越小”;另一說:“『碼率』越大,說明機關時間内取樣率越大,資料流精度就越高,這樣表現出來的的效果就是:視訊畫面更清晰畫質更高”;還有說法是:”『碼率』就是『失真度』“。但是筆者有一段時間就是不了解,每秒傳輸的資料越大,為什麼必然就對應畫面更清晰?還有體積怎麼了解呢?且看下文”三者之間的關系“。

『幀率』『分辨率』和『碼率』三者之間的關系

最理想的情況是畫面越清晰、越流暢是最好的。但在實際應用中,還需要結合硬體的處理能力、實際帶寬條件選擇。高『幀率』高『分辨率』,也就意味着高『碼率』,也意味着需要高帶寬和強大的硬體能力進行編解碼和圖像處理。是以『幀率』和『分辨率』應該視情況而定。

要說三者之間的關系,其實就是對于『碼率』的了解。在**碼率(BPS)**概念中提到了幾段摘自網上的說法,說的都太模糊了,筆者直到閱讀了文章Video Bitrate Vs. Frame Rate,才真的了解了『碼率』。

參考

https://zhuanlan.zhihu.com/p/61747783

繼續閱讀