主流开源编解码器Xvid,x264,ffmpeg 性能对比(转)

8 篇文章 1 订阅
7 篇文章 0 订阅

Xvid是基于MPEG4协议的编解码器,x264是基于H.264协议的编码器,ffmpeg集合了各种音频,视频编解码协议,通过设置参数可以完成基于MPEG4,H.264等协议的编解码,现在将其对比结果罗列如下:

1.软件版本:

        Xvid:1.2.1

        x264:无

        ffmpeg:0.5

2. 视频样本 foreman.cif 300帧,大小352x288

3. 所选用编解码器:  xvid, x264, ffmpeg

4. 视频流比特率设定 : 1000kbps.

5. 测试结果:

视频编码

编码器 编码时间(s) 视频编码后大小(B) 比特率(kbps) 输入视频格式
 Xvid  0.98  1779213  1.18  yuyv
 X264  2.2  1788824  1.19  yv12
 ffmpeg(mpeg4协议)  0.76  1754847  1.17  yv12
 ffmpeg(h.264协议)  4.38  1741733  1.16  yv12

视频解码

解码器 视频所用的编码器 解码时间(s) 输出视频格式

Xvid Xvid 0.47 yuyv

Xvid ffmpeg 0.50 yuyv

ffmpeg(mpeg4) Xvid  0.26 yv12

ffmpeg(mpeg4) ffmpeg(mpeg4) 0.31  yv12

ffmpeg(h.264) ffmpeg(h.264) 0.45 yv12

ffmpeg(h.264) X264 0.78 yuyv

6.结论

    从以上可以看出:

    1).    对于基于MPEG4协议的编解码,ffmpeg的效率都要高于Xvid,主要原因应该是Xvid是以保存视频效果为首要出发点的,其对视频质量的保存应该是做的最好的,这就在一定程度上增加了编解码的复杂性,影响了速度的提升。

    2).    对于基于H.264协议的编解码,由于ffmpeg没有本身的h.264编码器,其H.264协议编码是调用x264的编码库来完成的,所以其性能本质上还是x264的,只不过ffmpeg对其进行了封装,但从数据对比可以看出,在本次实验中,ffmpeg调用x264库编码用了4.38秒,远远高于x264的2.2秒,这主要应该是ffmpeg调用x264库时对其进行了不同的参数设置,当然对x264进行接口的封装也会影响一部分性能,但应该不是主要的,主要的应该还是调用x264时,参数有些不同。

    所以如果做基于MPEG4的编解码,如果对速度要求高的话,ffmpeg是很好用的工具。

    对于H.264协议来说,ffmpeg能很好的解码,而编码的话最好还是要调用x264,因为ffmpeg还没有实现H.264的编码。

附: 各编解码器参数设定:

    Xvid:

 

xvid_enc_create_obj.version = XVID_VERSION; 
xvid_enc_create_obj.max_key_interval = 100;  //must mark it !! 
xvid_enc_create_obj.profile = 0xf5;//XVID_PROFILE_S_L0; 
xvid_enc_create_obj.fincr = 1; 
xvid_enc_create_obj.fbase = 25;        //must set for bitrate kxw 
xvid_enc_create_obj.num_threads = 0; 
xvid_enc_create_obj.global = 0; 
xvid_enc_create_obj.plugins = plugins; 
xvid_enc_create_obj.num_plugins = 1; 
memset(&plugin_single, 0, sizeof(xvid_plugin_single_t)); 
plugin_single.version = XVID_VERSION; 
plugin_single.bitrate = bitrate * 1024; // 1000*1024 
plugin_single.reaction_delay_factor = 16; 
plugin_single.averaging_period = 100; 
plugin_single.buffer = 100; 
plugins[0].func = xvid_plugin_single; 
plugins[0].param = &plugin_single; 

    X264:

param->cpu = X264_CPU_MMXEXT|X264_CPU_SSE|X264_CPU_SSE2;//0x177a;//x264_cpu_detect(); 
param->i_threads = 1; 
param->b_deterministic = 1; 
/* Video properties */ 
param->i_csp           = X264_CSP_I420; 
param->i_width         = 0; 
param->i_height        = 0; 
param->vui.i_sar_width = 0; 
param->vui.i_sar_height= 0; 
param->vui.i_overscan  = 0;  /* undef */ 
param->vui.i_vidformat = 5;  /* undef */ 
param->vui.b_fullrange = 0;  /* off */ 
param->vui.i_colorprim = 2;  /* undef */ 
param->vui.i_transfer  = 2;  /* undef */ 
param->vui.i_colmatrix = 2;  /* undef */ 
param->vui.i_chroma_loc= 0;  /* left center */ 
param->i_fps_num       = 25; 
param->i_fps_den       = 1; 
param->i_level_idc     = -1; 
/* Encoder parameters */ 
param->i_frame_reference = 1; 
param->i_keyint_max = 250; 
param->i_keyint_min = 25; 
param->i_bframe = 0;                //no b frame. 
param->i_scenecut_threshold = 40; 
param->i_bframe_adaptive = X264_B_ADAPT_FAST; 
param->i_bframe_bias = 0; 
param->b_bframe_pyramid = 0; 
param->b_deblocking_filter = 1; 
param->i_deblocking_filter_alphac0 = 0; 
param->i_deblocking_filter_beta = 0; 
param->b_cabac = 1; 
param->i_cabac_init_idc = 0; 
param->rc.i_rc_method = X264_RC_ABR;   //kxw notice! 
param->rc.i_bitrate = 0; 
param->rc.f_rate_tolerance = 1.0; 
param->rc.i_vbv_max_bitrate = 0; 
param->rc.i_vbv_buffer_size = 0; 
param->rc.f_vbv_buffer_init = 0.9; 
param->rc.i_qp_constant = 26;    //default QP = 26...........kxw mod 
param->rc.f_rf_constant = 0; 
param->rc.i_qp_min = 10; 
param->rc.i_qp_max = 51; 
param->rc.i_qp_step = 4; 
param->rc.f_ip_factor = 1.4; 
param->rc.f_pb_factor = 1.3; 
param->rc.i_aq_mode = X264_AQ_VARIANCE; 
param->rc.f_aq_strength = 1.0; 
param->rc.b_stat_write = 0; 
//param->rc.psz_stat_out = "x264_2pass.log"; 
param->rc.b_stat_read = 0; 
//param->rc.psz_stat_in = "x264_2pass.log"; 
param->rc.f_qcompress = 0.6; 
param->rc.f_qblur = 0.5; 
param->rc.f_complexity_blur = 20; 
param->rc.i_zones = 0; 
/* Log */ 
param->pf_log = NULL;//x264_log_default;//x264_log_default; 
param->p_log_private = NULL; 
param->i_log_level = X264_LOG_INFO; 
#if 0 
//consume time .kxw mod 
param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8; 
param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8 
| X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; 
#endif 
param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; 
param->analyse.i_me_method = X264_ME_HEX; 
param->analyse.f_psy_rd = 1.0; 
param->analyse.f_psy_trellis = 0; 
param->analyse.i_me_range = 16; 
 
#if 0 
param->analyse.i_subpel_refine = 100;  //consume time so much!! kxw mod 
#endif 
param->analyse.b_chroma_me = 1; 
param->analyse.i_mv_range_thread = -1; 
param->analyse.i_mv_range = -1; // set from level_idc 
param->analyse.i_chroma_qp_offset = 0; 
param->analyse.b_fast_pskip = 1; 
param->analyse.b_dct_decimate = 1; 
param->analyse.i_luma_deadzone[0] = 21; 
param->analyse.i_luma_deadzone[1] = 11; 
param->analyse.b_psnr = 1; 
param->analyse.b_ssim = 1; 
param->i_cqm_preset = X264_CQM_FLAT; 
x264_param.rc.i_bitrate = br;   //target bitrate. 1000 
x264_param.i_width = width; 
x264_param.i_height = height; 


 ffmpeg:

c->bit_rate = 1000000; 
/* resolution must be a multiple of two */ 
c->width = FRAMEE_WIDTH; 
c->height = FRAME_HEIGHT; 
/* frames per second */ 
c->time_base= (AVRational){1,25}; 
c->gop_size = 250; /* emit one intra frame every ten frames */ 
c->max_b_frames=0; 
c->pix_fmt = PIX_FMT_YUV420P;


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值