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

如有转载请注明出处:孔祥文博客http://kswapd.cublog.cn

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:

 

  
  
  
  
  1. xvid_enc_create_obj.version = XVID_VERSION; 
  2. xvid_enc_create_obj.max_key_interval = 100;  //must mark it !! 
  3. xvid_enc_create_obj.profile = 0xf5;//XVID_PROFILE_S_L0; 
  4. xvid_enc_create_obj.fincr = 1; 
  5. xvid_enc_create_obj.fbase = 25;        //must set for bitrate kxw 
  6. xvid_enc_create_obj.num_threads = 0; 
  7. xvid_enc_create_obj.global = 0; 
  8. xvid_enc_create_obj.plugins = plugins; 
  9. xvid_enc_create_obj.num_plugins = 1; 
  10. memset(&plugin_single, 0, sizeof(xvid_plugin_single_t)); 
  11. plugin_single.version = XVID_VERSION; 
  12. plugin_single.bitrate = bitrate * 1024; // 1000*1024 
  13. plugin_single.reaction_delay_factor = 16; 
  14. plugin_single.averaging_period = 100; 
  15. plugin_single.buffer = 100; 
  16. plugins[0].func = xvid_plugin_single; 
  17. plugins[0].param = &plugin_single; 

    X264:

  
  
  
  
  1. param->cpu = X264_CPU_MMXEXT|X264_CPU_SSE|X264_CPU_SSE2;//0x177a;//x264_cpu_detect(); 
  2. param->i_threads = 1; 
  3. param->b_deterministic = 1; 
  4. /* Video properties */ 
  5. param->i_csp           = X264_CSP_I420; 
  6. param->i_width         = 0; 
  7. param->i_height        = 0; 
  8. param->vui.i_sar_width = 0; 
  9. param->vui.i_sar_height= 0; 
  10. param->vui.i_overscan  = 0;  /* undef */ 
  11. param->vui.i_vidformat = 5;  /* undef */ 
  12. param->vui.b_fullrange = 0;  /* off */ 
  13. param->vui.i_colorprim = 2;  /* undef */ 
  14. param->vui.i_transfer  = 2;  /* undef */ 
  15. param->vui.i_colmatrix = 2;  /* undef */ 
  16. param->vui.i_chroma_loc= 0;  /* left center */ 
  17. param->i_fps_num       = 25; 
  18. param->i_fps_den       = 1; 
  19. param->i_level_idc     = -1; 
  20. /* Encoder parameters */ 
  21. param->i_frame_reference = 1; 
  22. param->i_keyint_max = 250; 
  23. param->i_keyint_min = 25; 
  24. param->i_bframe = 0;                //no b frame. 
  25. param->i_scenecut_threshold = 40; 
  26. param->i_bframe_adaptive = X264_B_ADAPT_FAST; 
  27. param->i_bframe_bias = 0; 
  28. param->b_bframe_pyramid = 0; 
  29. param->b_deblocking_filter = 1; 
  30. param->i_deblocking_filter_alphac0 = 0; 
  31. param->i_deblocking_filter_beta = 0; 
  32. param->b_cabac = 1; 
  33. param->i_cabac_init_idc = 0; 
  34. param->rc.i_rc_method = X264_RC_ABR;   //kxw notice! 
  35. param->rc.i_bitrate = 0; 
  36. param->rc.f_rate_tolerance = 1.0; 
  37. param->rc.i_vbv_max_bitrate = 0; 
  38. param->rc.i_vbv_buffer_size = 0; 
  39. param->rc.f_vbv_buffer_init = 0.9; 
  40. param->rc.i_qp_constant = 26;    //default QP = 26...........kxw mod 
  41. param->rc.f_rf_constant = 0; 
  42. param->rc.i_qp_min = 10; 
  43. param->rc.i_qp_max = 51; 
  44. param->rc.i_qp_step = 4; 
  45. param->rc.f_ip_factor = 1.4; 
  46. param->rc.f_pb_factor = 1.3; 
  47. param->rc.i_aq_mode = X264_AQ_VARIANCE; 
  48. param->rc.f_aq_strength = 1.0; 
  49. param->rc.b_stat_write = 0; 
  50. //param->rc.psz_stat_out = "x264_2pass.log"; 
  51. param->rc.b_stat_read = 0; 
  52. //param->rc.psz_stat_in = "x264_2pass.log"; 
  53. param->rc.f_qcompress = 0.6; 
  54. param->rc.f_qblur = 0.5; 
  55. param->rc.f_complexity_blur = 20; 
  56. param->rc.i_zones = 0; 
  57. /* Log */ 
  58. param->pf_log = NULL;//x264_log_default;//x264_log_default; 
  59. param->p_log_private = NULL; 
  60. param->i_log_level = X264_LOG_INFO; 
  61. #if 0 
  62. //consume time .kxw mod 
  63. param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8; 
  64. param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8 
  65. | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16; 
  66. #endif 
  67. param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL; 
  68. param->analyse.i_me_method = X264_ME_HEX; 
  69. param->analyse.f_psy_rd = 1.0; 
  70. param->analyse.f_psy_trellis = 0; 
  71. param->analyse.i_me_range = 16; 
  72.  
  73. #if 0 
  74. param->analyse.i_subpel_refine = 100;  //consume time so much!! kxw mod 
  75. #endif 
  76. param->analyse.b_chroma_me = 1; 
  77. param->analyse.i_mv_range_thread = -1; 
  78. param->analyse.i_mv_range = -1; // set from level_idc 
  79. param->analyse.i_chroma_qp_offset = 0; 
  80. param->analyse.b_fast_pskip = 1; 
  81. param->analyse.b_dct_decimate = 1; 
  82. param->analyse.i_luma_deadzone[0] = 21; 
  83. param->analyse.i_luma_deadzone[1] = 11; 
  84. param->analyse.b_psnr = 1; 
  85. param->analyse.b_ssim = 1; 
  86. param->i_cqm_preset = X264_CQM_FLAT; 
  87. x264_param.rc.i_bitrate = br;   //target bitrate. 1000 
  88. x264_param.i_width = width; 
  89. x264_param.i_height = height; 

 ffmpeg:

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

你可能感兴趣的:(thread,filter,buffer,plugins,reference,h.264)