日韩欧美亚洲一区SWAG

  • <dd id="kgqm6"></dd>
  • <menu id="kgqm6"><tr id="kgqm6"></tr></menu>
  • 侵權投訴

    為什么要編碼?視頻編解碼原理及詳細步驟

    39度創意研究所 ? 2020-11-26 11:54 ? 次閱讀

    談到視頻的編解碼,我們會自然地想到H.264、HEVC/H.265這些權威的視頻編解碼標準;談到標準,有人覺得這個是有專門機構去研究的,我們關心應用就好;即使有興趣讀了標準和相關技術,面對更多的是各種數學公式和術語,如協方差、傅立葉變換、高頻、濾波等等,需要花更多時間去理解。通常更為實際的做法是,我們只要調研如何應用這些標準,如何做好軟硬件編碼方案的選型,如何優化技術參數以及如何調用API,也就基本能夠應對日常的視頻業務了。因此,談到視頻的編解碼,往往帶有一絲神秘色彩。

    本文的目標是以非專業的視角來看待視頻編解碼原理,試圖將所謂高大上的專業術語或名詞轉換為普通IT業者略懂的話語,從而使更多人了解視頻編解碼到底是怎么回事。

    為什么要編碼?

    原因很簡單,不經過編碼的源視頻數據量太大了。例如輸出一路1920×1080分辨率、24位色、每秒30幀的高清視頻,就這么一秒鐘的視頻,它的碼率達就到了1.5Gbps.因此需要編碼,盡最大可能將其壓縮至最低。下圖展示了編解碼標準的演進歷程,經過H.264編碼后,視頻碼率被壓縮到10Mbps,是源視頻數據量的1/150。

    那么,什么時候我們不再關心編碼了?理想的狀態就是我們不再對存儲空間和網絡帶寬的限制有顧慮的時候,就不需要考慮編碼了,照單全收即可。

    思考:N年以后,在 G網絡普及之后,視頻的編解碼技術和CDN的作用會不會越來越被淡化?

    什么是編碼?

    狹義但不全面的解釋:編碼最主要的工作就是壓縮。但壓縮是分步驟的,不是簡單地把圖像中重復的0 聚在一起這么簡單。依據方法論,可壓縮的內容有以下幾種:

    單幅圖像壓縮

    一幅圖像,分成若干小塊,每塊8×8像素大小,如果這個小塊的每個像素的顏色都是白色,是不是就可以用一個點的值來代替這所有64個點的值? 這在編碼中的標準術語叫空間冗余,相應的方法叫幀內壓縮。

    多幅圖像間壓縮

    視頻中一個連續的動作,比如畫面里的女主角在紅墻背景下閉上了眼睛,這一動作的背后,是由一系列的多幅圖片組成,而每幅圖片的內容基本上都是一樣的,唯一變化的部分就是女主角的眼睛所在圖像區域,眼睛緩慢由開到閉,這塊區域的像素值發生了變化。對于絕大多數的背景區域,它是沒有變化的,那么除了含有閉眼動作的這塊區域,是否可以只用一幅圖像來代替這么多個連續的圖像呢?這在編碼中的術語叫時間冗余,強調的是在一定時間段內如何對連續多幅圖像的冗余部分進行壓縮,術語叫幀間壓縮。

    編碼的壓縮

    圖像的空間冗余和時間冗余都被壓縮了,壓縮成一串字符串,對這段字符串的展現有沒有進一步壓縮的可能性呢?是所謂的編碼冗余。

    所有的視頻編碼技術和標準都是努力對上述三種冗余數據進行壓縮,絞盡腦汁采用不同的算法和策略,產生了不同的結果,也就產生了不同的視頻編碼標準。

    編碼的核心技術步驟主要分為預測、變換、量化、熵編碼,這幾步之后還有個可選步驟是濾波。是不是有點懵,現在解釋一下。

    預測

    一個視頻根據時間采樣被拆成N個圖像,為了壓縮和計算方便,每個圖像被分成多個小塊,比如每個小塊由8×8個像素構成。如果不做壓縮,就需要把每個圖像的每個像素值都存儲起來,一共存儲N幅圖像連接起來,從而構成一個完整的原始視頻。像素值的類型分為圖像的亮度值和色彩值。為了簡化理解 ,本文通篇以亮度值舉例進行講解。

    壓縮的第一步是預測。對于一幅圖像的每個塊,根據某幾個相鄰的像素值,在指定的方向上對下一個像素點的值用一個公式做預測,從而得到該點的預測的像素值,來構造完整的圖像。

    再比如:有連續兩幅運動圖像 ,對一幅圖像不做改變,保存本來的像素值,然后以此圖像的值為基礎,對另一幅圖像使用公式計算來做運動預測,即把第一幅圖像的某個像素的值,經過公式計算后,預測出第二個圖像指定位置的像素值,以此類推,得到一幅完整的預測出來的圖像。

    問題來了,這世上哪有那么牛的算法能計算預測得這么完美?是的,沒有。那預測還有什么用?答案是為了獲取他們的差。差值有什么用?因為差值的絕對值都很小。還是不明白?我們看下圖的三個像素值矩陣:

    是不是感覺到了差值矩陣的數據存儲的絕對值比較???數值小,理論術語上是為了使包含的信息能量變低;是為了到編碼階段,使編碼壓縮的數據量更小,從而壓縮效率更高。這就是預測的作用。

    我們有了原圖,又有了特定的預測公式算法,就不需要再去存儲第二幅至相關第N幅的像素原值,只需要存儲它們的差值就行了。如果要解碼,把數據拿來,利用公式還原后再加上差值,就可以把那些被預測的圖像的真面目恢復了。

    在一幅圖內做預測,就叫幀內預測;對一系列組圖如一段扣籃動作的視頻做運動軌跡預測,屬于幀間預測。

    拿來做基準參考的幀,叫I幀,是關鍵幀,它的信息量最大,只能做幀內壓縮,通常壓縮率很低;而那些后續通過參考I幀的信息做預測獲取差值的圖像,存儲的根本不是原像素值,而是些原始圖像的殘差,叫預測幀。預測幀有時候會混合使用幀內預測和幀間預測,取決于該區塊對那種算法更適應。

    根據前一幅圖像來預測得到本幀圖像叫P幀;結合前面的圖像和后面的圖像進行雙向預測計算得到的本幀圖像叫B幀?;谝环P鍵I幀圖像加上一系列相應的預測圖像如B幀、P幀構成的一組圖像叫GOP。

    現在該明白別人常說的I幀、B幀、P幀是什么意思了吧?I幀是圖像信息的關鍵;B幀或P幀才是主要被壓縮的地方。

    思考:為了降低視頻的網絡傳輸延遲,在CDN上的HLS視頻數據分片是不是越細越好?

    答案:不是。切片時要為每一個分片都提供至少一個I幀和一系列P幀、B幀。分得太細,I幀數量反而會變多。I幀太多,就意味著壓縮率變低,網絡傳輸量不降反升。

    變換

    事情還遠沒結束。雖然通過預測公式降低了眾多像素存儲的編碼信息量,但這還不是壓縮。于是引入了各種變換,如離散余弦變換DCT、小波變換等等。學術上,其目的是將圖像進行從空域到頻域的變化,通過這些所謂的變換濾掉高頻信息,因為人眼對高頻信息不敏感,濾掉一些也無所謂。經典的DCT公式長這樣:

    是不是又懵了?好吧,翻譯一下 ,看下面這個圖。變換公式就如同是水果分揀機器,根據某種特點如按體積大小對水果進行歸類,把個頭大的放一堆,個頭小的放一堆。經過變換,實現了物以類聚,后續如果再有需求就可以很容易地進行封箱打包的操作了。

    對圖像的變換改變了原來像素信息的空間順序,取而代之的是依據頻率和幅度的存儲方式。但此時的變換,只是改變了隊形,沒有任何實際的壓縮動作。

    拿一個8×8的圖像塊舉例,原始圖像塊的像素值如下:

    經DCT變換的結果如下圖。

    能看出點什么特征嗎?如果還不能,提醒一下:矩陣左上角的數值較大,而右下角的數值較小,且趨近于零值。這就是傳說中的頻率劃分。經過DCT變化,低頻的、幅值高的、重要的信息都被歸置在左上部;而人類不敏感的、高頻的、卻又低振幅的數據都放在了右下側。

    這又有什么好處呢?在接下來的量化步驟,就可以對右下側的數據開刀了。因此可以簡單理解,不管是什么A變換還是B變換,不要被它的公式和名稱嚇倒,它只是為了改變隊形,為后續的編碼和壓縮做準備。

    量化

    到現在為止,仍然沒有進行實質性的壓縮。萬事俱備,只欠量化。它是壓縮前的最后一道工序。量化就好比對剛才站好隊的隊員的身高進行分級打分,通過一個基準步長來計算出每個值的相對數值。又懵了吧? 如下圖:量化前左上角的值為236,步長為8,則量化后它值為236/8 = 30;量化前第二行首元素的值為-22,則量化后為-22/ 8 = -3。

    這樣一來,經過量化分級,數據開始變得簡潔明了,但精度也有損失了,損失的大小由量化的步長決定。圖像的失真就是由量化引起的。

    回顧,經過上面的DCT變換后以后,數據隊形已準備好;再經過量化,把很多高頻的右下角的數值變為0。對數值進行Z字形掃描,就變成一串數字了 。

    針對上面的變換后的值的量化結果為:

    30, 0, -3, -1, -2, -2, -1, -1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…

    為什么要進行Z字形掃描,因為可以更方便地把0 都聚在一起;為什么0 都會排在右下角?因為經過了DCT變換改變了隊形。 為什么把0聚在一起?為了編碼壓縮??!

    熵編碼

    壓縮的第一道工序叫行程編碼。什么是行程編碼?忘掉這個名詞,就是把連續重復的數據的用重復的次數值來表示??蠢?,一個原始串:

    aaaaaaabbbbccccdddeeddaa

    對這個原始串進行行程編碼后,把重復的字母用一個重復的數字來代替,變成了這樣:

    7a4b4c3d2e2d2a

    這就是行程編碼的思想。行程編碼思想雖然簡單但用處很大,在PNG,GZIP等各種壓縮算法里都有它的影子。

    這還不算完,只是壓縮的一小步,第二步就是要對行程編碼后的數據進行變長編碼,如Huffman編碼,這才是壓縮的重頭戲。Huffman編碼主要思路是將出現頻率最高的字符串用最短的碼來替換,從整體上減少了原始數據的長度。網上的討論極多,這里不再詳述,感興趣的也可見我的文章《圖解DEFLATE編解碼》。

    編解碼總結

    再梳理一下視頻編碼的核心步驟:

    ? 先做幀內預測和幀間預測,根據關鍵幀來獲取每幅圖像的差值,從而減少存儲的編碼信息量;

    ? 對其進行變換,完成隊形調整;

    ? 對數據進行有損量化,將不重要的數據歸零;

    ? 對量化數據進行特定方向的掃描,將二維數據轉為一維數據;

    ? 最后進行壓縮,即先進行行程編碼,再使用壓縮編碼。

    解碼的步驟只是反其道而行之。

    絕大部分的視頻編解碼標準都無一例外地包含這些目標。當然有些標準還考慮了環路濾波,但它不是必選項,這里不做解釋。

    編解碼的標準

    各大標準之間有什么區別?有了上面的基礎理解后,就比較好解釋了。不同的標準,有的只用了變換,有的用了預測加變換的混合編碼;或者幀內預測算法不一樣,預測方向不一樣,有的支持4個方向,有的支持8個方向;或者變換的算法不一樣,如有的是DCT變換,有的是小波變換;或者熵編碼算法也不一樣,有的是Huffman編碼,有的是算術編碼;等等等等……

    具體一點如H.263及之前的編碼標準,會對幀內編碼塊直接進行變換,到了H.264,它提供了基于9種方向的幀內預測;再如到了HEVC / H.265, 采用了基于四叉樹的分塊方式;對于幀間預測提供了8種預測單元的劃分類型,除了支持離散余弦變換DCT,還首次使用了離散正弦變換DST,更有效地實現了對殘差矩陣的變換。

    越是最近新出的編碼標準,算法越先進,也越復雜。

    最后

    以上就是視頻編解碼的基本原理,希望讀了以后能大體明白視頻編解碼原理的基本思路。但如果真想對視頻編解碼的標準和算法細節做深入了解,那就真得要下苦功夫了。文中每個主題,都可以寫出幾本書來。請有理想有毅力的同學繼續前行,祝一切順利!

    編輯:hfy

    收藏 人收藏
    分享:

    評論

    相關推薦

    VCU視頻編解碼設計案例介紹

    VCU 模塊在PL側,一共有五個AXI接口,它們分別是兩個 Encoder AXI,兩個 Decod....
    的頭像 電子設計 發表于 11-30 14:18 ? 270次 閱讀
    VCU視頻編解碼設計案例介紹

    視頻會議的昨天,今天和明天

    在聊視頻會議之前,我們先簡單理解一下視頻會議,視頻會議技術涵蓋了非常多的音視頻技術方向,包括音視頻編....
    的頭像 LiveVideoStack 發表于 08-11 09:46 ? 614次 閱讀
    視頻會議的昨天,今天和明天

    多路視頻記錄/存儲模塊解決方案

    多路視頻記錄/存儲模塊解決方案 1.LAN接口:1Gbps,通過RTP協議進行編碼后碼流的輸出; 2.SDI輸入接口*8:1080P@30...
    發表于 04-17 12:02 ? 938次 閱讀
    多路視頻記錄/存儲模塊解決方案

    全志新推4K視頻編解碼處理芯片

    全志V316芯片是全志科技針對運動相機類產品推出的4K視頻編解碼處理芯片,超強規格,高性價比,基于V....
    的頭像 全志科技 發表于 04-12 17:15 ? 6442次 閱讀
    全志新推4K視頻編解碼處理芯片

    H.264視頻編解碼FPGA超低延遲解決方案

    具體特點為:1.支持各種分辨率;2.支持各種幀率;3.編解碼延遲低于60ms;4.占用FPGA資源小....
    發表于 05-24 11:45 ? 937次 閱讀
    H.264視頻編解碼FPGA超低延遲解決方案

    視頻編解碼應用 視頻處理中的fpga應用

    視頻處理是目前多媒體領域最熱門的技術,主要分為視頻編解碼和目標信息識別兩大類。前者為了節省視頻數據的....
    發表于 04-09 15:04 ? 2916次 閱讀
    視頻編解碼應用 視頻處理中的fpga應用

    FFMPEG視頻編解碼流程 H.264硬件編解碼實現

    本文闡述了基于FFMpeg的 H.264視頻 硬件編解碼在 S3C6410 處理器上的實現方法,為數....
    發表于 04-03 11:28 ? 10204次 閱讀
    FFMPEG視頻編解碼流程 H.264硬件編解碼實現

    動態IP的Internet視頻監控解決方案

    伴隨著計算機及網絡技術的飛速發展,尤其視頻編解碼技術的日益成熟、計算機處理能力的快速提高、以及寬帶的....
    發表于 03-13 12:40 ? 622次 閱讀
    動態IP的Internet視頻監控解決方案

    HEVC的基礎說明與配置應用教程

    HEVC,即H.265,是現行的先進視頻編解碼標準H.264/MPEG-4 AVC的后繼與發展。由I....
    發表于 11-17 12:47 ? 6436次 閱讀
    HEVC的基礎說明與配置應用教程

    嵌入式Linux的PMP系統軟硬件設計解析

    便攜式多媒體播放器(PMP),也就是通常人們所說的MP4,已成為繼MP3以后消費類產品的一個新熱點。....
    發表于 11-01 11:40 ? 343次 閱讀
    嵌入式Linux的PMP系統軟硬件設計解析

    基于DSP的H.324終端設計方案探究

    目前在H.324系統的研制和開發中,普遍采用了兩種方式:一種是開發純軟件的H.324系統,即基于PC....
    發表于 10-24 15:33 ? 359次 閱讀
    基于DSP的H.324終端設計方案探究

    DSP視頻編解碼系統設計方案

    隨著數字多媒體的應用日漸廣泛,視頻解碼 在嵌入式系統設計中變成一個基本要素。視頻標準有多種,依賴于產....
    發表于 10-23 15:08 ? 346次 閱讀
    DSP視頻編解碼系統設計方案

    DSP視頻編解碼器系統設計

    隨著數字多媒體的應用日漸廣泛,視頻解碼 在嵌入式系統設計中變成一個基本要素。視頻標準有多種,依賴于產....
    發表于 10-23 10:45 ? 376次 閱讀
    DSP視頻編解碼器系統設計

    ADSP-21535實現MPEG-4視頻編解碼軟硬件設計方案解析

    數字視頻的大數據量給信息的存儲和傳輸造成了相當大的困難,成為數字視頻應用的瓶頸之一,數字視頻壓縮編碼....
    發表于 10-21 10:47 ? 313次 閱讀
    ADSP-21535實現MPEG-4視頻編解碼軟硬件設計方案解析

    MPEG-4視頻編解碼實現方案解析

    數字視頻的大數據量給信息的存儲和傳輸造成了相當大的困難,成為數字視頻應用的瓶頸之一,數字視頻壓縮編碼....
    發表于 10-21 10:26 ? 316次 閱讀
    MPEG-4視頻編解碼實現方案解析

    DSP視頻編解碼系統詳細解析

    隨著數字多媒體的應用日漸廣泛,視頻解碼 在嵌入式系統設計中變成一個基本要素。視頻標準有多種,依賴于產....
    發表于 10-21 09:50 ? 1411次 閱讀
    DSP視頻編解碼系統詳細解析

    TMS320C6678視頻編解碼實現

    TI 提供了包含有綜合而全面的視頻、音頻和語音編解碼組合的全新多媒體解決方案。TMS320C6678....
    發表于 01-20 15:52 ? 890次 閱讀
    TMS320C6678視頻編解碼實現

    廣播電視先進視頻編解碼(AVS+)技術應用實施指南

    發表于 06-05 09:48 ? 418次 閱讀
    廣播電視先進視頻編解碼(AVS+)技術應用實施指南

    H.264視頻編解碼SoC滿足高清DVR設計需求

    硬盤錄像機(DVR)作為監控系統的核心部件之一,在10年里高速發展,從模擬磁帶機的替代品演變成具有自....
    發表于 07-06 11:10 ? 731次 閱讀
    H.264視頻編解碼SoC滿足高清DVR設計需求
    日韩欧美亚洲一区SWAG
  • <dd id="kgqm6"></dd>
  • <menu id="kgqm6"><tr id="kgqm6"></tr></menu>