ffmpeg中的sws_scale算法性能测试

经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理。以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人。忙里偷闲,对ffmpeg的这一组函数进行了一下封装,顺便测试了一下各种算法。

简单说一下测试环境,我使用的是Dell的品牌机,i5的CPU。ffmpeg是2010年8月左右的当时最新版本编译而成,我使用的是其静态库版本。

sws_scale的算法有如下这些选择。

#define SWS_FAST_BILINEAR     1
#define SWS_BILINEAR          2
#define SWS_BICUBIC           4
#define SWS_X                 8
#define SWS_POINT          0x10
#define SWS_AREA           0x20
#define SWS_BICUBLIN       0x40
#define SWS_GAUSS          0x80
#define SWS_SINC          0x100
#define SWS_LANCZOS       0x200
#define SWS_SPLINE        0x400

 

首先,将一幅1920*1080的风景图像,缩放为400*300的24位RGB,下面的帧率,是指每秒钟缩放并渲染的次数。(经过我的测试,渲染的时间可以忽略不计,主要时间还是耗费在缩放算法上。)


算法


帧率


图像主观感受


SWS_FAST_BILINEAR


228


图像无明显失真,感觉效果很不错。


SWS_BILINEAR


95


感觉也很不错,比上一个算法边缘平滑一些。


SWS_BICUBIC


80


感觉差不多,比上上算法边缘要平滑,比上一算法要锐利。


SWS_X


91


与上一图像,我看不出区别。


SWS_POINT


427


细节比较锐利,图像效果比上图略差一点点。


SWS_AREA


116


与上上算法,我看不出区别。


SWS_BICUBLIN


87


同上。


SWS_GAUSS


80


相对于上一算法,要平滑(也可以说是模糊)一些。


SWS_SINC


30


相对于上一算法,细节要清晰一些。


SWS_LANCZOS


70


相对于上一算法,要平滑(也可以说是模糊)一点点,几乎无区别。


SWS_SPLINE


47


和上一个算法,我看不出区别。

总评,以上各种算法,图片缩小之后的效果似乎都不错。如果不是对比着看,几乎看不出缩放效果的好坏。上面所说的清晰(锐利)与平滑(模糊),是一种客观感受,并非清晰就比平滑好,也非平滑比清晰好。其中的Point算法,效率之高,让我震撼,但效果却不差。此外,我对比过使用CImage的绘制时缩放,其帧率可到190,但效果惨不忍睹,颜色严重失真。

第二个试验,将一幅1024*768的风景图像,放大到1920*1080,并进行渲染(此时的渲染时间,虽然不是忽略不计,但不超过5ms的渲染时间,不影响下面结论的相对准确性)。


算法


帧率


图像主观感受


SWS_FAST_BILINEAR


103


图像无明显失真,感觉效果很不错。


SWS_BILINEAR


100


和上图看不出区别。


SWS_BICUBIC


78


相对上图,感觉细节清晰一点点。


SWS_X


106


与上上图无区别。


SWS_POINT


112


边缘有明显锯齿。


SWS_AREA


114


边缘有不明显锯齿。


SWS_BICUBLIN


95


与上上上图几乎无区别。


SWS_GAUSS


86


比上图边缘略微清楚一点。


SWS_SINC


20


与上上图无区别。


SWS_LANCZOS


64


与上图无区别。


SWS_SPLINE


40


与上图无区别。

总评,Point算法有明显锯齿,Area算法锯齿要不明显一点,其余各种算法,肉眼看来无明显差异。此外,使用CImage进行渲染时缩放,帧率可达105,效果与Point相似。

 

个人建议,如果对图像的缩放,要追求高效,比如说是视频图像的处理,在不明确是放大还是缩小时,直接使用SWS_FAST_BILINEAR算法即可。如果明确是要缩小并显示,建议使用Point算法,如果是明确要放大并显示,其实使用CImage的Strech更高效。

当然,如果不计速度追求画面质量。在上面的算法中,选择帧率最低的那个即可,画面效果一般是最好的。

不过总的来说,ffmpeg的scale算法,速度还是非常快的,毕竟我选择的素材可是高清的图片。

(本想顺便上传一下图片,但各组图片差异其实非常小,恐怕上传的时候格式转换所造成的图像细节丢失,已经超过了各图片本身的细节差异,因此此处不上传图片了。)

 

注:试验了一下OpenCV的Resize效率,和上面相同的情况下,OpenCV在上面的放大试验中,每秒可以进行52次,缩小试验中,每秒可以进行458次。

时间: 2024-11-01 21:26:45

ffmpeg中的sws_scale算法性能测试的相关文章

对ffmpeg中的sws_scale的封装类

直接使用ffmpeg中的sws_scale虽然已经不太复杂,但每次的手动初始化等操作,毕竟不够方便.我对这部分代码进行了封装.平时常见的需要处理的图像格式无非就是YUV420和RGB24.RGB32等格式,我的封装仅仅对它们进行.blog好像不能上传附件,因此我没法把ffmpeg的scale相关的静态库lib(静态库携带比动态库方便^_^)等上传了(发了一份给自己的qq邮箱留作备份了,发现这儿可以上传附件,全部源码也上传一份好了). 下面的代码,可能需要ffmpeg的相关头文件支持,我对它们进行

php curl中gzip的压缩性能测试实例分析_php技巧

本文实例分析了php curl中gzip的压缩性能测试.分享给大家供大家参考,具体如下: 前因: 请求接口次数很多,每日两亿多次,主要是有些接口返回数据量很大高达110KB(为了减少请求次数,将多个接口合并成一个导致的). 后端接口的nginx已经开启gzip,所以做个测试,看看是否在请求时使用压缩解压 php CURL 的扩展安装这里就不说了 用到的curl的两个参数 //在http 请求头加入 gzip压缩 curl_setopt($ch, CURLOPT_HTTPHEADER, array

问一下大神这个c++中的这些算法是怎么运行的

问题描述 问一下大神这个c++中的这些算法是怎么运行的 问一下大神这个c++中的这些算法是怎么运行的 例如 unique_copy 求大神解释详细一点 谢谢 解决方案 ........... 解决方案二: 拷贝,但是遇到重复的只保留一个http://www.cnblogs.com/heyonggang/archive/2013/08/07/3243477.html 解决方案三: 按步骤来 解决方案四: 你是不知道怎么运行的, 还是不知道怎么执行的.?

用java实现人工智能中的A*算法求8数码问题

算法|问题 //8数码类class Eight{ int e[][] = {{2,8,3},{1,6,4},{7,0,5}}; //默认的起始状态 int faX ,faY; //保存父状态中0的位置 int f; //估价函数值 Eight former ; public Eight(){ faX = -1; faY=-1; f=-1; former = null; } public Eight(Eight other){ for(int i = 0; i<3; i++) for(int j=

仿STL中的堆算法的一个实现

RT. 堆的性质之类的不再这里阐述,写这个算法只为了更好的理解STL中的堆算法,如果看不懂STL中的算法也可以来参考这里给出的算法,因为是纯C的看起来会省去很多语言方面的细节. 同时里面还有一个STL中对应算法的测试以比较两者的效果. /******************************************************************** created: 2007/3/18 filename: main.cpp author: Lichuang purpose

JavaScript中数据结构与算法(一):栈

  这篇文章主要介绍了JavaScript中数据结构与算法(一):栈,本文讲解了栈的结构.什么是回文以及递归等内容,讲解的不错,通俗易懂,需要的朋友可以参考下 序 数据结构与算法JavaScript这本书算是讲解得比较浅显的,优点就是用javascript语言把常用的数据结构给描述了下,书中很多例子来源于常见的一些面试题目,算是与时俱进,业余看了下就顺便记录下来吧 git代码下载:https://github.com/JsAaron/data_structure.git 栈结构 特殊的列表,栈内

JavaScript中数据结构与算法(二):队列

  这篇文章主要介绍了JavaScript中数据结构与算法(二):队列,队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构,需要的朋友可以参考下 队列是只允许在一端进行插入操作,另一个进行删除操作的线性表,队列是一种先进先出(First-In-First-Out,FIFO)的数据结构 队列在程序程序设计中用的非常的频繁,因为javascript单线程,所以导致了任何一个时间段只能执行一个任务,而且还参杂了异步

JavaScript中数据结构与算法(三):链表

  这篇文章主要介绍了JavaScript中数据结构与算法(三):链表,本文分别讲解了单链表与双链表以及增加节和删除节的代码实例,需要的朋友可以参考下 我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除,都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接

JavaScript中数据结构与算法(四):串(BF)

  这篇文章主要介绍了JavaScript中数据结构与算法(四):串(BF),串是由零个或多个字符组成的有限序列,又叫做字符串,本文着重讲解了BF(Brute Force)算法,需要的朋友可以参考下 串是由零个或多个字符组成的有限序列,又叫做字符串 串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的.线性表更关注的是单个元素的操作CURD,串则是关注查找子串的位置,替换等操作. 当然不同的高级语言对串的基本操作都有不同的定义方法,但是总的来说操作的本质都