/**
* @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...