瀏覽單個文章
Shade
Senior Member
 
Shade的大頭照
 

加入日期: Oct 2002
您的住址: El's room
文章: 1,046
OMAKE:
如果我想用全程 YUY2,但是又不喜歡 Avisynth 的 IVTC,AviUtl 又不能一張一張選,TMPGEnc 又是 RGB24,要怎麼讓 Avisynth 能使用 TMPGEnc 的 IVTC 呢?
Avisynth 有一個 TPRIVTC.dll 的 plugin,這個 plugin 可以讀取做好 IVTC 的 TMPGEnc 專案檔 .tpr,使用裡面選取的 IVTC 設定,直接在 Avisynth 裡面輸出同樣的 IVTC 結果。
也就是說先如往常一樣用 TMPGEnc 做好 IVTC,然後用 Avisynth 讀取這個做好 IVTC 的專案檔
MPEG2VIDEO("sample.vob")
LoadPlugin("c:\Program Files\AviSynth 2.5\plugins\TPRIVTC.dll")
# 將 frame 用 DoubleWeave 展開,變成 60fps,如同 TMPGEnc 的 IVTC 視窗的每個小畫面,然後送進 TPRIVTC,依照 .tpr 的設定選取指定的正確畫面(TMPGEnc 中用紅框選取的畫面)輸出
DoubleWeave().TPRIVTC("sample.tpr")

這樣就可以用 TMPGEnc 做 IVTC,而且全程 YUY2
不過 TPRIVTC.dll 有限制
1. 不支援 .tpr 中指定的 copy frame
2. 不支援 .tpr 中指定的自適應去交錯法(adaptive deinterlace)

不是所有的素材都可以完美地 IVTC,有時候使用 deinterlace 是必要的。
然而 TPRIVTC 不支援 TMPGEnc 的自適應去交錯法,只能用 odd/even/double,效果不好。
所以我們後面可以再接 Avisynth 的去交錯 filter 做去交錯。
但是用 Avisynth 做去交錯,例如用 Decomb,每張 frame 都要判斷,很花時間,而且有時候會誤判,將輕微地抖動當成 interlace,也對畫面做去交錯,影響清晰度,不完美。
所以如果所做影片很短,我們在 TMPGEnc 中做 IVTC 時已經知道哪幾個 frame 有交錯需要去交錯,可以在 Avisynth 中做"單張去交錯",指定選取範圍,所使用的 filter 只對這些畫面做處理。
這樣不但可以更加精確,只對需要處理的畫面做處理,而且處理速度亦會加快。
首先要寫一個選擇範圍,加上 filter 的 function
代碼:
function FilterRange(clip "clip", int "start", int "end", string "filter")
{
	c1 = start < 2 ? clip.trim(0, -1) : clip.trim(0, start - 1)
	c2 = Eval("clip.trim(start, end)." + filter)
	c3 = clip.trim(end + 1, 0)
	c = start == 0 ? c2 : c1 + c2
	c = end == 0 ? c : c + c3
	return c
}

這個 function 的意思是將 clip 分成三段,對中間要處理的畫面做完 filter 之後,再把頭尾接起來。
寫好之後存成 function.avs 保留起來。
在你目前要處理的 avs 開頭加上
Import("c:\Program Files\AviSynth 2.5\avs\function.avs")

然後就可以在這個 avs 中使用我們寫好的 FilterRange 函式,例如
FilterRange(1163, 1164, "AntiComb(48, 34)") # 對 1163, 1164 frame 單獨使用 AntiComb 這個 filter

像這種有用的函式很多,可以一一加入 function.avs,以後在 avs 檔的開頭 Import,就可以直接在那個 avs 檔中使用這些函式,不用每次都要重寫一次。
例如前面說的 VFAPI 載入函式,也可以通通寫成一個 VFAPI.avs,使用的時候
Import("c:\Program Files\AviSynth 2.5\avs\VFAPI.avs")

然後直接用就好了。
VFAPI.avs 中可能的內容為
代碼:
#######################
# VFAPI Plugin        #
# Import("vfapi.avs") #
#######################

#####################################################
# 下面請根據你使用的環境,置換檔案所在的正確路徑    #
#####################################################

# AviUtl
global aup_dir = "e:\WinApps\AviUtl"
# TMPGEnc
global tpr_dir = "e:\WinApps\TMPGEnc"
# DVD2AVI
global d2v_dir = "e:\WinApps\DVD2AVI"
# MPEG2 VIDEO VFAPI Plugin
global m2v_dir = "e:\WinApps\TMPGEnc"
# QuickTime 4.0 VFPAPI Plugin
global mov_dir = "e:\WinApps\TMPGEnc"
# CSTR File Reader
global str_dir = "e:\WinApps\TMPGEnc"

########################################
# VFAPISource function                 #
#                                      #
# AviUtl (.aup)                        #
#  VFAPISource("AUP","path\foo.aup")   #
# DVD2AVI                              #
#  VFAPISource("D2V","path\foo.d2v")   #
# TMPGEnc                              #
#  VFAPISource("TPR","path\foo.tpr")   #
# MPEG2 VIDEO VFAPI Plugin             #
#  VFAPISource("M2V","path\foo.vob")   #
# QuickTime 4.0 VFPAPI Plugin          #
#  VFAPISource("MOV","path\foo.mov")   #
# CSTR File Reader                     #
#  VFAPISource("CSTR","path\foo.cstr") #
########################################

function VFAPISource(string "vf", string "fn")
{
  default(vf,"D2V")
  vf = (vf=="D2V") ? d2v_dir + "\DVD2AVI.vfp" :
     \ (vf=="AUP") ? aup_dir + "\aviutl.vfp" :
     \ (vf=="TPR") ? tpr_dir + "\TMPGEnc.vfp" :
     \ (vf=="M2V") ? m2v_dir + "\m2v.vfp" :
     \ (vf=="MOV") ? mov_dir + "\QTReader.vfp" :
     \ (vf=="CSTR") ? str_dir + "\CSTR.VFP" : 0

  LoadVFAPIPlugin(vf, "_VFAPISource")
  FlipVertical(_VFAPISource(fn))
}

使用的時候,例如
VFAPISource("AUP","sample.aup")

這樣就能在 Avisynth 中開啟 AviUtl 的專案檔 .aup。
諸如此類的範例 avs,日本很多
舊 2003-06-08, 06:55 AM #99
回應時引用此文章
Shade離線中