1. 程式人生 > >H264和x264簡單介紹

H264和x264簡單介紹

1. 前言

本文分析了 H.264 視訊編碼器的原理,對當今流行的 H.264編碼器進行了比較,以 X264 開源編碼器為例進行了原始碼級的分析,詳細介紹了 X264 中的主要資料結構和函式呼叫關係。本文的分析能使使用者對 H.264 視訊編碼原理有更深入的認識,併為自己的應用設計獨特的視訊編碼器,提高視訊編碼效能。

2. H.264 編碼器原理

2.1 H.264編碼器的功能結構

如下圖所示,H.264 標準壓縮系統由視訊編碼層(Video Coding Layer,VCL)和網路提取層(Network Abstraction Layer,NAL)兩部分組成。VCL 層主要包括幀內預測,幀間預測、變換量化、熵編碼等壓縮單元。NAL 層則用於為 VCL 層提供一個與網路無關的統一介面,它負責對視訊資料進行封裝打包後使其在網路中傳送,它採用統一的資料格式,包括單個位元組的包頭資訊、多個位元組的視訊資料與組幀、邏輯通道信令、定時資訊、序列結束訊號等。包頭中包含儲存標誌和型別標誌。儲存標誌用於指示當前資料不屬於被參考的幀。型別標誌用於指示影象資料的型別。VCL 可以傳輸按當前的網路情況調整的編碼引數。


2.2 H.264 編碼器工作流程

如下圖所示,編碼器採用的是變換和預測的混合編碼法。輸入的幀或場 Fn 以巨集塊為單位被編碼器處理。首先,按幀內或幀間預測編碼的方法進行處理。若採用幀內預測編碼,其預測值 PRED 是由當前片中當前塊的左側和上側已編碼的象素點推出的,而如果採用幀間預測編碼,其預測值 PRED 是由已編碼的視訊幀/場通過運動補償得到的。預測值 PRED 和當前塊相減後,產生一個殘差塊 Dn,經變換,量化後產生的變化係數 X 再經熵編碼,與解碼需要資訊一起組成一個壓縮碼流, 經NAL 供傳輸和儲存用。 為進一步提供預測用的參考影象,編碼器還需要有重建影象的功能。 即將殘差影象經反量化, 反變換後得到 Dn′與預測值PRED相加,得到 uFn′,經過濾波後得到 Fn′即為重建影象,可用於參考影象。


3. X264 開源編碼器分析

3.1 三大開源編碼器

目前 H.264的開源編碼器主要有三類:JM,T264和 X264。JM 作為 H.264 的官方測試原始碼,由德國 hhi 研究所負責開發。它實現了 264 所有的特性,但其程式結構冗長,只考慮引入各種新特性以提高編碼效能,忽視了編碼複雜度,其編碼複雜度極高,不宜實用。T264是中國視訊編碼自由組織聯合開發的H.264編解碼器, 編碼器能編碼輸出標準的H.264碼流,但解碼器只能解 T264 編碼器生成的碼流,目前已經停止更新。X264 是網上自由組織聯合開發的相容 264 標準碼流的編碼器,它注重實用,和 JM 相比,在不明顯降低編碼效能的前提下,努力降低編碼的計算複雜度,編碼效率很高。

3.2 X264流程

因為 X264 編碼器的高效率和高效能,應用之中較多使用,下面對 X264 進行原始碼分析,進一步分析 H.264 的編碼器原理。

在 X264 編碼器的排程中最重要的是 Encode 函式,是對整個視訊序列的 H.264 編碼。在函式中,首先進行了函式的初始化操作,然後判斷是否已經編碼完畢,如果沒有則繼續讀取一幀資料到緩衝區,然後進行幀解碼;如果編碼完畢則退出編碼流程。詳細函式關係如下圖所示:


其中,x264_encoder_open()這個函式是對不正確的引數進行修改,並對各結構體引數和cabac 編碼,預測等需要的引數進行初始化。x264_picture_alloc()這個函式分配能容納一幀sizeof(x264_picture_t)位元組數的空間,然後進行初始化。p_read_frame()這個函式就是一次讀入一幀到剛分配的空間,這裡的資料都是原始的視訊影象資料。Encode_frame()這個函式對視訊序列其中一幀進行 264 編碼。x264_picture_clean()和 x264_encoder_close()兩個函式主要是編碼後的處理工作,如將幀資料全置零等。

在 Encode_frame() 函式中開始上文提到的 VCL 編碼和 NAL 編碼,其中x264_encoder_encode()函式為 VCL 層編碼, 其詳細流程如下圖所示。 其中, Setup new frame from picture 主要是將圖片的原始資料賦值給一個未使用的幀,用於編碼。Get frame to be encoded 主要是幀管理的操作,從編碼幀的快取中取出一幀來對他進行編碼。Setup frame context 主要是對即將編碼幀進行幀型別的預設定。 Init ,Write the bitstream主要是對參考列表的初始化,片頭的初始化,以及對將編碼後資料寫入位元流進行傳輸。Update encoder state這部分是一幀編碼後的編碼器的更新處理部分,主要有參考幀的管理,去塊濾波,象素內插等工作。Compute/Print statistics這部分並不屬於編碼的工作,只是對其中編碼效能的統計計算和顯示工作。


x264_slice_write()函式是編碼中最重要的函式,以上所介紹的預測編碼等都在這個函式中實現的。Init()函式主要是初始化的一些操作。x264_macroblock_cache_load()函式主要是把當前巨集塊的 up 巨集塊和 left 巨集塊的預測模式,非零係數值等資料載入進來,放到一個數組裡面,供當前模組參考使用。 x264_macroblock_analyse()函式主要是模式選擇的問題,通過對SAD 值或者其他 COST 值的分析,確定當前巨集塊的編碼型別。以 I 幀模組為例,我們可以將它分割成16個4*4的塊,如果這16個塊的sad加起來小於按16*16的方式計算出來的sad值,我們就將這個 16*16 的塊分成 16 個 4*4 的塊進行編碼,否則採用 16*16 的方式編碼。x264_macroblock_encode()函式即是依據上面所確定的編碼模式對當前巨集塊進行 264 編碼。CABAC/CAVLC 部分為熵編碼部分。


3.3 預測編碼演算法

幀內預測編碼的預測值 P 是在一定的預測模式下,通過鄰近已編碼的象素值推出的。H.264 中的幀內預測分為 4×4 子塊和 16×16 子塊以及對 8x8 子塊的預測模式。在 x264 程式碼中,幀內預測模式的演算法主要在 predict.c 中。其中亮度象素有三種方式:16x16 巨集塊預測模式,8x8 子塊預測模式,4x4 子塊預測模式;色度象素有隻有 8x8 色度預測模式。 幀間預測編碼主要包括運動估計,運動補償等,其中運動估計尤為重要。在 x264 中幀間運動估計有三種演算法可供選擇 X264_ME_DIA,X264_ME_HEX,X264_ME_ESA。

X264_ME_ESA::全搜尋法,也稱為窮盡搜尋法,是對搜尋範圍內所有可能的候選位置計算 SAD(i,j)值,從中找出最小 SAD(絕對差值和),其對應偏移量即為所求運動向量。此演算法雖計算量大,但最簡單、可靠,找到的必為全域性最優點。

X264_ME_DIA::菱形搜尋,搜尋模板的形狀和大小不但影響整個演算法的執行速度,而且也影響它的效能。塊匹配的誤差實際上是在搜尋範圍內建立了誤差表面函式,全域性最小點即對應著最佳運動向量。基於這兩點事實,菱形演算法採用了兩種搜尋模板,分別是有 9個檢測點的大模板 LDSP(Large Diamond Search Pattern)和有 5 個檢測點的小模板SDSP(SmallDiamond Search Pattern),搜尋時先用大模板計算,當最小塊誤差 MBD點出現在中心點處時,將大模板 LDSP 換為 SDSP,再進行匹配計算,這時 5 個點中的 MBD 即為最優匹配點。

X264_ME_HEX::六邊形搜尋,與菱形搜尋相似,只是搜尋形狀為六邊形。




相關推薦

H264x264簡單介紹

1. 前言 本文分析了 H.264 視訊編碼器的原理,對當今流行的 H.264編碼器進行了比較,以 X264 開源編碼器為例進行了原始碼級的分析,詳細介紹了 X264 中的主要資料結構和函式呼叫關係。本文的分析能使使用者對 H.264 視訊編碼原理有更深入的認識,併為自

LDAP服務器的概念原理簡單介紹

SM wrap add PE tle 多個 ural pager alc 1. 目錄服務 目錄是一個為查詢、瀏覽和搜索而優化的專業分布式數據庫,它呈樹狀結構組織數據,就好象Linux/Unix系統中的文件目錄一樣。目錄數據庫和關系

3htmlcss簡單介紹

html和css簡單的介紹 1. base標籤 網頁中的所有連結的基礎連結,base標籤裡面的連結會影響頁面中的所有的連結,除非連結設定了協議。 2. form表單 作用:登陸或者註冊,上傳,輸入使用者名稱和密碼。 2.1 form標籤中的常見的屬性 action

Django入門系列之(Django簡介rom簡單介紹)

1 django中app的概念: 大學:----------------- 專案 資訊學院 ----------app01 物理學院-----------app02 ****強調***:建立了app,要在配置檔案中註冊 ...2 模板路徑配置: 1 templates資料夾 2 settings裡註冊一下 3

面試系列:常見的容器listmap簡單介紹

Android 列表資料結構一般常用兩種ArrayList和LinkedList 兩種列表結構主要是根據不同的需求選用。 ArrayList的底層是陣列結構,多用於查詢。這應該也是我們最長使用的資料結構了,因為android中的列表展示資料過於多,配合ListView和R

開源許可協議,開源許可證GPL、BSD、MIT、Mozilla、ApacheLGPL簡單介紹

文章來源: 《開源時代》2010.02 第十七期 借鑑博文: 當Adobe、Microsoft、Sun等一系列巨頭開始表現出對”開源”的青睞時,”開源”的時代即將到來!現今存在的開源協議很多,而經過Open Source Initiative組

Java NIO介紹(二)————無堵塞ioSelector簡單介紹

無堵塞IO介紹 既然NIO相比於原來的IO在讀取速度上其實並沒有太大區別(因為NIO出來後,IO的低層已經以NIO為基礎重新實現了),那麼NIO的優點是什麼呢? NIO是一種同步非阻塞的I/O模型,也是I/O多路複用的基礎,而且已經被越來越多地應用到大型應用伺服器,成為解決

獲得客戶端IP地址IPV6簡單介紹

今天查詢資料庫的表資料時發現有些儲存的IP地址是 ::1,查看了一下原始程式碼是使用Request . ServerVariables [ "REMOTE_ADDR" ]獲得的客戶端IP地址,::1是使用IP v6 的地址格式表示的是回送地址,即本機地址(127.0.0.1)

h264x264的區別

H.264: H.264是ITU(International Telecommunication Unite 國際通訊聯盟)和MPEG(Motion Picture Experts Group 運動影象專家組)聯合制定的視訊編碼標準。 在ITU的標準裡稱為H.264,

Android 加密 MD5Base64簡單介紹

今天瞭解了下加密,因為我的賬號系統的密碼是沒有進行加密的,是將密碼,使用者名稱等資訊作為post引數傳遞的。 MD5加密 先看下MD5加密,網上搜索到了很多方法,我挑一個簡單的方法先展示出來,以後有興趣再深入學習。轉載自:http://blog.csdn.net/rand

qt-qml移動開發之在ios上開發部署app流程簡單介紹

mod target auto 100% rda 自己 color ans ora qt5.3已經全面支持移動開發,除了mac,windows,linux。還支持ios,android,wp,meego等移動平臺,本教程是作者依據自己的經驗,從頭講怎麽樣在ios上公布

Furure的簡單介紹使用

bpa cfb idm fat pwm actions ddl effect knn 引子: 上圖是兩個系統交互的情況,現在我想將對外系統的調用做成異步實現,那麽就需要考慮兩個問題: 主線程可以得到異步線程的結果,在得到結果之後再進行operation-4 ?主線程如何得

TextInputLayout TextInputEditText 的簡單介紹以及使用

watcher 信息 cal line led retext name sign 控件 TextInputLayout 和 TextInputEditText 是屬於 design 包裏面的控件 吶,就是這個:compile ‘com.android.support:des

一致性Hash簡單介紹使用

mes red second count main ace 背景 -- file 背景: 一致性Hash用於分布式緩存系統,將Key值映射到詳細機器Ip上,而且添加和刪除1臺機器的數據移動量較小,對現網影響較小 實現: 1 Hash環:將節點

SpringMvcservlet簡單對比介紹

標簽 word div ron -name ride path eight edi 引言:由於最近要開始springMVC的學習,所以現在先簡單介紹一下springMVC,自己也是一個初學者,所以也有很多不懂,主要是以討論為主。 一、servlet實現登錄。 咱們先來看

Android界面坐標圖示Rect(矩形)簡單介紹

log sof rac android界面 ng- 矩形 blog 介紹 trac Android界面的坐標是以左上角為起始點。平行的為X軸,垂直的為Y軸,數值都是遞增的。例如以下圖所看到的: Android的Rect類是形成一個矩形的區域。區域

SerializableParcelable的簡單介紹

重新 出現 ray listen android lee long tag cti   Serializable和Pacelable接口可以完成對象的序列化過程,當我們需要通過Intent和Binder傳輸數據時就需要使用Parcelable或者Serializable。

Java靜態檢測工具/Java代碼規範質量檢查簡單介紹(轉)

pub 詳細 職責 web 循環 問題: 集成 死鎖 參考 靜態檢查: 靜態測試包括代碼檢查、靜態結構分析、代碼質量度量等。它可以由人工進行,充分發揮人的邏輯思維優勢,也可以借助軟件工具自動進行。代碼檢查代碼檢查包括代碼走查、桌面檢查、代碼審查等,主要檢查代碼和設計的一致

幾個常用規則引擎的簡單介紹演示

規則引擎 drools ilog odm Ilog JRules 是最有名的商用BRMS;Drools 是最活躍的開源規則引擎;Jess 是Clips的java實現,就如JRuby之於Ruby,是AI系的代表;Visual Rules(旗正規則引擎)國內商業規則引擎品牌。今天對比了一下這四個頗

TypeScript的簡單介紹win環境安裝

type -- 編程 語言 targe body 本質 基於 版本 TypeScript是一種由微軟開發的自由和開源的編程語言。它是JavaScript的一個超集,而且本質上向這個語言添加了可選的靜態類型和基於類的面向對象編程。特點是一門強類型語言. 安裝: 1 首先我