主流开源编解码器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)输出视频格式 
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:

 

  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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halcon标定后改变世界坐标系参考点方法

halcon相机标定完成后,世界坐标系原点在标定板的中间,如果要自定义坐标系原点该如何操作 如图: 方法1 使用仿射变换 *pose_to_hom_mat3d (FinalPose, HomMat3D) *hom_mat3d_translate_local (HomMat3D, dx, dy, 0, HomMat3DTranslate) *hom_…

Oracle 【IT实验室】数据库备份与恢复之:如何对Oracle数据库文件进行恢复与备份...

任何数据库在长期使用过程中,都会存在一定的安全隐患。对于数据库管理员来说不能仅寄希望于计算机操作系统的安全运行,而是要建立一整套的数据库备份与恢复机制。当数据库发生故障后,希望能重新建立一个完整的数据库,该处理称为数…

vue刷新当前路由:router-view 复用组件时不刷新的3种解决方案总结

vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换…

KUKA---US2电源的安全属性-------老款硬线连接实现的DRIVE安全STO SBC 、新款基于Safety over EtherCAT 网络帧实现的DRIVE安全STO SBC

安全双回路的监控:(工业上的安全,是指安全等级,没有绝对的安全) 1. 机械式:监控关断继电器的辅助反馈触点,这个关断继电器包含机械联锁触点,这样反馈触点和主触点可以同步开关动…

C#6.0中$的用法

C#6.0中$的用法 这里注意只有VS2015及以上VS版本才支持这样写! 如果使用vs2015以下版本就去用string.format()吧! //C#6.0中$的用法:是为了替代string.format();//原先赋值需要占位符和变量,当需要拼接多个变量会造成语句过长等不…

Oracle密码过期问题 ORA-28001:the password has expired

如果已经过期了,首先需要修改密码,然后设置密码为无限期。修改以sys用户登陆。 修改密码:alter user username identified by password 密码可以和之前的密码相同也可以不同。 修改数据库密码为无限期: Oracle的密码过期规则是用…

X11硬线接口信号 与Profisafe安全输入输出信号之间的区别与比较

X11硬线接口信号 与Profisafe安全输入输出信号之间的区别与比较 Profisafe安全输入信号US2信号有待深入(通过外部PLC :) 

预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)

#pragma once: 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含。 *********************************** 例如 ***************************************** 头文件中的 #if _MSC_VER > 100…

var类型推断关键字

目录var 类型推断介绍var的一个例子:编程遵循规则var 类型推断介绍 使用var定义变量时,用var关键字替代实际类型。编译器可以根据变量的初始化值自行“推断”变量的类型。 例如: var A 0; 等价于 int A 0;var的一个…

《程序员修炼之道》笔记(九)

*续 第八章 注重实效的项目 1. 无处不在的自动化 文明通过增加我们不假思索就能完成的重要操作的数目而取得进步。 无论是构建和发布流程、是书面的代码复查工作、还是其他任何在项目中反复出现的任务,都必须是自动的。人工流程不能保证一致性,也无法保证…

flutter image boxfit

直接从官网文档中复制记录,方便以后查看contain → const BoxFitAs large as possible while still containing the source entirely within the target box.const BoxFit(1)cover → const BoxFitAs small as possible while still covering the entire target box…

rvm RuvyGem Cocoapods brew

开始的时候,我仅想升级一下cocoapods的版本,因为我xcode报三十多个相似警告,说第三方找不到相应文件,我看cocoapods版本有1.0.1,而我使用的依旧是1.0.0的老版本。当我升级cocoapods时,需要使用gem来更新coc…

Linux系统目录说明

以前稍稍接触过Linux系统,现今,因工作需要要更进一步学习Linux系统的相关程序开发。因此对于目录(路径)的了解及很重要了。/bin:是Binary的缩写,这里保存了一百多个Linux下常用的命令、工具;这是…

const常量用法

目录定义语法特点优点定义 常量就是在使用过程中不会变化的量叫做常量。 语法 const int A 100;//常量不允许改变特点 常量必须在声明时初始化;常量的值必须在编译时就定义好;常量总是隐式静态的; 优点 易读,易于程序修改&…

斯坦福大学机器学习——高斯判别分析

转自 http://blog.csdn.net/linkin1005/article/details/39054023 同朴素贝叶斯一样,高斯判别分析(Gaussian discriminant analysismodel, GDA)也是一种生成学习算法,在该模型中,我们假设y给定的情况下,x服…

嘉实多RO150合成齿轮油

Optigear ™合成 RO 是一个特殊的高性能,长期多级油特别为齿轮 轨道交通,机械工程应用中,一个极端的气候条件和长期使用。 “ Microflux 跨的添加剂组合是免费的固体润滑剂,甚至适应迅速变化的环境和积极…

线程队列-queue

使用队列的目的:解耦,使程序之间实现松耦合;提高处理效率FIFO 先进先出,first in first outLIFO 后入先出,last in first out生产者消费者模型使用方式1 import queue 2 3 #创建队列对象,设置队列大小ma…

MapGIS转Shp文件的单位问题

MapGIS转Shp文件的单位问题 原文:MapGIS转Shp文件的单位问题在MapGIS浏览查看一下数据,各种不习惯;用mapgis自带的转shp功能,属性表会出错;利用名为map2shp的试用版软件可将mapgis格式的数据较为良好转成shp格式。但经常会遇到一个…

halcon2D Metrology测量算子,卡尺测量算子,持续更新

目录2D Metrology1. add_metrology_object_circle_measure2. add_metrology_object_ellipse_measure3. add_metrology_object_generic4. add_metrology_object_line_measure5. add_metrology_object_rectangle2_measure6. align_metrology_model7. apply_metrology_model8. cle…