`

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次。

 

原文地址:http://www.cnblogs.com/acloud/archive/2011/10/29/sws_scale.html

 

更新(2014.8.5)================

FFmpeg使用不同sws_scale()缩放算法的命令示例(bilinear,bicubic,neighbor):

 

ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bilinear -pix_fmt yuv420p src01_bilinear_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags bicubic -pix_fmt yuv420p src01_bicubic_1280x720.yuv
ffmpeg -s 480x272 -pix_fmt yuv420p -i src01_480x272.yuv -s 1280x720 -sws_flags neighbor -pix_fmt yuv420p src01_neighbor_1280x720.yuv



 

分享到:
评论

相关推荐

    sws_scale参考资料

    `sws_scale`是FFmpeg库中的一个关键函数,它用于图像缩放和色彩空间转换。FFmpeg是一个开源的多媒体处理框架,广泛应用于音视频编解码、转码、流媒体处理等领域。`sws_scale`是FFmpeg的图像处理子模块SwScale中的...

    FFmpeg.AutoGen-master_c#ffmpeg_FFmpeg.AutoGen_ffmpeg_ladysef_pay

    在"FFmpeg.AutoGen.master_c#ffmpeg_FFmpeg.AutoGen_ffmpeg_ladysef_pay"项目中,"ladysef_pay"可能是指该项目的一个特定分支或特性,可能是针对某种支付场景或者由用户“ladysef”贡献的特殊功能。不过,由于具体...

    libyuv-master.7z

    使用FFMPEG的sws_scale函数在ARM平台转换效率很低,使用libyuv提高转换效率。 使用方法参考这里:https://blog.csdn.net/xiaolong1126626497/article/details/105984222

    Python库 | ffmpeg_progress_yield-0.1.2-py2.py3-none-any.whl

    然后,开发者就可以在Python代码中导入`ffmpeg_progress_yield`库,并开始利用其提供的功能来处理多媒体文件了。在编写代码时,可以参考库的官方文档或GitHub仓库中的示例,了解如何初始化对象、设置参数以及处理...

    leixiaohua_ffmpeg_demo_1.zip

    simplest_ffmpeg_video_filter、simplest_ffmpeg_video_encoder、simplest_ffmpeg_swscale、simplest_ffmpeg_streamer、simplest_ffmpeg_player、simplest_ffmpeg_picture_encodersimplest_ffmpeg_mobile、simplest_...

    ffmpeg_sdl.rar_ffmpeg sdl dshow_ffmpeg播放音乐_sdl_sdl ffmpeg_sdl 音乐

    在本项目中,"ffmpeg_sdl.rar" 提供了一个结合了FFmpeg与SDL(Simple DirectMedia Layer)的示例,用于播放音乐。SDL是一个跨平台的开发库,主要用于游戏开发,但它也支持音频播放和视频渲染。 在描述中提到的"用...

    ffmpeg_ffmpeg_QTqtffmpeg_qt+ffmpeg_QT_DEMO_

    "ffmpeg_ffmpeg_QTqtffmpeg_qt+ffmpeg_QT_DEMO_"这个标题暗示了这是一个关于在QT环境中集成FFmpeg进行多媒体操作的示例项目。描述中的“在qt中测试ffmpeg”进一步确认了这一点,意味着我们将探讨如何在QT应用中使用...

    FFMPEG_delphi_demo.rar_delphi ffmpeg.exe_delphi 流媒体_ffmpge delph

    你可以通过分析 `testUnit1.dcu` 文件了解如何调用 FFmpeg API,如 `avcodec_open2` 打开解码器,`avcodec_decode_video2` 进行解码,以及 `sws_getContext` 和 `sws_scale` 进行色彩空间转换。同时,还需要了解如何...

    simplest_ffmpeg_decoder.zip_FFmpeg解码_ffmpeg_ffmpeg visual c_ffmp

    解码完成后,原始的像素数据可能还需要进行色彩空间转换或像素格式转换,这可以通过`sws_getContext`和`sws_scale`函数实现,这部分功能由FFmpeg的libswscale库提供。最后,这些像素数据可以显示在屏幕上或者进行...

    play_FFMpeg+SDL_Qt+FFMPEG+SDL_qtffmpeg_ffmpeg_ffmpegsdl_

    总之,"play_FFMpeg+SDL_Qt+FFMPEG+SDL_qtffmpeg_ffmpeg_ffmpegsdl_"项目展示了如何利用FFmpeg进行视频解码,通过SDL进行渲染,以及使用Qt构建用户界面,形成一个完整的H264视频播放器。这样的项目对于深入理解和...

    ffmpeg_dsl_camera.rar_55_ffmpeg_ffmpeg 64_ffmpeg camera_ffmpeg 库

    在"ffmpeg_dsl_camera.cpp"源码中,你可以看到这些功能是如何实现的,包括错误处理、内存管理以及可能的性能优化。由于 FFmpeg 是跨平台的,这个源码应该可以适应多种操作系统,只需根据目标环境调整相应部分。 ...

    simplest_ffmpeg_player_2.zip_ffmpeg sdl_ffmpeg vc_ffmpeg 播放_ffmp

    5. **图像处理与渲染**:解码得到的是 YUV 像素数据,需要通过 sws_scale 转换成 RGB 格式,以便 SDL 可以渲染。然后使用 SDL 的 RenderCopy 函数将图像渲染到窗口上。 6. **事件处理与播放控制**:监听用户的键盘...

    windows版 ffmpeg_qsv_cuvid_x64.zip

    标题 "windows版 ffmpeg_qsv_cuvid_x64.zip" 提供了关键信息,表明这是一个针对Windows 64位系统设计的FFmpeg版本,特别优化了qsv和cuvid硬件加速技术。这意味着这个软件包可以充分利用Intel和NVIDIA显卡的硬件能力...

    cap_ffmpeg_impl.hpp

    通过查看make过程中的错误知道,问题出在OpenCV-2.3.0/modules/highgui/src/cap_ffmpeg_impl.hpp文件中, 参考 https://code.ros.org/trac/opencv/ticket/1020 中 ffmpeg_build.patch 和 ffmpeg_build_2.patch 对 ...

    FFmpeg_audio_video_demo_ios

    FFmpeg_audio_video_demo_ios 是一个基于iOS平台的项目,它演示了如何利用FFmpeg库进行音频和视频处理。FFmpeg是一个强大的开源项目,包含了多种工具和库,用于处理多媒体数据,包括音视频编码、解码、转码、流媒体...

    opencv_3rdparty-ffmpeg-master_20161202.zip

    1. 将“..\opencv_3rdparty-ffmpeg-master_20160715\ffmpeg” 目录中的ffmpeg_version.cmake、opencv_ffmpeg.dll、opencv_ffmpeg_64.dll 三项复制到 “path to your OpenCV\opencv\sources\3rdparty\ffmpeg” 目录下...

    simplest_ffmpeg_player.zip_ffmpeg_ffmpeg player C++_ffmpeg 播放器_f

    5. **渲染视频帧**:解码后的原始像素数据通常需要转换为显示格式,这可以通过 `sws_getContext()` 和 `sws_scale()` 使用 SwSCALE 库完成。然后,这些像素数据可以传递给图形库,如 SDL 或 OpenGL 进行渲染。 6. *...

    ffmpeg-4.1-1.4.4_ffmpeg+rtsp_ffmpeg4_ffmpeg-1.4.4_ffmpeg_Libvide

    在“ffmpeg-4.1-1.4.4_ffmpeg+rtsp_ffmpeg4_ffmpeg-1.4.4_ffmpeg_Libvideocapture”这个标题中,我们可以看到几个关键组件,它们构成了FFmpeg与RTSP(Real-Time Streaming Protocol)相关的应用。 1. **FFmpeg 4.1*...

    qt_ffmpeg_rtsp_rtsp取流_qtffmpeg流媒体_qt+ffmpeg_QT_qt_ffmpeg_rtsp

    总结起来,"qt_ffmpeg_rtsp_rtsp取流_qtffmpeg流媒体_qt+ffmpeg_QT_qt_ffmpeg_rtsp"这个主题涉及到的是在Qt环境中,利用FFmpeg库进行RTSP视频流的拉取、解码和播放。开发者需要熟悉FFmpeg的API以及Qt的多媒体处理...

    ffmpeg_read_ffmpeg_

    这可能涉及到`sws_getContext`和`sws_scale`函数,使用SwScale库进行色彩空间转换。 5. 错误处理与资源释放: 在处理完音视频数据后,记得关闭输入文件、释放解码器上下文、`AVPacket`和`AVFrame`等资源,避免内存...

Global site tag (gtag.js) - Google Analytics