音視頻開發基礎理論-視頻篇

上篇:
音視頻開發基礎理論-音頻篇


  • 視頻是怎麼形成的?
  • 視頻是如何播放的?
  • mp4和mkv等有什麼區別?
  • H.264是什麼?
  • ...

帶着這些疑問,我們一起來看看視頻相關的知識;

顏色

顏色是通過眼、腦和我們的生活經驗所產生的一種對光的視覺效應
顏色就是人對光的一種感覺,由大腦產生的一種感覺

人類肉眼由視錐細胞及視杆細胞組成,它們共同影響眼睛對不同頻率的光的感知程度的不同,對不同亮度的感知程度的不同;

  • 視錐細胞:視網膜的中央,對紅、綠、藍三種光敏感,可以識別色度;
  • 視杆細胞:分散分佈在視網膜上,對環境的分辨能力(比如夜裏看到物體的黑白輪廓),可以識別亮度;


自然界中的任一顏色都可以由紅,綠,藍 這3 種顏色值之和來確定,這即是三原色,可以選擇不同的三原色構造不同的顏色空間。

顏色模型

選定三原色,並且對三原色進行量化,那就可以將人的顏色知覺量化爲數字信號;

常見的顏色模型:

  • RGB
    RGB模型是工業界的一種顏色標準,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各種顏色的;
    使用8位的二進制, 可以表示 2^8 =256種色彩。
    使用16位的二進制,可以表示 2^16 =65536種色彩。
    使用24位的二進制,可以表示 2^24 =16777216種色彩。

  • CMYK、CMY
    用於印刷出版。CMYK表示青(Cyan)、品紅(Magenta)、黃(Yellow)、黑(BlacK)四種顏料

  • HSL、HSV
    色相(Hue)、飽和度(Saturation)、亮度(Lightness/Luminance/Intensity)

  • YUV
    主要用於視頻信號的壓縮、傳輸和存儲,和向後相容老式黑白電視;
    類似於RGB,YUV由Y、U、V三個分量組成:
    Y表示明亮度(Lumina nce或Luma),也就是灰階值;U和V表示的是色度(Chrominance或Chroma),描述影像色彩及飽和度,用於指定像素的顏色。

YUV詳解

黑白電視的時候,基本上只需要一路信號就可以還原圖像(亮度)。但是有了彩色之後,一路信號無法表達一副完整的彩色圖像(亮度+色度);
彩色電視出現之後,爲了兼容早期的黑白電視信號(也就是黑白電視機可以接收彩色信號,但是隻顯示黑白),科學家引入了YUV色彩表示法。

現在通常說的YUV指的是YCbCr:
其中Y與YUV 中的Y含義一致,Cb , Cr同樣都指色彩,只是在表示方法上不同而已,Cb Cr 就是本來理論上的“分量/色差”的標識。C代表分量(是component的縮寫),Cr、Cb分別對應r(紅)、b(藍)分量信號,Y除了g(綠)分量信號,還疊加了亮度信號。

YUV的誕生一開始是考慮到黑白電視兼容,但是目前黑白電視基本淘汰,YUV色彩何以延續至今呢?
最主要的原因不是因爲兼容性考慮,而是YUV有個巨大的優勢,就是節省帶寬。這在數字媒體領域是很重要的。
對比RGB,使用YUV一個像素可以減小至平均只佔用12bit(1.5字節);體積是RGB888的一半;
在體積減少的情況,給與人肉眼的感覺其實區別並不大;
這是由於人類視網膜上的視杆細胞要多於視錐細胞,視網膜杆細胞的作用就是識別亮度,而視網膜錐細胞的作用就是識別色度。所以人眼對亮度分辨率的敏感度高於對色彩分辨率的敏感度;
YUV顏色模型就是利用這個原理,把亮度與色度分離,根據人眼對亮度更敏感,增加亮度的信號,減少顏色的信號,以此來節省空間,從而適合於圖像處理領域。

我們更容易識別去除色彩的圖像,而對於單獨剝離出的只有色彩的圖像,不好識別:

總結一下YUV的優點:

  • 兼容性更好,可以兼容黑白色彩;
  • 體積更小,適合於圖像處理領域;

YUV採樣格式

採樣格式通常用A:B:C的形式來表示,比如4:4:4、4:2:2、4:2:0等;
其中常用的是4:2:0。

A:一塊A*2個像素的概念區域,一般都是4
B:第1行的色度採樣數目
C:第2行的色度採樣數目
C的值一般要麼等於B,要麼等於0

  • 4:4:4
    每1個像素都有自己獨立的1組CbCr分量,1個像素佔用24bit(3字節)
  • 4:2:2
    水平方向相鄰的2個像素(1行2列)共用1組CbCr分量,1個像素平均佔用16bit(2字節)
  • 4:2:0
    相鄰的4個像素(2行2列)共用1組CbCr分量,1個像素平均佔用12bit(1.5字節)

視頻相關概念

  • 視頻
    連續的圖象變化,每秒超過24幀(Frame)畫面時,根據視覺暫留原理,人眼無法辨別單幅的靜態畫面,看上去是平滑連續的視覺效果,這樣連續的畫面叫做視頻;
  • 幀(Frame):
    是視頻常用的最小單位,相當於電影中膠片的每一格鏡頭,一幀就是一副靜止的畫面,連續的幀就形成了視頻。
  • 幀速率(FPS):
    每秒鐘所包含的幀數量,也可以理解爲處理器每秒刷新的次數,幀數越高,畫面也就越流暢。

  • 過去電視熒光屏掃描是隔行掃描,每兩次掃描才產生一副圖像,而每次掃描就叫做1場。也就是說每2場掃描生成1幀畫面。
  • 比特率
    表示單位時間(1秒)內傳送的比特數,一般我們用的單位是kbps,其意思是 Kilobits per second

視頻的採樣

視頻最早是由攝像機拍攝製作而成的;
現實中攝像機的成像原理都是基於小孔成像爲基礎的。
我們知道,光在同一均勻介質中、不受引力作用干擾的情況下,沿直線傳播;因此它在遇到阻隔物上的孔洞時會穿過它,並能在孔後一定距離內的對應平面上投射出一個倒立的實影;只要投影面周圍的環境足夠暗,影像就能被人眼所觀看到。
攝像機的基本工作原理就是——將景物影像通過光線的各種傳播特性準確地聚焦在具有感光能力的感光器件上;這種感光器件上面覆蓋了一層含三基色的馬賽克濾鏡;一片感光器件來採集三種顏色,感光器件是對光敏感的設備,對於進光三種顏色的強弱可以產生不同的電壓;將這些不同的電壓記錄下來並轉換爲數字信號(RGB或YUV等表示),在進行壓縮存儲即得到視頻數據;

視頻分辨率

分辨率是用於度量圖像內數據量多少的一個參數,通常表示成ppi(每英寸像素Pixel per inch), 視頻的320X180是指它在橫向和縱向上的有效像素

視頻分辨率也是數字化視頻時代的主要特徵,由於模擬視頻採用線掃描機制,也就是按行顯示圖像,而每一行的視頻線中並沒有進行數字量化,所以模擬視頻都是以多少行來界定的。比如PAL制式採用576行,NTSC制式採用480行。

到了數字化時代,爲了量化視頻的具體信息,就必須對每行的信息進行採樣並量化,就形成了分辨率的概念。如果採用PAL制式的視頻,每行量化的圖像點爲768個,那麼分辨率就是768×576。也就是說把PAL制的視頻圖像可以分解爲768×576個像素點組成。

在標清電視時代,對於分辨率方面理解與現在其實有所不同。比如SECAM制式每幀圖像是625行,但是分辨率是720×576,也就是隻有576行。是因爲視頻信號傳輸過程中分幀正程和幀逆程,而幀逆程就是回掃,反向回去。在視頻信號正常顯示時,需要消除行幀逆程掃描對畫面的干擾,所以就變成了576行。

到了高清時代,數字電視推出了HDTV標準,它對於顯示分辨率的定義爲1280×720逐行掃描,也就是俗稱的720P;1920×1080隔行掃描,也就是俗稱的1080i;1920×1080逐行掃描,也就是所謂的1080P。

當然高清數字電視已經逐漸普及了,目前正在面向4K高清過渡,也就是所謂的UHDTV(Ultra High Definition Television,超高清數字電視)。UHDTV草案定義了兩個分辨率標準,及4K(3840×2160)和8K(7680×4320),支持50Hz、60Hz、和59.94Hz三種幀率,只採用逐行掃描。UHDTV採用正交採樣,像素縱橫比(PAR)爲1:1,顯示縱橫比(DAR)爲16:9。

視頻編解碼

視頻編碼:

按照YUV色彩表達方式,採樣格式4:2:2,720×1280的分辨率,每秒30幀畫面的視頻。經過簡單的計算,1分鐘視頻大小=720x1280x2x30x60=3G;

可見採集的原始視頻信號體積都非常大,如果視頻不經過壓縮編碼的話,佔用存儲太大不利於保存及傳輸。
視頻編碼就是文件當中的視頻所採用的壓縮算法,視頻編碼的主要作用是將視頻像素數據(RGB,YUV等)壓縮成爲視頻碼流,從而降低視頻的數據量。

視頻解碼:

有了編碼,當然也需要有解碼。
因爲壓縮(編碼)過的內容無法直接使用,使用時必須解壓縮,還原爲原始的信號(比如視頻中某個點的顏色等),這就是“解碼“或者”解壓縮“。

H.264

目前所有的視頻壓縮編碼格式:

現在幾乎都是被H.264統一了市場,因此着重瞭解下H.264;
H.264(MPEG-4 Part 10,Advanced Video Coding),
是迄今爲止視頻錄製、壓縮和分發的最常用格,H.264提供了明顯優於以前任何標準的壓縮性能。
其編碼過程大體可以歸納爲以下幾個主要步驟:

  1. 劃分幀類型
  2. 幀內/幀間編碼
  3. 變換 + 量化
  4. 濾波
  5. 熵編碼

幀內(Intraframe)編碼:當壓縮一幀圖像時,僅考慮本幀的數據而不考慮相鄰幀之間的冗餘信息,這實際上與靜態圖像壓縮類似。幀內一般採用有損壓縮算法,由於幀內壓縮時各個幀之間沒有相互關係,所以壓縮後的視頻數據仍可以以幀爲單位進行編輯。幀內壓縮一般達不到很高的壓縮。

幀間(Interframe)編碼:基於許多視頻或動畫的連續前後兩幀具有很大的相關性,或者說前後兩幀信息變化很小的特點。也即連續的視頻其相鄰幀之間具有冗餘信息,根據這一特性,壓縮相鄰幀之間的冗餘量就可以進一步提高壓縮量,減小壓縮比。幀間壓縮也稱爲時間壓縮(Temporalcompression),它通過比較時間軸上不同幀之間的數據進行壓縮。幀間壓縮一般是無損的。幀差值(Frame differencing)算法是一種典型的時間壓縮法,它通過比較本幀與相鄰幀之間的差異,僅記錄本幀與其相鄰幀的差值,這樣可以大大減少數據量。

具體參考: https://www.cnblogs.com/mjios/p/14768991.html

視頻封裝格式:

封裝格式的主要作用是把視頻碼流和音頻碼流按照一定的格式存儲在一個文件中。有了封裝格式,才能把字幕,配音,音頻和視頻組合起來。常見的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件都指的是一種封裝格式。

流行的封裝格式如下所示:

視頻播放

播放一個互聯網上的視頻文件,需要經過以下幾個步驟:解協議,解封裝,解碼視音頻,視音頻同步;
播放本地文件則不需要解協議,需要經過以下幾個步驟:解封裝,解碼視音頻,視音頻同步;

  • 解協議:將流媒體協議的數據,解析爲標準的相應的封裝格式數據。視音頻在網絡上傳播的時候,常常採用各種流媒體協議,例如HTTP,RTMP,或是MMS等等。這些協議在傳輸視音頻數據的同時,也會傳輸一些信令數據。這些信令數據包括對播放的控制(播放,暫停,停止),或者對網絡狀態的描述等。解協議的過程中會去除掉信令數據而只保留視音頻數據。例如,採用RTMP協議傳輸的數據,經過解協議操作後,輸出FLV格式的數據。

  • 解封裝:將輸入的封裝格式的數據,分離成爲音頻流壓縮編碼數據和視頻流壓縮編碼數據。例如,FLV格式的數據,經過解封裝操作後,輸出H.264編碼的視頻碼流和AAC編碼的音頻碼流。

  • 解碼:將視頻/音頻壓縮編碼數據,解碼成爲非壓縮的視頻/音頻原始數據。音頻的壓縮編碼標準包含AAC,MP3等,視頻的壓縮編碼標準則包含H.264,MPEG2等。解碼是整個系統中最重要也是最複雜的一個環節。通過解碼,壓縮編碼的視頻數據輸出成爲非壓縮的顏色數據,例如YUV、RGB等;壓縮編碼的音頻數據輸出成爲非壓縮的音頻抽樣數據,如PCM數據。

  • 音視頻同步:同步解碼出來的視頻和音頻數據,並將視頻音頻數據送至系統的顯卡和聲卡播放出來。
    音視頻同步的目的是爲了使播放的聲音和顯示的畫面保持一致。
    視頻按幀播放,圖像顯示設備每次顯示一幀畫面,視頻播放速度由幀率確定,幀率指示每秒顯示多少幀;
    音頻按採樣點播放,聲音播放設備每次播放一個採樣點,聲音播放速度由採樣率確定,採樣率指示每秒播放多少個採樣點。
    如果僅僅是視頻按幀率播放,音頻按採樣率播放,二者沒有同步機制,即使最初音視頻是基本同步的,隨着時間的流逝,音視頻會逐漸失去同步,並且不同步的現象會越來越嚴重。
    這是因爲:一、播放時間難以精確控制,二、異常及誤差會隨時間累積。所以,必須要採用一定的同步策略,不斷對音視頻的時間差作校正,使圖像顯示與聲音播放總體保持一致。
    音視頻同步的方式基本是確定一個時鐘(音頻時鐘、視頻時鐘、外部時鐘)作爲主時鐘,非主時鐘的音頻或視頻時鐘爲從時鐘。在播放過程中,主時鐘作爲同步基準,不斷判斷從時鐘與主時鐘的差異,調節從時鐘,使從時鐘追趕(落後時)或等待(超前時)主時鐘。
    按照主時鐘的不同種類,可以將音視頻同步模式分爲如下三種:
    音頻同步到視頻,視頻時鐘作爲主時鐘;
    視頻同步到音頻,音頻時鐘作爲主時鐘;
    音視頻同步到外部時鐘,外部時鐘作爲主時鐘;
    根據人耳朵和眼睛生理構造因素,得出一個結論,那就是人的耳朵要比眼睛敏感的多,也就是說如果音頻有跳幀行爲則人的耳朵很容易分辨出來,如果視頻畫面有跳幀行爲或者重複渲染人的眼睛則不容易分辨出來。根據這理論在做視頻播放器的時候可以選擇的音視頻對齊策略是 視頻同步到音頻,音頻時鐘作爲主時鐘

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