FFMPEG sws scale演算法效能測試

2021-06-26 11:38:47 字數 3114 閱讀 3656

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

簡單說一下測試環境,我使用的是dell的品牌機,i5的cpu。ffmpeg是2023年8月左右的當時最新版本編譯而成,我使用的是其靜態庫版本。

sws_scale的演算法有如下這些選擇。

[cpp]view plain

copy

#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相似。

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

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

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

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

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

[plain]view plain

copy

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  

KNN,TC text category 基本演算法

knn分類演算法 knn分類演算法是一種傳統的基於統計的模式識別方法。演算法思想很簡單 對於一篇待分類文件,系統在訓練集中找到k個最相近的鄰居,使用這k個鄰居的類別為該文件的候選類別。該文件與k個鄰居之間的相似度按類別分別求和,減去乙個預先得到的截尾閾值,就得到該文件的類別測度。用knn也表示所選k...

日常練習 算

問題背景 zhx幫他妹子做數學題。問題描述 求 如 n 3,m 3,這個值為1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 56。輸入格式 僅一行,包含兩個數 n和 m.輸出格式 僅一行,包含所求的答案 mod10 9 7的值。樣例輸入 3 3 樣例輸出 資料範圍與規定 對於...

遞迴算年齡

問題描述1 第1個人10歲,第2個人比第乙個人大3歲,第3個人比第2個人大3歲 第8個人比第7個人大3歲,那麼第8個人是多少歲?public class getage 測試 public static void main string args 問題描述2 第8個人的年齡是36歲,第7個人比第8個人...