ffmpeg中的sws scale演算法效能測試

2021-06-18 12:32:36 字數 3021 閱讀 1348

經常用到ffmpeg中的sws_scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。

簡單說一下測試環境,我使用的是dell的品牌機,i5的cpu。ffmpeg是2023年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

影象無明顯失真,感覺效果很不錯。

sws_bilinear

感覺也很不錯,比上乙個演算法邊緣平滑一些。

sws_bicubic

感覺差不多,比上上演算法邊緣要平滑,比上一演算法要銳利。

sws_x

與上一影象,我看不出區別。

sws_point

細節比較銳利,影象效果比上圖略差一點點。

sws_area

與上上演算法,我看不出區別。

sws_bicublin

同上。sws_gauss

相對於上一演算法,要平滑(也可以說是模糊)一些。

sws_sinc

相對於上一演算法,細節要清晰一些。

sws_lanczos

相對於上一演算法,要平滑(也可以說是模糊)一點點,幾乎無區別。

sws_spline

和上乙個演算法,我看不出區別。

總評,以上各種演算法,縮小之後的效果似乎都不錯。如果不是對比著看,幾乎看不出縮放效果的好壞。上面所說的清晰(銳利)與平滑(模糊),是一種客觀感受,並非清晰就比平滑好,也非平滑比清晰好。其中的point演算法,效率之高,讓我震撼,但效果卻不差。此外,我對比過使用cimage的繪製時縮放,其幀率可到190,但效果慘不忍睹,顏色嚴重失真。

第二個試驗,將一幅1024*768的風景影象,放大到1920*1080,並進行渲染(此時的渲染時間,雖然不是忽略不計,但不超過5ms的渲染時間,不影響下面結論的相對準確性)。

演算法

幀率

影象主觀感受

sws_fast_bilinear

影象無明顯失真,感覺效果很不錯。

sws_bilinear

和上圖看不出區別。

sws_bicubic

相對上圖,感覺細節清晰一點點。

sws_x

與上上圖無區別。

sws_point

邊緣有明顯鋸齒。

sws_area

邊緣有不明顯鋸齒。

sws_bicublin

與上上上圖幾乎無區別。

sws_gauss

比上圖邊緣略微清楚一點。

sws_sinc

與上上圖無區別。

sws_lanczos

與上圖無區別。

sws_spline

與上圖無區別。

總評,point演算法有明顯鋸齒,area演算法鋸齒要不明顯一點,其餘各種演算法,肉眼看來無明顯差異。此外,使用cimage進行渲染時縮放,幀率可達105,效果與point相似。

當然,如果不計速度追求畫面質量。在上面的演算法中,選擇幀率最低的那個即可,畫面效果一般是最好的。

不過總的來說,ffmpeg的scale演算法,速度還是非常快的,畢竟我選擇的素材可是高畫質的。

(本想順便上傳一下,但各組差異其實非常小,恐怕上傳的時候格式轉換所造成的影象細節丟失,已經超過了各本身的細節差異,因此此處不上傳了。)

注:試驗了一下opencv的resize效率,和上面相同的情況下,opencv在上面的放大試驗中,每秒可以進行52次,縮小試驗中,每秒可以進行458次。

更新(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

ffmpeg中的sws scale演算法效能測試

經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測試環境,我...

ffmpeg中的sws scale演算法效能測試

經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測試環境,我...

ffmpeg中的sws scale演算法效能測試

from 經常用到ffmpeg中的sws scale來進行影象縮放和格式轉換,該函式可以使用各種不同演算法來對影象進行處理。以前一直很懶,懶得測試和甄別應該使用哪種演算法,最近的工作時間,很多時候需要等待別人。忙裡偷閒,對ffmpeg的這一組函式進行了一下封裝,順便測試了一下各種演算法。簡單說一下測...