其實我一直對於從一些日系高階電視的影片動態補償(增加影片framerate)一直蠻有興趣,後來也花了
大錢買日本水貨電視. 不過我心裏一直在想, 這個功能難道用PC運算做不到嗎? 在我沒事爬文的時候
突然爬到這一篇:
http://forums.guru3d.com/showthread.php?t=288017
後來著手試了一下, 的確是有明顯的動作平滑效果!! 不過因為討論都是英文,所以我做了個整理並
抓圖讓大家能夠更清楚.
本篇是參考這一篇:
http://forums.guru3d.com/showpost.php?p=3557786&postcount=199
寫的, 感謝作者的整理~
一.事前準備:
1.如果可以的話,儘量準備一個乾淨的, 沒有安裝codec的環境.(當然如果你很熟悉codec的操作那就隨便)
2.下載下面的軟體:
AViSynth: 這邊是使用258版
http://sourceforge.net/projects/avisynth2/
AviSynth Multi-Thread支援:
借用一下guru3d討論串的連結, 對應AviSynth 258版.
http://www.mediafire.com/file/nnbngfccnj2/avisynth258MT.7z
ffdshow最新版: 這個請各位自己google下載.
防止ffdshow當掉的dll:不知道為什麼沒有這個dll,當AviSynth跟ffdshow一起使用的話,ffdshow會當掉.
同樣借用guru3d討論串的連結:
http://www.megaupload.com/?d=SP5FE2KG
楨數加倍的plugin mvtools2
http://avisynth.org.ru/mvtools/mvtools2.html#download
(Optional)CoreAVC: 調用CoreAVC是為了使用這個codec的硬解功能,讓CPU的效能可以完全用來處理
畫面楨數加倍的工作. 不過可有可無~ (ffdshow的h.264 codec好像也有硬解功能,不過我沒試過)
Media Player Classic – Home Cinema (MPC HC):
http://mpc-hc.sourceforge.net/
二.安裝軟體:
安裝軟體似乎有一定順序, 所以請務必用下列順序安裝!
1.安裝AviSynth
2.安裝AviSynth Multi-Thread支援:
將下載下來的檔案解開,把plugins目錄裏的檔案拷貝到AviSynth的安裝目錄中的plugins目錄並覆蓋過去!
將avisynth.dll拷貝到Windows安裝目錄\system32\目錄並覆蓋過去. (由於我沒有64位元Windows,依guru3d
的討論串,是copy到SysWOW64目錄中,我沒有驗證過).
3.將mvtools2解開,並將mvtools2.dll拷貝到AviSynth的安裝目錄中的plugins目錄.
4.安裝ffdshow, 並在安裝時「取消勾選」VFW介面,並把所有AviSynth的選項勾起來,如下圖所示:
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-dbdac91e26c008fd6bbb7e8704887979.jpg)
安裝完畢後勾選「執行視訊解碼器組態」
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-ddca6d27dda8c35aff570921bfbcb6da.jpg)
二.設定組態:
1.設定ffdshow的組態:
a.選擇左邊目錄的「輸出」部份,勾選「高品質的YV12到RGB轉換」
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-bef93ac6085dcbe67163b5f07dbe5d25.jpg)
b.將左邊目錄的AviSynth打勾,並調整以下項目:
取消勾選 「加入ffdshow視訊來源.
輸入空間色彩只勾選YV12,其它取消勾選.
勾選「向前/向後緩衝」
加入楨數加倍的script, 在底下的空白區貼上下面的程式碼:
SetMemoryMax(1280)
SetMTMode(5,4)
ffdShow_source()
SetMTMode(2)
super=MSuper(pel=1, hpad=0, vpad=0)
backward_1=MAnalyse(super, chroma=false, isb=true, blksize=16, blksizev=16, searchparam=3, plevel=0, search=3, badrange=(-24))
forward_1=MAnalyse(super, chroma=false, isb=false, blksize=16, blksizev=16, searchparam=3, plevel=0, search=3, badrange=(-24))
backward_2 = MRecalculate(super, chroma=false, backward_1, blksize=8, blksizev=8, searchparam=0, search=3)
forward_2 = MRecalculate(super, chroma=false, forward_1, blksize=8, blksizev=8, searchparam=0, search=3)
MBlockFps(super, backward_2, forward_2, num=FramerateNumerator(last)*2, den=FramerateDenominator(last)*1, mode=0)
SetMTMode(1)
GetMTMode(false) > 0 ? distributor() : last
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-bab12c7bd7b09931af18670ebcef9d8b.jpg)
按下套用,確認.
6.將防止ffdshow當掉的dll的壓縮檔解開,並將裏面兩個.dll(Msvcp71.dll及msvcr71.dll)拷貝到Windows
安裝目錄下的system32目錄或SysWOW64目錄.像我公司的電腦因為有裝Visual Studio,所以原來就有這兩個
檔案. 不過我家裏的Windows7不拷貝這兩個檔案就會當掉....
7.(選擇性)設定使用CoreAVC作為解碼器(有裝CoreAVC才要做這個步驟)
a.打開ffdshow的組態畫面, 選擇編解碼器, 並在右邊的視窗找到H.264/AVC,並把解碼器設為「已停用」.
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-ab2627f53973e46bf4c0e51cbf9072e2.jpg)
b.接著把右邊的畫面捲到最下面,有一個「未經處理視訊」,在解碼器這一欄選擇「all supported」.套用,確認.
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-a74a1e7ac47412c83e7c2359f2a2e14e.jpg)
c.打開MPC HC,選擇「檢視」->「設定選項」->「外部篩選器」,選「新增篩選器」加入CoreAVC Video Decoder,
並把CoreAVC Video Decoder設為「偏好」.(如果CoreAVC沒有在第一個位置,請選擇上移,移到第一個).
d.用MPC HC打開任何一個用h.264編碼的影片,Windows右下方的圖示應該會同時出現ffdshow跟CoreAVC的圖示.
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-3c10f6555b0ed3bf8f5462f220b77ac1.jpg)
三.播放測試:
1.執行MPC HC, 隨便打開一個h.264編碼的影片(其實只要是ffdshow能解的都可以,不過我們以h.264的影片做為標準
來測試).
2.選擇「檢視」把「統計列」勾選,底下會有一個「影格頻率」,如果成功的話會發現framerate(影格頻率)會變成原來
的一倍! 例如24fps的影片會變成48fps左右. 而原來是30fps的影片,會變成60fps左右. 另外CPU的使用率會衝得非常
高! 因為這個動態預測跟運算中間畫面的功能是完全由CPU來執行的.
![[教學]用你的PC來達成高階電視才有的畫面動態補償功能!!](http://attach.mobile01.com/attach/201005/mobile01-e6bdec325a352a896697bd4e6a3befcf.jpg)
這個時候只要電腦不要太差,應該能明顯感受到畫面的移動變平順了(尤其是平移的畫面感覺特別明顯).
四.進階微調:
1.如果要固定更新率為60hz:
把AviSynth的script中的:
MBlockFps(super, backward_2, forward_2, num=FramerateNumerator(last)*2, den=FramerateDenominator(last)*1, mode=0)
改成
MBlockFps(super, backward_2, forward_2, num=60, den=1, mode=0)
其中的num=後面接的東西就是影格頻率的期望值, 例如想要有120hz的更新率, num=後面就改成120.
如果是要三倍framerate,num=後面就改成FramerateNumerator(last)*3.
以此類推.
2.變更ffdshow組態中,AviSynth的「向前/向後緩衝」數值.
這代表使用多少個畫面做內插運算的輸入,原本內定的數值是10/10, 可以試著改成0/10或0/24或其它數字看看.
另外因為這個方法會參考前後畫面來計算,所以會犧牲掉正常快轉或跳到某一個時間點的功能,變成畫面會怪怪的,
幾秒鐘之後才會正常.
3.如果使用四核或更多核心CPU:
把AviSynth的script中的 SetMTMode(5,4) 改成 SetMTMode(5,8) 或自行實驗數據.
4.畫面破碎(artifacts)
用這個方法會有一個問題,在某些動態畫面可能會有畫面破碎的問題.做一些微調可能有助於改善這個問題.
(我都沒試過,請自己試看看)
把MBlockFps參數最後一個的 mode=0 改成 mode=1 ,「可能」有助於改善畫面破碎的問題.
把MBlockFps參數 plevel=0 改成 plevel=2 會減少畫面破碎但是會減少動態平順度.
如果你的CPU還撐得住,把MBlockFps參數的 pel=1 改成 pel=2 會增加動態偵測的精確度, 不過會大量消耗CPU資源.
五.如果前面對你來說實在太困難....
已經有影片播放軟體叫Splash,「準備」加入這個功能了~(就是將來會有,現在還沒),如果真的上面講的東西
對你來說太困難,也許可以等到Splash Player把這個畫面動態補償功能加進來.
http://www.mirillis.com/splash.html
六.結論:
其實這個方法如果再研究一下,是可以把它套用在轉檔上, 讓轉出來的影片直接就是48fps或60fps了.
雖然這個利用PC做畫面動態補償還是有些問題, 不過能夠讓一些沒有這個功能的電視或投影機,多少能先感受
一下影片framerate倍增的威力. 如果有問題歡迎討論~謝謝~