主流开源编解码器Xvid,x264,ffmpeg 性能对比 您所在的位置:网站首页 mpeg4和h263哪个好 主流开源编解码器Xvid,x264,ffmpeg 性能对比

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

2024-07-09 10:39| 来源: 网络整理| 查看: 265

如有转载请注明出处:孔祥文博客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)输出视频格式 XvidXvid0.47yuyv Xvidffmpeg0.50yuyv ffmpeg(mpeg4)Xvid 0.26yv12

 

ffmpeg(mpeg4)ffmpeg(mpeg4)0.31 yv12 ffmpeg(h.264)ffmpeg(h.264)0.45yv12 ffmpeg(h.264)X2640.78yuyv 

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;


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有