经常用到ffmpeg中的sws_scale来进行图像缩放和格式转换,该函数可以使用各种不同算法来对图像进行处理。以前一直很懒,懒得测试和甄别应该使用哪种算法,最近的工作时间,很多时候需要等待别人。忙里偷闲,对ffmpeg的这一组函数进行了一下封装,顺便测试了一下各种算法。
简单说一下测试环境,我使用的是Dell的品牌机,i5的CPU。ffmpeg是2010年8月左右的当时最新版本编译而成,我使用的是其静态库版本。
sws_scale的算法有如下这些选择。
首先,将一幅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`是FFmpeg库中的一个关键函数,它用于图像缩放和色彩空间转换。FFmpeg是一个开源的多媒体处理框架,广泛应用于音视频编解码、转码、流媒体处理等领域。`sws_scale`是FFmpeg的图像处理子模块SwScale中的...
在"FFmpeg.AutoGen.master_c#ffmpeg_FFmpeg.AutoGen_ffmpeg_ladysef_pay"项目中,"ladysef_pay"可能是指该项目的一个特定分支或特性,可能是针对某种支付场景或者由用户“ladysef”贡献的特殊功能。不过,由于具体...
使用FFMPEG的sws_scale函数在ARM平台转换效率很低,使用libyuv提高转换效率。 使用方法参考这里:https://blog.csdn.net/xiaolong1126626497/article/details/105984222
然后,开发者就可以在Python代码中导入`ffmpeg_progress_yield`库,并开始利用其提供的功能来处理多媒体文件了。在编写代码时,可以参考库的官方文档或GitHub仓库中的示例,了解如何初始化对象、设置参数以及处理...
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(Simple DirectMedia Layer)的示例,用于播放音乐。SDL是一个跨平台的开发库,主要用于游戏开发,但它也支持音频播放和视频渲染。 在描述中提到的"用...
"ffmpeg_ffmpeg_QTqtffmpeg_qt+ffmpeg_QT_DEMO_"这个标题暗示了这是一个关于在QT环境中集成FFmpeg进行多媒体操作的示例项目。描述中的“在qt中测试ffmpeg”进一步确认了这一点,意味着我们将探讨如何在QT应用中使用...
你可以通过分析 `testUnit1.dcu` 文件了解如何调用 FFmpeg API,如 `avcodec_open2` 打开解码器,`avcodec_decode_video2` 进行解码,以及 `sws_getContext` 和 `sws_scale` 进行色彩空间转换。同时,还需要了解如何...
解码完成后,原始的像素数据可能还需要进行色彩空间转换或像素格式转换,这可以通过`sws_getContext`和`sws_scale`函数实现,这部分功能由FFmpeg的libswscale库提供。最后,这些像素数据可以显示在屏幕上或者进行...
总之,"play_FFMpeg+SDL_Qt+FFMPEG+SDL_qtffmpeg_ffmpeg_ffmpegsdl_"项目展示了如何利用FFmpeg进行视频解码,通过SDL进行渲染,以及使用Qt构建用户界面,形成一个完整的H264视频播放器。这样的项目对于深入理解和...
在"ffmpeg_dsl_camera.cpp"源码中,你可以看到这些功能是如何实现的,包括错误处理、内存管理以及可能的性能优化。由于 FFmpeg 是跨平台的,这个源码应该可以适应多种操作系统,只需根据目标环境调整相应部分。 ...
5. **图像处理与渲染**:解码得到的是 YUV 像素数据,需要通过 sws_scale 转换成 RGB 格式,以便 SDL 可以渲染。然后使用 SDL 的 RenderCopy 函数将图像渲染到窗口上。 6. **事件处理与播放控制**:监听用户的键盘...
标题 "windows版 ffmpeg_qsv_cuvid_x64.zip" 提供了关键信息,表明这是一个针对Windows 64位系统设计的FFmpeg版本,特别优化了qsv和cuvid硬件加速技术。这意味着这个软件包可以充分利用Intel和NVIDIA显卡的硬件能力...
通过查看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 是一个基于iOS平台的项目,它演示了如何利用FFmpeg库进行音频和视频处理。FFmpeg是一个强大的开源项目,包含了多种工具和库,用于处理多媒体数据,包括音视频编码、解码、转码、流媒体...
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” 目录下...
5. **渲染视频帧**:解码后的原始像素数据通常需要转换为显示格式,这可以通过 `sws_getContext()` 和 `sws_scale()` 使用 SwSCALE 库完成。然后,这些像素数据可以传递给图形库,如 SDL 或 OpenGL 进行渲染。 6. *...
在“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视频流的拉取、解码和播放。开发者需要熟悉FFmpeg的API以及Qt的多媒体处理...
这可能涉及到`sws_getContext`和`sws_scale`函数,使用SwScale库进行色彩空间转换。 5. 错误处理与资源释放: 在处理完音视频数据后,记得关闭输入文件、释放解码器上下文、`AVPacket`和`AVFrame`等资源,避免内存...