視頻編解碼的理論和實踐1:基礎知識介紹

近幾年,視頻編解碼技術在理論及應用方面都取得了重大的進展,愈來愈多的人想要了解編解碼技術。所以,網易雲信研發工程師爲你們進行了概括梳理,從理論及實踐兩個方面簡單介紹視頻編解碼技術。算法

相關閱讀推薦
《視頻直播關鍵技術:流暢、擁塞和延時追趕》
《視頻直播技術詳解:直播的推流調度》
《音視頻通話:小議音頻處理與壓縮技術》segmentfault

一、視頻介紹
視頻的本質是圖像序列,根據視覺暫留的原理,每秒播放20~25張圖像,就會造成連續平滑的視覺效果,人眼將沒法區分其中單幅的圖像,就這樣連續的畫面叫作視頻。每秒播放的圖像數量叫做幀率。圖像是由像素構成的,在彩色圖像中,每一個像素由R、G、B三個份量構成,每一個份量用一個字節存儲。分辨率用於描述圖像的尺寸,例如分辨率1280x720就表示圖像寬度是1280個像素、高度是720個像素。數組

二、壓縮視頻的緣由
爲何要對視頻進行壓縮?假若有一段時長爲60秒視頻,它的分辨率是1280x720,幀率是25,那麼這段視頻的大小等於:60 x 25 x 1280 x 720 x 3 = 4147200000字節,大約是3955MB,如此龐大的數據,若是不進行壓縮,那麼磁盤空間將會很快被佔滿。
多媒體數據佔了互聯網數據量的80%以上,其中大部分都是圖像視頻數據,未壓縮以前的視頻很是龐大,不利於存儲和傳輸,所以頗有必要對視頻進行壓縮,視頻壓縮也叫做視頻編碼,它利用視頻中存在的空間冗餘和時間冗餘,剔除人眼不敏感的信息,達到數據壓縮的目的。
三、視頻壓縮的依據
視頻可以進行壓縮的根本緣由是信息冗餘,視頻中存在兩種冗餘信息:
(1) 空間冗餘。對於視頻的每一幀圖像,在必定尺度範圍內,像素的變化是很是平緩的,像素之間很是類似,這就是空間冗餘。
(2) 時間冗餘。視頻是由連續變化的圖像構成的,在一個很短的時間內,相鄰圖像之間的變化很小,所以相鄰圖像很類似,這就是時間冗餘。ide

四、視頻編碼的原理和細節
因爲視頻中存在大量的信息冗餘,想要對視頻進行壓縮,就必須找到去除冗餘信息的方法,標準的視頻編碼過程包含下面幾個步驟:
(1) 預測編碼。所謂預測就是利用前面像素值來推算當前的像素值。根據前面的知識咱們知道,在空間或者時間上相鄰的像素是很類似,所以只要預測方法合適,預測值和實際值會很接近,假設當前像素的實際值是X,預測值是P,那麼X和P之間的殘差A=X-P。若是咱們只對殘差數據進行編碼,那麼將會大大壓縮數據量。這就是預測編碼的原理。預測編碼能夠分爲空間預測(幀內預測)和時間預測(幀間預測)兩種。預測編碼能夠分爲下面幾個步驟:
i. 利用前面已經編碼並重構像素塊預測當前像素塊的值
ii. 求當前像素和預測像素的差值
iii. 對像素差值進行編碼
iv. 把編碼後的數據傳輸到解碼端,在解碼端按照一樣的方法對像素值進行預測,再加上殘差,就能夠重構獲得原始圖像了。
爲了獲得最佳的預測值,編碼器一般須要使用不一樣預測方法進行預測,而後根據某個評判標準(通常是SAD、STAD、RDO等)獲得最優的預測值(注意不是預測值越接近實際值就越優,所謂最優是計算複雜度、失真和碼率之間的綜合考量),特別對於幀間預測來講,在預測的時候要在參考幀中找到當前塊的匹配塊,須要大量的計算,所以預測模塊通常是編碼器中計算量最大的模塊,而預測方法的好壞也直接決定了視頻的壓縮率。
(2) 變換編碼。變化編碼自己不會對數據進行壓縮,變換的目的是把空域信息轉換爲頻域信息,去除了信息之間的相關性,在接下來的編碼操做中能夠獲得更高的壓縮比,變化編碼是爲下一步的量化編碼作準備的。在視頻編碼中常見的變換方法是DCT變換和哈達瑪變換。
(3) 量化編碼。量化是視頻產生失真的根本緣由。通過預測編碼、變換編碼以後獲得的數據被稱爲變換系數,雖然變換系數相對於原始數據數來講已經很小了,可是係數值的變化範圍仍然很大,利用量化把變換系數的連續取值轉換成有限的離散值,這樣可大大提升壓縮率。假設有這樣一組數據[16,96,100,600,50],量化參數是25,那麼量化以後數據是round([16 / 25, 96 / 25, 100 / 24, 600 / 25, 50 / 25]) = [0,4,4,24,2],能夠看到,量化以前的數據範圍是16~600,須要大量的比特數才能表示,量化以後的數據範圍是0~24,只須要少許比特數就能夠表示,實現了壓縮數據的目的。編碼是一個不可逆的操做,它是失真產生的根本緣由。
(4) 環路濾波。環路濾波和壓縮沒有很大關係,卻和視頻的畫面質量有很大關係。視頻編碼是以塊爲單位進行的,在通過量化模塊時,可能每一個塊選擇的量化係數不一樣,致使每一個塊產生的失真不同,形成像素塊的邊界不連續,所以人眼觀看視頻的時會有方塊效應(也就是有不少馬賽克現象)。爲了提升視頻質量,有必要對方塊效應進行消除,這就是環路濾波模塊的功能。通過量化操做以後的數據塊,再通過反量化、反變換,而後進行重構,接着進入去方塊濾波進行去方塊操做,獲得的像素塊就能夠做爲參考像素塊給預測模塊使用。環路濾波是一個可選模塊。
(5) 熵編碼。熵編碼的目的是去除統計冗餘,實現數據的進一步壓縮。這麼說可能有點抽象,舉個例子,假設有這樣一組數據[0,4,4,24,2],若是使用定長編碼來進行編碼,這段數據能夠表示爲[00000,00100,00100,11000,00010],每一個數據須要5 bit來表示,這段數據的總長度是5 bit x 5=25 bit;若是咱們使用哈夫曼來編碼,這個數組中每一個元素機率值分別以下:數值0的機率是20%,數值4的機率是40%,數值24的機率是20%,數值2的機率是20%,即[20%,40%,20%,20%],根據每一個元素的機率構造哈夫曼樹(節點中括號內的是數組元素值),以下圖所示,所以這段數據能夠表示爲[0,10,110,111],數據的總長度是11 bit。編碼

clipboard.png

因而可知使用哈夫曼編碼能夠去除統計冗餘,實現數據壓縮的目的,哈夫曼編碼就是一種熵編碼方法,可是因爲哈夫曼編碼對錯誤很是敏感,不適合實際應用,所以實際應用中一般使用變長編碼(CAVLC)和算術編碼(CABAC)做爲熵編碼算法。算術編碼利用一個0到1之間的浮點數來描述一個信號序列,而後用這個浮點數來表示這個信號序列,極大的壓縮了數據。算術編碼可使用一個簡單的例子說明,假設有一個二進制串「10101110」,符號0和1的機率值都是50%,算術編碼的過程以下:
(1) 設置定一個區間,一般這個區間咱們設定爲[0,1),而後使用low指向區間的下界,用high指向區間的上界,如今low指向0,rhigh指向1.
(2) 輸入每個符號,按照符號的不一樣對low和high進行調整,調整方法以下面公式所示,最後把low指向的浮點數做爲這個符號串的碼字,表示這個二進制串,能夠看到算術編碼的壓縮效率比哈夫曼編碼高不少,在x264中使用CABAC(上下文自適應的二進制算數編碼)做爲熵編碼算法。spa

clipboard.png

以上就是編解碼技術的基礎知識介紹,該系列第二篇文章將會介紹視頻編解碼技術的實踐。
更多即時通信、音視頻技術的乾貨文章,請關注網易雲信博客視頻

相關文章
相關標籤/搜索