#include<stdio.h> #include<stdlib.h> #include<string.h> #include<x265.h> #pragma comment(lib,"libx265.lib") int main(){ FILE*f_src=NULL; FILE*f_des=NULL; const char*filename_src="I:\\Video\\1080p.yuv"; const char*filename_des="I:\\Video\\1080p.265"; int width=352; int height=288; int fps=25; f_src=fopen(filename_src,"rb"); f_des=fopen(filename_des,"wb"); if(f_src==NULL||f_des==NULL){ return 0; } int buffsize=width*height*3/2; char*buff_src=(char*)malloc(buffsize); //配置x265参数 x265_param* param=x265_param_alloc(); x265_param_default(param); param->bRepeatHeaders=1;//每个关键帧前写sps,pps // param->internalCsp=X265_CSP_I420;//默认I420,不写没事 param->sourceWidth=width; param->sourceHeight=height; param->fpsNum=fps; param->fpsDenom=1; //初始化编码器 x265_encoder* hx265=x265_encoder_open(param); if(hx265==NULL){ printf("x265_encoder_open err\n"); return 0; } //设置YUV参数 x265_picture *pic_in = x265_picture_alloc(); x265_picture_init(param,pic_in); //YUV对应开始位置 pic_in->planes[0]=buff_src; pic_in->planes[1]=buff_src+width*height; pic_in->planes[2]=buff_src+width*height*5/4; //YUV每行数据 pic_in->stride[0]=width; pic_in->stride[1]=width/2; pic_in->stride[2]=width/2; int ret; x265_nal*pp_nal=NULL; uint32_t pi_nal=0; //循环读数据并编码 while (fread(buff_src,1,buffsize,f_src)==buffsize){ ret=x265_encoder_encode(hx265,&pp_nal,&pi_nal,pic_in,NULL); for(int j=0;j<pi_nal;j++){ fwrite(pp_nal[j].payload,1,pp_nal[j].sizeBytes,f_des); } } //剩余写出来 while(ret=x265_encoder_encode(hx265,&pp_nal,&pi_nal,NULL,NULL)){ for(int j=0;j<pi_nal;j++){ fwrite(pp_nal[j].payload,1,pp_nal[j].sizeBytes,f_des); } } fclose(f_src); fclose(f_des); free(buff_src); x265_encoder_close(hx265); x265_picture_free(pic_in); system("PAUSE"); return 0; }
源码上传到csdn 有需要的可以下载