static int Encode( x264_param_t *param, cli_opt_t *opt )
{
x264_t *h; //定义一个结构体的指针
x264_picture_t pic; //这是一个结构体的对象,所以已经分配了内存空间,不用再动态分配了,本结构体里有一个数组,是用来存图像的,但它只是存的指针,所以后面还得分配实际存图像的内存,然后用这个数组记下这块内存的地址
int i_frame, i_frame_total; //x264_param_t结构的字段里也有个i_frame_total字段,默认值为0
int64_t i_start, i_end; //从i_start开始编码,直到i_end结束
/* i_start = x264_mdate(); i_end = x264_mdate(); */
int64_t i_file; //好像是计数编码过的长度的
int i_frame_size; //后面有一句,是用编码一帧的返回值赋值的
int i_progress; //记录进度
i_frame_total = p_get_frame_total( opt->hin ); /* 得到输入文件的总帧数 由于p_get_frame_total = get_frame_total_yuv(见Parse()函数),所以调用函数int get_frame_total_yuv( hnd_t handle ),在文件muxers.c中*/
i_frame_total -= opt->i_seek; /* 要编码的总帧数= 源文件总帧数-开始帧(不一定从第1帧开始编码) */
if( ( i_frame_total == 0 || param->i_frame_total < i_frame_total ) && param->i_frame_total > 0 ) /* 对这个待编码的总帧数进行一些判断 */
i_frame_total = param->i_frame_total; /* 保证i_frame_total是有效的 */
param->i_frame_total = i_frame_total; /* 获取要求编码的帧数param->i_frame_total 根据命令行输入参数计算得到的总帧数,存进结构体的字段*/
if( ( h = x264_encoder_open( param ) ) == NULL ) /* 在文件encoder.c中,创建编码器,并对不正确的264_t结构体(h的类型是264_t * )参数进行修改,并对各结构体参数、编码、预测等需要的参数进行初始化 */
{
fprintf( stderr, "x264 [error]: x264_encoder_open failed\n" ); /* 打印错误信息 */
p_close_infile( opt->hin ); /* 关闭输入文件 */
p_close_outfile( opt->hout ); /* 关闭输出文件 */
return -1; /* 程序结束 */
}
if( p_set_outfile_param( opt->hout, param ) ) /* 设置输出文件格式 */
{
fprintf( stderr, "x264 [error]: can't set outfile param\n" );//输出:不能设置输出文件参数
p_close_infile( opt->hin ); /* 关闭YUV文件 关闭输入文件 */
p_close_outfile( opt->hout ); /* 关闭码流文件 关闭输出文件 */
return -1;
}
/* 创建一帧图像空间 Create a new pic (这个图像分配好的内存首地址等填充到了pic结构)*/
x264_picture_alloc( &pic, X264_CSP_I420, param->i_width, param->i_height ); /* #define X264_CSP_I420 0x0001 /* yuv 4:2:0 planar */
i_start = x264_mdate(); /* 返回当前日期,开始和结束时间求差,可以计算总的耗时和每秒的效率 return the current date in microsecond */
/* (循环编码每一帧) Encode frames */
for( i_frame = 0, i_file = 0, i_progress = 0; b_ctrl_c == 0 && (i_frame < i_frame_total || i_frame_total == 0); )
{
if( p_read_frame( &pic, opt->hin, i_frame + opt->i_seek ) )/*读取一帧,并把这帧设为prev; 读入第i_frame帧,从起始帧算,而不是视频的第0帧 */
break;
pic.i_pts = (int64_t)i_frame * param->i_fps_den; //字段:I_pts :program time stamp 程序时间戳,指示这幅画面编码的时间戳
//帧率*帧数,好像也能算出时间戳来
printf("\npic.i_pts=%d; \n",pic.i_pts);//zjh
printf("\npic.i_pts=%d; i_frame=%d; param->i_fps_den=%d; \n",pic.i_pts,i_frame,param->i_fps_den);//zjh
if( opt->qpfile )//这儿可能是一个什么设置,或许是存在一个配置文件
parse_qpfile( opt, &pic, i_frame + opt->i_seek );//parse_qpfile() 为从指定的文件中读入qp的值留下的接口,qpfile为文件的首地址
else//没有配置的话,就全自动了,呵呵
{
/* 未强制任何编码参数Do not force any parameters */
pic.i_type = X264_TYPE_AUTO;
pic.i_qpplus1 = 0;//I_qpplus1 :此参数减1代表当前画面的量化参数值
}
/*编码一帧图像,h编码器句柄,hout码流文件,pic预编码帧图像,实际就是上面从视频文件中读到的东西*/
i_file += Encode_frame( h, opt->hout, &pic );//进入核心编码层
i_frame++;//已编码的帧数统计(递增1)
/* 更新数据行,用于显示整个编码过程的进度 update status line (up to 1000 times per input file) */
if( opt->b_progress && param->i_log_level < X264_LOG_DEBUG && /* #define X264_LOG_DEBUG 3 调试 */
( i_frame_total ? i_frame * 1000 / i_frame_total > i_progress /* */
: i_frame % 10 == 0 ) ) /* */
{
int64_t i_elapsed = x264_mdate() - i_start;//elapsed:(时间)过去;开始至现在的时间差
double fps = i_elapsed > 0 ? i_frame * 1000000. / i_elapsed : 0;
if( i_frame_total )
{
int eta = i_elapsed * (i_frame_total - i_frame) / ((int64_t)i_frame * 1000000);//已用的时间*(总共要编码的帧数-已编码的帧数=待编码的帧数)/(已编码的帧数*1000000),看上去就象是预计剩余时间,也就是估计的倒计时,根据过去的效率动态的估计这个时间
i_progress = i_frame * 1000 / i_frame_total;
fprintf( stderr, "已编码的帧数:: %d/%d (%.1f%%), %.2f fps, eta %d:%02d:%02d \r", /* 状态提示 FPS(Frames Per Second):每秒传输帧数,每秒钟填充图像的帧数(帧/秒)*/
i_frame, i_frame_total, (float)i_progress / 10, fps,
eta/3600, (eta/60)%60, eta%60 );//ETA是Estimated Time of Arrival的英文缩写,指 预计到达时间
}
else
fprintf( stderr, "已编码的帧数: %d, %.2f fps \r", i_frame, fps ); /* 状态提示,共编码了... */
fflush( stderr ); // needed in windows
}
}
/* Flush delayed(延迟) B-frames */
do {
i_file +=
i_frame_size = Encode_frame( h, opt->hout, NULL );//上面调用的是i_file += Encode_frame( h, opt->hout, &pic );
} while( i_frame_size );
//printf("p_write_nalu=%s",p_write_nalu);
i_end = x264_mdate(); /* 返回当前时间return the current date in microsecond//前面有句: i_start = x264_mdate(); */
x264_picture_clean( &pic ); /* common.c:void x264_picture_clean( x264_picture_t *pic ){free()} x264_picture_t.x264_image_t.plane[4]用来存放实际的图像 */
x264_encoder_close( h ); /* 关闭一个编码处理器 ncoder.c:void x264_encoder_close ( x264_t *h ) */
fprintf( stderr, "\n" );
if( b_ctrl_c ) /* 按下了ctrl+c组合键 编码中止,做一些收尾工作 */
fprintf( stderr, "aborted(失败的) at input frame %d\n", opt->i_seek + i_frame ); /* 输入帧时失败 */
p_close_infile( opt->hin ); //关闭输入文件
p_close_outfile( opt->hout ); //关闭输出文件
if( i_frame > 0 )
{
double fps = (double)i_frame * (double)1000000 / (double)( i_end - i_start );/* 每秒多少帧 */
fprintf( stderr, "encoded %d frames, %.2f fps, %.2f kb/s\n", i_frame, fps,
(double) i_file * 8 * param->i_fps_num /
( (double) param->i_fps_den * i_frame * 1000 ) ); /* 在窗口显示encoded 26 frames等进度提示 */
}
return 0;
}
添加此代码,输出情况如下:
![printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - . printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - .](http://img.ph.126.net/E4dFHPSOMO-woJyymnuB4Q==/185773484645970036.jpg)
![printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - . printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - .](http://img.ph.126.net/WacXqMfreb153Zc6KQZLOg==/2741566273178722435.jpg)
pic.i_pts=156156; i_frame=0; param->i_fps_den=156;
pic.i_pts=157157; i_frame=0; param->i_fps_den=157;
pic.i_pts=158158; i_frame=0; param->i_fps_den=158;
pic.i_pts=159159; i_frame=0; param->i_fps_den=159;
pic.i_pts=160160; i_frame=0; param->i_fps_den=160;
pic.i_pts=161161; i_frame=0; param->i_fps_den=161;
pic.i_pts=162162; i_frame=0; param->i_fps_den=162;
pic.i_pts=163163; i_frame=0; param->i_fps_den=163;
pic.i_pts=164164; i_frame=0; param->i_fps_den=164;
pic.i_pts=165165; i_frame=0; param->i_fps_den=165;
pic.i_pts=166166; i_frame=0; param->i_fps_den=166;
pic.i_pts=167167; i_frame=0; param->i_fps_den=167;
pic.i_pts=168168; i_frame=0; param->i_fps_den=168;
pic.i_pts=169169; i_frame=0; param->i_fps_den=169;
pic.i_pts=170170; i_frame=0; param->i_fps_den=170;
pic.i_pts=171171; i_frame=0; param->i_fps_den=171;
pic.i_pts=172172; i_frame=0; param->i_fps_den=172;
pic.i_pts=173173; i_frame=0; param->i_fps_den=173;
pic.i_pts=174174; i_frame=0; param->i_fps_den=174;
pic.i_pts=175175; i_frame=0; param->i_fps_den=175;
pic.i_pts=176176; i_frame=0; param->i_fps_den=176;
pic.i_pts=177177; i_frame=0; param->i_fps_den=177;
pic.i_pts=178178; i_frame=0; param->i_fps_den=178;
pic.i_pts=179179; i_frame=0; param->i_fps_den=179;
pic.i_pts=180180; i_frame=0; param->i_fps_den=180;
pic.i_pts=181181; i_frame=0; param->i_fps_den=181;
pic.i_pts=182182; i_frame=0; param->i_fps_den=182;
pic.i_pts=183183; i_frame=0; param->i_fps_den=183;
pic.i_pts=184184; i_frame=0; param->i_fps_den=184;
pic.i_pts=185185; i_frame=0; param->i_fps_den=185;
pic.i_pts=186186; i_frame=0; param->i_fps_den=186;
pic.i_pts=187187; i_frame=0; param->i_fps_den=187;
pic.i_pts=188188; i_frame=0; param->i_fps_den=188;
pic.i_pts=189189; i_frame=0; param->i_fps_den=189;
pic.i_pts=190190; i_frame=0; param->i_fps_den=190;
pic.i_pts=191191; i_frame=0; param->i_fps_den=191;
pic.i_pts=192192; i_frame=0; param->i_fps_den=192;
pic.i_pts=193193; i_frame=0; param->i_fps_den=193;
pic.i_pts=194194; i_frame=0; param->i_fps_den=194;
pic.i_pts=195195; i_frame=0; param->i_fps_den=195;
pic.i_pts=196196; i_frame=0; param->i_fps_den=196;
pic.i_pts=197197; i_frame=0; param->i_fps_den=197;
pic.i_pts=198198; i_frame=0; param->i_fps_den=198;
pic.i_pts=199199; i_frame=0; param->i_fps_den=199;
pic.i_pts=200200; i_frame=0; param->i_fps_den=200;
pic.i_pts=201201; i_frame=0; param->i_fps_den=201;
pic.i_pts=202202; i_frame=0; param->i_fps_den=202;
pic.i_pts=203203; i_frame=0; param->i_fps_den=203;
pic.i_pts=204204; i_frame=0; param->i_fps_den=204;
pic.i_pts=205205; i_frame=0; param->i_fps_den=205;
pic.i_pts=206206; i_frame=0; param->i_fps_den=206;
pic.i_pts=207207; i_frame=0; param->i_fps_den=207;
pic.i_pts=208208; i_frame=0; param->i_fps_den=208;
pic.i_pts=209209; i_frame=0; param->i_fps_den=209;
pic.i_pts=210210; i_frame=0; param->i_fps_den=210;
pic.i_pts=211211; i_frame=0; param->i_fps_den=211;
pic.i_pts=212212; i_frame=0; param->i_fps_den=212;
pic.i_pts=213213; i_frame=0; param->i_fps_den=213;
pic.i_pts=214214; i_frame=0; param->i_fps_den=214;
pic.i_pts=215215; i_frame=0; param->i_fps_den=215;
pic.i_pts=216216; i_frame=0; param->i_fps_den=216;
pic.i_pts=217217; i_frame=0; param->i_fps_den=217;
pic.i_pts=218218; i_frame=0; param->i_fps_den=218;
pic.i_pts=219219; i_frame=0; param->i_fps_den=219;
pic.i_pts=220220; i_frame=0; param->i_fps_den=220;
pic.i_pts=221221; i_frame=0; param->i_fps_den=221;
pic.i_pts=222222; i_frame=0; param->i_fps_den=222;
pic.i_pts=223223; i_frame=0; param->i_fps_den=223;
pic.i_pts=224224; i_frame=0; param->i_fps_den=224;
pic.i_pts=225225; i_frame=0; param->i_fps_den=225;
pic.i_pts=226226; i_frame=0; param->i_fps_den=226;
pic.i_pts=227227; i_frame=0; param->i_fps_den=227;
pic.i_pts=228228; i_frame=0; param->i_fps_den=228;
pic.i_pts=229229; i_frame=0; param->i_fps_den=229;
pic.i_pts=230230; i_frame=0; param->i_fps_den=230;
pic.i_pts=231231; i_frame=0; param->i_fps_den=231;
pic.i_pts=232232; i_frame=0; param->i_fps_den=232;
pic.i_pts=233233; i_frame=0; param->i_fps_den=233;
pic.i_pts=234234; i_frame=0; param->i_fps_den=234;
pic.i_pts=235235; i_frame=0; param->i_fps_den=235;
pic.i_pts=236236; i_frame=0; param->i_fps_den=236;
pic.i_pts=237237; i_frame=0; param->i_fps_den=237;
pic.i_pts=238238; i_frame=0; param->i_fps_den=238;
pic.i_pts=239239; i_frame=0; param->i_fps_den=239;
pic.i_pts=240240; i_frame=0; param->i_fps_den=240;
pic.i_pts=241241; i_frame=0; param->i_fps_den=241;
pic.i_pts=242242; i_frame=0; param->i_fps_den=242;
pic.i_pts=243243; i_frame=0; param->i_fps_den=243;
pic.i_pts=244244; i_frame=0; param->i_fps_den=244;
pic.i_pts=245245; i_frame=0; param->i_fps_den=245;
pic.i_pts=246246; i_frame=0; param->i_fps_den=246;
pic.i_pts=247247; i_frame=0; param->i_fps_den=247;
pic.i_pts=248248; i_frame=0; param->i_fps_den=248;
pic.i_pts=249249; i_frame=0; param->i_fps_den=249;
pic.i_pts=250250; i_frame=0; param->i_fps_den=250;
pic.i_pts=251251; i_frame=0; param->i_fps_den=251;
pic.i_pts=252252; i_frame=0; param->i_fps_den=252;
pic.i_pts=253253; i_frame=0; param->i_fps_den=253;
pic.i_pts=254254; i_frame=0; param->i_fps_den=254;
pic.i_pts=255255; i_frame=0; param->i_fps_den=255;
pic.i_pts=256256; i_frame=0; param->i_fps_den=256;
pic.i_pts=257257; i_frame=0; param->i_fps_den=257;
pic.i_pts=258258; i_frame=0; param->i_fps_den=258;
pic.i_pts=259259; i_frame=0; param->i_fps_den=259;
pic.i_pts=260260; i_frame=0; param->i_fps_den=260;
pic.i_pts=261261; i_frame=0; param->i_fps_den=261;
pic.i_pts=262262; i_frame=0; param->i_fps_den=262;
pic.i_pts=263263; i_frame=0; param->i_fps_den=263;
pic.i_pts=264264; i_frame=0; param->i_fps_den=264;
pic.i_pts=265265; i_frame=0; param->i_fps_den=265;
pic.i_pts=266266; i_frame=0; param->i_fps_den=266;
pic.i_pts=267267; i_frame=0; param->i_fps_den=267;
pic.i_pts=268268; i_frame=0; param->i_fps_den=268;
pic.i_pts=269269; i_frame=0; param->i_fps_den=269;
pic.i_pts=270270; i_frame=0; param->i_fps_den=270;
pic.i_pts=271271; i_frame=0; param->i_fps_den=271;
pic.i_pts=272272; i_frame=0; param->i_fps_den=272;
pic.i_pts=273273; i_frame=0; param->i_fps_den=273;
pic.i_pts=274274; i_frame=0; param->i_fps_den=274;
pic.i_pts=275275; i_frame=0; param->i_fps_den=275;
pic.i_pts=276276; i_frame=0; param->i_fps_den=276;
pic.i_pts=277277; i_frame=0; param->i_fps_den=277;
pic.i_pts=278278; i_frame=0; param->i_fps_den=278;
pic.i_pts=279279; i_frame=0; param->i_fps_den=279;
pic.i_pts=280280; i_frame=0; param->i_fps_den=280;
pic.i_pts=281281; i_frame=0; param->i_fps_den=281;
pic.i_pts=282282; i_frame=0; param->i_fps_den=282;
pic.i_pts=283283; i_frame=0; param->i_fps_den=283;
pic.i_pts=284284; i_frame=0; param->i_fps_den=284;
pic.i_pts=285285; i_frame=0; param->i_fps_den=285;
pic.i_pts=286286; i_frame=0; param->i_fps_den=286;
pic.i_pts=287287; i_frame=0; param->i_fps_den=287;
pic.i_pts=288288; i_frame=0; param->i_fps_den=288;
pic.i_pts=289289; i_frame=0; param->i_fps_den=289;
pic.i_pts=290290; i_frame=0; param->i_fps_den=290;
pic.i_pts=291291; i_frame=0; param->i_fps_den=291;
pic.i_pts=292292; i_frame=0; param->i_fps_den=292;
pic.i_pts=293293; i_frame=0; param->i_fps_den=293;
pic.i_pts=294294; i_frame=0; param->i_fps_den=294;
pic.i_pts=295295; i_frame=0; param->i_fps_den=295;
pic.i_pts=296296; i_frame=0; param->i_fps_den=296;
pic.i_pts=297297; i_frame=0; param->i_fps_den=297;
pic.i_pts=298298; i_frame=0; param->i_fps_den=298;
pic.i_pts=299299; i_frame=0; param->i_fps_den=299;
x264 [info]: slice I:2 Avg QP:19.00 size: 10261 PSNR Mean Y:46.51 U:49.01
V:49.94 Avg:47.29 Global:47.29
x264 [info]: slice P:298 Avg QP:22.71 size: 783 PSNR Mean Y:43.57 U:47.00
V:48.16 Avg:44.53 Global:44.33
x264 [info]: mb I I16..4: 50.1% 0.0% 49.9%
x264 [info]: mb P I16..4: 4.5% 0.0% 1.2% P16..4: 24.6% 8.9% 1.5% 0.0% 0
.0% skip:59.2%
x264 [info]: PSNR Mean Y:43.586 U:47.013 V:48.171 Avg:44.545 Global:44.340 kb/s:
202.94
encoded 300 frames, 24.03 fps, 203.36 kb/s
D:\>
这个测试序列一共300帧,呵呵
![printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - . printf(npic.i_pts=d; i_frame=d; param-i_fps_den=d; n,pic.i_pts,i_frame,param-i_fps_den); - 加菲 - .](http://img.ph.126.net/99fR60metlikroE_0KGkPQ==/1333909914648734880.jpg)