x264使用示例

2021-07-09 05:04:33 字數 3776 閱讀 6458

/**

* @note x264的編碼示例.

* 使用x264的版本為libx264-115

* 1. 示例是個死迴圈,會源源不斷的編碼,然後將資料寫檔案.

* 2. 示例的行為是:編碼1000幀後,取空編碼緩衝區,然後迴圈執行這兩步.

* @author 戈

*/#include

#include

#include

#include "stdint.h"

extern "c"

;unsigned int g_uiptsfactor = 0;

int inal   = 0;

x264_nal_t* pnals = null;

int encode(x264_t* p264, x264_picture_t* pin, x264_picture_t* pout);

int main(int argc, char** argv)

}//* 獲取允許快取的最大幀數.

int imaxframes = x264_encoder_maximum_delayed_frames(px264handle);

//* 編碼需要的引數.

inal = 0;

pnals = null;

x264_picture_t* ppicin = new x264_picture_t;

x264_picture_t* ppicout = new x264_picture_t;

x264_picture_init(ppicout);

x264_picture_alloc(ppicin, x264_csp_i420, px264param->i_width, px264param->i_height);

ppicin->img.i_csp = x264_csp_i420;

ppicin->img.i_plane = 3;

//* 建立檔案,用於儲存編碼資料

file* pfile = fopen("agnt.264", "wb");

assert(pfile);

//* 示例用編碼資料.

int idatalen = px264param->i_width * px264param->i_height;

uint8_t* data = new uint8_t[idatalen];

unsigned int  uicomponent = 0;

while (++uicomponent)

else

} */}}

//* 將編碼資料寫入檔案.

for (int i = 0; i < inal; ++i)

}//* 清除影象區域

x264_picture_clean(ppicin);

x264_picture_clean(ppicout);

//* 關閉編碼器控制代碼

x264_encoder_close(px264handle);

px264handle = null;

delete ppicin ;

ppicin = null;

delete ppicout;

ppicout = null;

delete px264param;

px264param = null;

delete data;

data = null;

return 0;

}int encode(x264_t* px264handle, x264_picture_t* ppicin, x264_picture_t* ppicout)

//* }} */

//* 獲取x264中緩衝幀數.

int iframes = x264_encoder_delayed_frames(px264handle);

std::cout<

《x264編碼h264》

前言,所以這裡不再敘述,其實我個人覺得windows下編譯這個庫沒有意義,只是浪費時間,因為即使在windows下編譯出來可以使用的庫,依然是不能跟進庫裡面看程式的執行的(也可能是我水平不夠,沒有發現此方法,但是依然我部落格中的那種方法是不能跟進程式內部的)。倘若能在網上直接找到乙個編譯好的庫拿來直接使用則是最好的,所以我將我的編譯好的庫上傳到我的github,需要的請戳這裡

(裡面還包含已經編譯好的ffmpeg庫)。

h264基本知識

首先,我們必須知道h264支援三種不同的檔次:

這三種不同的檔次導致其在編碼過程中使用的編碼的功能的差異,具體來說如下:

上面提到的i,p,b,sp,si定義如下:乙個編碼影象通常劃分成若干巨集塊組成,乙個巨集塊由乙個16×16 亮度畫素和附加的乙個8×8 cb和乙個8×8 cr 彩色畫素塊組成。每個圖象中,若干巨集塊被排列成片的形式。

i 片只包含i 巨集塊,p 片可包含p 和i 巨集塊,而b 片可包含b 和i 巨集塊。

i 巨集塊利用從當前片中已解碼的畫素作為參考進行幀內**(不能取其它片中的已解碼畫素作為參考進行幀內**)。

p 巨集塊利用前面已編碼圖象作為參考圖象進行幀內**,乙個幀內編碼的巨集塊可進一步作巨集塊的分割:即16×16、16×8、8×16 或8×8 亮度畫素塊(以及附帶的彩色畫素);如果選了8×8 的子巨集塊,則可再分成各種子巨集塊的分割,其尺寸為8×8、8×4、4×8 或4×4 亮度畫素塊(以及附帶的彩色畫素)。

b 巨集塊則利用雙向的參考圖象(當前和未來的已編碼圖象幀)進行幀內**。

然後,我們要了解h264編碼的資料格式:

首先,我們必須知道h264編碼輸入的為yuv420格式的影象(關於yuv420,請戳這裡

)。如果為rgb32的影象,我們必須首先轉換為yuv420格式。

圖1,nal單元序列結構示意圖

其中nal header為0x0000 00 01或者0x00 00 01.

知道這些基本上我們就可以開始使用x264進行h264編碼了.

至於怎樣用vs建立工程以及包含庫檔案我在這裡就不說了,搜尋之後一大堆。下面主要講述下使用這個庫的編碼過程。主要的步驟都在注釋中說明

[cpp]view plain

copy

intmain(

intargc, 

char

** argv)  

//得到檔案總得幀數

intnframes = ::get_frame_total_y4m((hnd_t*)y4m_hnd);  

//開始編碼

for(

inti = 0; i 

}  }  //* 清除影象區域

x264_picture_clean(ppicin);  

//* 關閉編碼器控制代碼

x264_encoder_close(px264handle);  

px264handle = null;  

delete

ppicin ;  

ppicin = null;  

delete

ppicout;  

ppicout = null;  

delete

px264param;  

px264param = null;  

return

0;  

}  

關於其中用到的benchmark.y4m與y4m.h的檔案,請戳

這裡

編譯安裝x264

網上也有相應的教程,之所以在這裡重申一遍,是因為我試了網上很多的編譯方法,都出現了問題,為此將此編譯安裝方法記錄下來。首先是 獲取x264 的 git clone git linux 下最簡單編譯步驟 1.切換至源 目錄 2.輸入 configure enable shared enable sta...

X264閱讀筆記1

264 閱讀筆記,版本是20060309。一 函式入口main x264.c 1 呼叫x264 param default 設定預設的編碼引數。2 呼叫parse 轉換 命令列引數 3 進入encode函式,開始編碼 二 encode x264.c 1 p get frame total獲取要編的總...

x264編譯問題合集

1 x264路徑帶空格 錯誤 正在執行自定義生成步驟 nasm error more than one input file specified type nasm h for help project error prj0019 工具從 正在執行自定義生成步驟 特徵 nasm出現錯誤 原因 你的x...