筆者隨便錄了一段 Discovery 流言終結者 2006 Q2 的 60 sec 影像,用的是飛馬牌 MJPEG Q18 的設定,480x480x29.97fps 影像,長度 110 MB (平均流量 13866 Kbps)
AMD Athlon64 3200+ 不超頻,1.350v@2000Mhz (HT 1007Mhz)
創見 UCCC 1GB*2 跑雙通道,3-3-3-8@400Mhz (未超頻)
nVidia 7300GS 256MB 不超頻,550Mhz core,810Mhz memory.
Forceware 91.45 beta
VirtualDubMod 1.5.10.2 build 2542
Avisynth 2.55
FFT3DFilter 1.85
FFT3DGPU 0.82 (原始程式同步 FFT3DFilter 1.85)
FFTW Library 3.1.2 (FFT3DFilter 需要用的程式庫)
Avisynth Script 檔內容如下 (GPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\Test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dGPU.dll")
FFT3DGPU(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
Avisynth Script 檔內容如下 (CPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\Test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dFilter.dll")
FFT3DFilter(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
就這樣來跑,輸出檔為 uncompress AVI,目的路徑指向 RAMDisk (用盡一切辦法減少 CPU 負載)
FFT3DGPU 34~36 fps
FFT3DFilter 21~23 fps
然後加入 XVID 壓縮法,AS@L5,VHQ,Turbo,Two-pass of Pass 1
XVID + FFT3DGPU 24~26 fps
XVID + FFT3DFilter 16~19 fps |
一般而言,只用 FFT3DFilter/FFT3DGPU 往往不夠,至少無法去交錯,或是特殊影像楚理,在筆者的測試結果中,如果要 FFT 程式增加處理 U/V 這兩層運算,可說是慢到離譜,於是筆者用 TemporalCleaner 與 DeGrainMedian 這兩個雜訊去除工具,專門針對 U/V 這兩層 Chrominance 的訊號做處理,只 Y 訊號 (Luminance) 交給 FFT 去處理,借重 FFT 處理時不留下人工痕跡的優異特色,處理亮度訊號是最理想的。(早期黑白電視只有 Y 訊號處理,彩色電視才增加 U/V 兩種色相彩度信號)。
Avisynth Script 檔內容如下 (GPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\TemporalCleaner.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\LeakKernelDeint.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\DeGrainMedian.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dGPU.dll")
TemporalCleaner(cthresh=255)
DeGrainMedian(limitUV=32,interlaced=true,norow=true)
FFT3DGPU(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
LeakKernelDeint(order=1,threshold=10,map=false,sharp=false,twoway=true,linked=false)
Avisynth Script 檔內容如下 (CPU 版)
SetMemoryMax(256)
OpenDMLSource("E:\test.avi", audio=false, pixel_type="YV12", fourCC="MJPG")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\TemporalCleaner.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\LeakKernelDeint.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\DeGrainMedian.dll")
LoadPlugin("D:\VirtualDubMod15102\AVISYNTH\FFT3dFilter.dll")
TemporalCleaner(cthresh=255)
DeGrainMedian(limitUV=32,interlaced=true,norow=true)
FFT3DFilter(sigma=7.5,sigma2=2.5,sigma3=2.5,sigma4=5.0,oh=8,ow=8,bt=2,interlaced=true,plane=0)
LeakKernelDeint(order=1,threshold=10,map=false,sharp=false,twoway=true,linked=false)
XVID 壓縮法,AS@L5,VHQ,Turbo,Two-pass of Pass 1
以下是測試總結數據
純 XVID 壓縮,沒有任何 Filter 時,53~56 fps
XVID + TemporalCleaner + DeGainMedian + LeakKernelDeint (就是把 FFT3DFilter/FFT3DGPU 拿掉),39~42 fps
XVID + FFT3DGPU + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,23~27 fps (類似平行運算 CPU + GPU 合力)
XVID + FFT3DFilter + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,16~18 fps (純 CPU 運算)
筆者又用了 X264 (558) 這個仍在研發階段的 MPEG-4 AVC 來編碼
X264 + FFT3DGPU + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,15~20 fps (類似平行運算 CPU + GPU 合力)
X264 + FFT3DFilter + TemporalCleaner + DeGainMedian + LeakKernelDeint 時,10~14 fps (純 CPU 運算)
以平均值來算,FFT3DGPU 以相同效果,總體編碼速度比 FFT3DFilter 提升 (x264) 45.8% (xvid) 47% 可謂相當驚人,何況...這只是 nVidia 7300GS 的顯示卡而已! |