有的時候我們要對訊源的某些段落再做加工,例如有些段落雜訊很多,要用 NR 處理,有些段落要用去交錯處理,而我們不想用 Decomb 的去交錯,想用 KernelDeinterlace 來做處理,假設 KernelDeinterlace 對這個段落的去交錯效果較好,我們可以分段
clip=Mpeg2Source("120fps.d2v")
a=clip.trim(0,47894).Telecide(order=1,post=2,vthresh=83,dthresh=13,blend=true,ovr="120fps.tel.avs")
b=clip.trim(47895,51654).KernelDeint(order=1)
c=clip.trim(51655,0).Telecide(order=1,post=2,vthresh=83,dthresh=13,blend=true,ovr="120fps.1.tel.avs")
source=a+b+c
return source
如果只是某一段要用 NR 的 filter,我們可以寫一個 FilterRange 的 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
}
然後像這樣呼叫使用
FilterRange(6910, 6910, "AU_WAVELET3DNR2()")
這樣就只會對 6910 單一這張 frame 做 NR。
你可能會覺得奇怪,怎麼我上面都沒有用 Decomb 的 Decimate(cycle=5) 這個指令,把 Telecide 組合出來的 30 張 progressive 畫面,每五張刪除一張,還原回 24fps?
如果是純 24fps 訊源,加上 Decimate(cycle=5) 就對了,但是接下來我們要說的是 120fps 的做法,所以不加上 Decimate(cycle=5)。
把沒有加上 Decimate(cycle=5) 的 .avs 用 Avisynth 附的 makeAVIS 這個工具,轉成一個虛擬的 .avi 檔。
然後用 FPSCHK 這個工具開啟這個虛擬的 avi 檔,讓它掃瞄一次,分析這個影片哪些段落是 24fps,哪些段落是 30fps。
我把以前寫的東西轉貼過來
==
1. 用 FPSCHK 載入 .d2v 文件,掃瞄影片哪些部分是 24p,哪些部分是 30p,將結果存成一個 .idx 文件。
FPSCHK, Dec60, AVI60 在這裡下載
http://www.geocities.co.jp/SiliconV...Sunnyvale/3109/
FPSCHK 和 Dec60 在「過去的遺物」裡面。
2. avisynth 的 script
LoadPlugin("MPEG2Dec3dg.dll")
LoadPlugin("decomb510.dll")
LoadPlugin("loadpluginex.dll")
LoadPluginEx("dec60.dll")
Mpeg2Source("120fps.d2v")
Telecide()
Dec60(idxfile="120fps.idx",deint=false)
由於 Dec60 是 Avisynth 2.0x 的 plugin,必須用 LoadPluginEx 才能在 2.5x 版載入。
loadpluginex.dll 在 warpsharp 的壓縮包裡面有附
http://www.geocities.co.jp/SiliconValley-PaloAlto/2382/
Telecide 是 Decomb 的指令,經過 Telecide 後,畫面會還原回 30fps progressive 的畫面,
其中 24p 的部分每五張會有一張重複的,30p 的部分則是每一張都是不同的畫面。
本來 Telecide 之後我們會用 Decomb 的另外一個指令 Decimate(cycle=5),把每五張重複的那一張刪除,但是 24p/30p 混合的情況,我們要保留所有 30p 的畫面,只有 24p 的部分才要刪除重複畫面,所以不能用 Decimate 刪除,要改用 Dec60。
Dec60 會根據 FPSCHK 分析 .d2v 文件得到的 .idx 索引,刪除 24p 部分重複的那一張,保留 30p 全部的畫面。
3. 然後依照一般的程序送進去壓縮。
4. 壓好的 AVI 再送給 AVI60 去插 null frame,AVI60 會依照索引檔,24p 的部分每一張後面插入四張 null frame,30p 的部分每一張後面插入三張 null frame。
代碼:
[A B C D] [E F G H I]
24p 30p
[A A A A A B B B B B C C C C C D D D D D
E E E E F F F F G G G G H H H H I I I I]
120p
重複的 Frame 標記為 Drop Frame,不必壓縮
[A d d d d B d d d d C d d d d D d d d d
E d d d F d d d G d d d H d d d I d d d]
5. 大功告成。
進一步研究
1. FPSCHK 分析 .d2v 文件,判斷的結果不十分正確,通常是不正確的。
因為 .d2v 的內容是原始 MPEG-2,交錯的情況很複雜,MPEG-2 本身也許也有用到 IVTC,讓判斷更困難,所以很容易出錯。
我們可以改成不要用 .d2v 來分析,改成分析 Telecide 之後的文件。
LoadPlugin("MPEG2Dec3dg.dll")
LoadPlugin("decomb510.dll")
LoadPlugin("loadpluginex.dll")
LoadPluginEx("dec60.dll")
Mpeg2Source("120fps.d2v")
Telecide()
把這個 .avs 用 ffvfw 的 makeAVIS 轉成索引的 .avi 文件。
用 FPSCHK 載入這個 avi 文件,分析這個 avi 文件。
這樣的正確率會提高非常多,只剩下一些部分需要手動再指定一下,這個部分完全是 GUI 圖形介面,很容易操作。
2. Dec60 刪除 24p 的部分,有時會刪除到不該刪除的 frame,想要改正,但是在視窗中又無法修改。
可以直接從 .idx 文件中修改。
代碼:
Field=0
NumFrames=42738
Total=42738
AvailFrames=34272
TargetFile=N:\120fps.avi
# 0 (00:00:00) - 2213 (00:01:13) 24fps ?𥹉 2214 (00:01:13)
# 2214 (00:01:13) - 2506 (00:01:23) 30fps ?𥹉 293 (00:00:09)
# 2507 (00:01:23) - 2598 (00:01:26) 24fps ?𥹉 92 (00:00:03)
# 2599 (00:01:26) - 2660 (00:01:28) 30fps ?𥹉 62 (00:00:02)
# 2661 (00:01:28) - 42738 (00:23:46) 24fps ?𥹉 40078 (00:22:17)
0,1
1,9
2,1
3,1
4,1
5,9
6,1
7,1
8,1
9,1
.....
第一個數字是 frame number,"," 後面 9 代表刪除,1 代表保留。
將你想要刪除的 frame 手動改成 9,將你想要保留的 frame 改成 1。
注意 24p 的部分每五張要刪除一張,如上面所示。
==