`

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中的...

    YV12转RGB算法通过ffmpeg

    除了`sws_scale`,FFmpeg还提供了其他如`sws_convertPalette8ToPacked32`这样的函数,用于处理色彩空间转换中的特殊情况,例如从8位调色板颜色空间转换到32位RGB颜色空间。 转换过程中,颜色空间的转换涉及到色彩...

    ffmpeg解码,opencv显示

    因此,可能需要使用sws_scale函数进行色彩空间转换。 - 在转换后,创建一个OpenCV的Mat对象,将AVFrame的数据复制到Mat中。Mat是OpenCV处理图像的基本结构。 - 使用imshow函数,传入Mat对象和窗口名称,即可在窗口...

    ffmpeg制作的超精简视频播放器(含超详细注释) 在6410上可用

    解码后的帧可能是YUV格式,需要通过适当的色彩空间转换算法(如sws_scale)转换为RGB,以适应SDL的显示需求。最后,这些像素数据被传递给SDL渲染器,完成画面更新。 5. 时间管理与同步:播放器需要处理时间戳,确保...

    详解FFMPEG API1

    示例程序中展示了如何使用FFmpeg API进行基本的解码操作,包括包含必要的头文件,定义解码所需的结构体,以及解析命令行参数等。 总的来说,掌握FFmpeg API对于多媒体开发人员至关重要,它提供了处理音视频的强大...

    利用ffmpeg,将rgb编码为h264

    这个过程可以通过FFmpeg库中的函数来实现,例如`sws_scale`,它可以高效地进行色彩空间转换。 完成转换后,接下来的步骤是将YUV420数据编码为H264。H264是一种高效的视频编码标准,它通过帧间预测、熵编码、运动...

    ffmpeg解码h264

    FFmpeg的`sws_scale()`函数可以用于这些转换。 7. **资源释放**:解码完成后,记得释放所有分配的资源,如解码上下文、解码器和帧对象。 在实际应用中,这个过程通常会封装在一个循环里,持续读取、解码和显示视频...

    H264数据解压后YUV显示

    处理完YUV数据后,可以使用`sws_scale()`函数将YUV数据转换为其他格式,如RGB,以便在屏幕上显示。 6. **实际应用**: 这种H264解码并处理YUV数据的技术在许多领域都有应用,如视频播放器开发、实时视频处理、视频...

    ffplay源码分析

    - **帧缓冲管理**:解码后的视频帧会被放入帧缓冲区,ffplay使用`sws_scale()`函数进行色彩空间转换,以适应显示设备的要求。 3. **音频流处理** - **解码**:与视频类似,音频流也需要经过解码。ffplay使用适当...

Global site tag (gtag.js) - Google Analytics