压缩xvid ffmpeg x264 对比

压缩xvid ffmpeg x264 对比


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;




X264电影压缩率画质全对比:http://www.mov8.com/dvd/freetalk_show.asp?id=29778

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

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

相关文章

JMS-activMq与spring进行整合

对JMS做了一个简要介绍之后,接下来就讲一下Spring整合JMS的具体过程。JMS只是一个标准,真正在使用它的时候我们需要有它的具体实现,这里我们就使用Apache的activeMQ来作为它的实现。所使用的依赖利用Maven来进行管理,具体依赖如下…

微信消息

微信消息 转载于:https://www.cnblogs.com/linewman/p/9918298.html

make: 警告:检测到时钟错误。您的创建可能是不完整的。

我在make的时候也出现了同样的问题,不过不是什么大问题,这个不影响编译结果分析原因可能是: 服务器上的文件最后修改时间比当前时钟要晚解决办法: 用touch 命令把源程序的时间戳改一下 find . -type f -exec touch {} \;或者touch…

FileReader/FileWriter复制文件

public class Test{ /*FileReader/FileWriter读写乱码,待处理*/ public static void main(String[] args) throws IOException{ FileReader fileReader null; FileWriter fileWriter null; try{ fileReader new FileReader("c:/123/666.doc"); fileWri…

machine ID问题 ( u-boot设置machine id , set mach_type 0x16a )

machine ID问题 machine ID问题跟CPU具体到型号相关,启动时打印信息如下: Uncompressing Linux...........................................................................done,booting the kernel. Error:unrecoginized/unsupported machine ID(r1…

FFMPEG使用参数详解

FFMPEG使用参数详解 目前又开始测MPEG1和MPEG2的解码,在准备编码好的测试序列过程中,需要通过编码器来进行原始视频序列的编码操作,以生成我们需要的测试数据。由于IPP example提供的Encoder不支持MPEG1,经过查询,决定…

模拟支付宝、淘宝登录1

1、进入支付宝首页 GET https://auth.alipay.com/login/index.htm HTTP/1.1Accept: */*Accept-Language: zh-CNAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/8.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; …

CSS层叠样式表

HTML主要控制内容 CSS主要控制格式。 样式表是用来指定样式信息的句法机制。 之所以将CSS称为层叠样式表,是因为它可以在3个层次上进行定义。 内联样式表 内联样式表位于开始标签中,其设置只对该元素起作用 文档样式表 文档样式表位于文档的头部区域&…

对X264/FFMPEG架构探讨---感觉不错

3. FFMPEG架构分析FFMPEG是目前被应用最广泛的编解码软件库,支持多种流行的编解码器,它是C语言实现的,不仅被集成到各种PC软件,也经常被移植到多种嵌入式设备中。使用面向对象的办法来设想这样一个编解码库,首先让人想…

如何快糙好猛的使用Shiqi.Yu老师的公开人脸检测库(附源码)

前言 本次编写所用的库为于仕祺老师免费提供的人脸检测库。真心好用,识别率和识别速度完全不是Opencv自带的程序能够比拟的。将其配合Opencv的EigenFace算法,基本上可以形成一个小型的毕业设计。(我是学机械的啊喂!!&a…

SQL语句增加字段、修改字段、修改类型、修改默认值

--一、修改字段默认值alter table 表名 drop constraint 约束名字 ------说明:删除表的字段的原有约束alter table 表名 add constraint 约束名字 DEFAULT 默认值 for 字段名称 -------说明:添加一个表的字段的约束并指定默认值--二、修改字段名&#…

node+koa2+mysql搭建博客后台

本文将详细讲解使用nodekoa2mysql搭建博客后台的全过程。 开发环境 node 8.3.0及以上npm 5.3.0及以上mysql 5.7.21具体的环境配置可查看我的上一篇文章 准备工作 npm下载pm2(进程守护),并设置全局变量创建博客需要的数据库与表 开启mysql并创建数据库test: create d…

ffmpeg使用x264编码的配置+ ffmpeg与 x264编码器参数完整对照表

ffmpeg使用x264编码的配置 ffmpeg与 x264编码器参数完整对照表 分类: 多媒体 2010-07-13 11:31 1072人阅读 评论(0) 收藏 举报 转载自:扶凯[http://www.php-oa.com] 本文链接: http://www.php-oa.com/2009/03/09/ffmpeg_x264.html 转帖:http://rhinghear…

javascript之变量

定义变量方式有var,let,const,变量的类型是根据变量的值来确定,变量的名称跟大多数语言一样,包含数字字母_$,不能以数字开头且区分大小写。 var 最早的定义变量的方式,可重复定义,但请避免这样做。 var a …

Maven理解

2019独角兽企业重金招聘Python工程师标准>>> Maven概念 参考maven入门 冰河winner Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口&#xff0…

HALCON示例程序measure_circles.hdev测量圆的半径

HALCON示例程序measure_circles.hdev测量圆的半径 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () read_image (Image, ‘circle_plate’) get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width / 2…

OpenTLD 未完成 - 虎头

TLD是一种算法的简称,原作者把它叫做Tracking-Learning-Detection。搞视觉的人看到这个名字都会吓一跳,很ambitious的计划。是09年的工作,不算太久,不过也不太新。网上关于这个的资源其实很多,很大程度和作者开放源代码…

C# FileSystemWatcher 在监控文件夹和文件时的用法

********************************************************************************** 第一个文章: ********************************************************************************** 概述 最近学习FileSystemWatcher的用法,它主要是监控一个文件夹,当文件夹内的文件要…

比微软kinect更强的视频跟踪算法--TLD跟踪算法介绍

TLD (Tracking-Learning-Detection)是英国萨里大学的一个捷克籍博士生在其攻读博士学位期间提出的一种新的单目标长时间( long term tracking )跟踪算法。该算法与传统跟踪算法的显著区别在于将传统的跟踪算法和传统的检测算法相结合来解决被跟踪目标在被…

HALCON示例程序measure_circuit_width_lines_gauss.hdev电路板线宽检测

HALCON示例程序measure_circuit_width_lines_gauss.hdev电路板线宽检测 示例程序源码(加注释) 关于显示类函数解释 dev_update_off () dev_close_window () read_image (Image, ‘pcb_color’) get_image_size (Image, Width, Height) dev_open_window…