最近在研究Windows下x264编码h264,在网上找了一些,发现很多程序不全,或者在Linux平台下的程序,于是从网上找了一些代码,修改了一下,适合在Windows下利用VS2012编译运行。
首先从x264的官网下载x264的源代码,http://www.videolan.org/developers/x264.html,里面有源代码以及Windows下生成好的lib库文件、x264头文件以及一些必备的dll文件。
然后配置VS2012的库目录路径以及头文件的包含目录路径,然后再添加附加依赖项,如下图:
x264编码源程序如下:
/*********************************************************************** *作者:HJL *编写日期:2015.7.16 *效果:x264软件编码,将输入的yuv视频文件编码为h264视频文件 *程序中要设置2处: *1.设置视频的宽高 *2.设置待转码yuv视频的路径 ************************************************************************/ #include <iostream> #include <string> #include "stdint.h" //#include <time.h> extern "C" { #include "x264.h" #include "x264_config.h" }; int main(int argc, char** argv) { /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// //设置视频的宽度、高度 int width = 480; int height = 272; /////////////////////////////////////////////////////////// int fps = 25;//设置帧率 size_t yuv_size = width * height * 3 / 2; x264_t *encoder; x264_picture_t pic_in, pic_out; uint8_t *yuv_buffer; x264_param_t param; x264_param_default_preset(¶m, "veryfast", "zerolatency"); param.i_threads = 1; param.i_width = width; param.i_height = height; param.i_fps_num = fps;//视频数据帧率 param.i_fps_den = 1; param.i_keyint_max = 25; param.b_intra_refresh = 1; param.b_annexb = 1; x264_param_apply_profile(¶m, "baseline"); encoder = x264_encoder_open(¶m); x264_picture_alloc(&pic_in, X264_CSP_I420, width, height); yuv_buffer =(uint8_t*) malloc(yuv_size); pic_in.img.plane[0] = yuv_buffer; pic_in.img.plane[1] = pic_in.img.plane[0] + width * height; pic_in.img.plane[2] = pic_in.img.plane[1] + width * height / 4; int64_t i_pts = 0; x264_nal_t *nals; int nnal; ///////////////////////////////////////////////////////////////////////////// //读取yuv视频文件,即待转码yuv文件 FILE *inf=fopen("ds_480x272.yuv","rb"); //* 创建文件,用于存储编码数据 FILE *outf=fopen("test.h264","ab"); if(NULL==inf) { return -1; } while (fread(yuv_buffer, 1, yuv_size,inf) > 0) { pic_in.i_pts = i_pts++; x264_encoder_encode(encoder, &nals, &nnal, &pic_in, &pic_out); x264_nal_t *nal; for (nal = nals; nal < nals + nnal; nal++) { fwrite( nal->p_payload, 1, nal->i_payload,outf);//写h264 } } x264_encoder_close(encoder); fclose(inf); fclose(outf); free(yuv_buffer); return 0; } </span>
整体VS2012的工程可以在这里下载。
最后效果如下:
原始yuv视频:
编码后的h264视频如下:
yuv、h264视频播放器可以在这里下载。
参考文章:http://www.cnblogs.com/fojian/archive/2012/09/01/2666627.html#2571019