Vfr處理
AviSynth, 可變幀速率(vfr)和混合視頻(hybrid video)
根據幀速率可將視頻分為兩種類型,固定幀速率(CFR)的視頻和可變幀速率(VFR)的視頻.CFR視頻幀速率為恆定值,VFR視頻幀速率為非恆定值.許多視頻編輯程序(例如VirtualDub和AviSynth)都假設VFR視頻的幀速率為恆定值因為AVI不支持VFR.由於一系列的原因,這在不久的將來也是不會改變的.雖然AVI容器不支持VFR,但有一些容器(例如MKV,MP4和WMV/ASF)支持VFR.
混合視頻通常定義為一個混合著pulldown和non-pulldown(pulldown可以是場,標準的3:2 pulldown,或full frame)的視頻.這與pulldown是否是硬性(在回放時 場field/幀frame 重複)或軟性(流stream中加入這標記表明在播放時哪些 場field/幀 frame是重複的)無關.所以,它可以是CFR或VFR.因此,混合視頻是簡單地混合著不同的幀速率(如通常用於動畫的8,12和16fps)原始幀率base framerate是pulldow之前的速率的視頻.這種視頻需要根據內容決定最終的幀速率.
可變幀速率和混合視頻
我們需要知道通常視頻都是CFR的.但是混合視頻轉換成VFR是很常見的VFR的例子. 混合視頻是混合著不同原始幀速率base framerate的視頻 (如通常用於動畫的8,12和16fps). 更常見的混合視頻的例子是由部分隔行掃描interlaced/progressive NTSC (29.97 fps)和部分FILM (膠捲過帶將23.976 fps 轉成29.97 fps)組成的視頻. soft pulldown, NTSC的部分(也叫做視頻video部分)回放速度是29.97 fps和添加重複幀膠捲過帶telecined的部分(23.976 fps轉換至29.97 fps). hard pulldown,沒有增加任何場fields且回放速度是29.97. 另一個混合視頻的例子是現代電視動畫,科幻電視劇例如SG1,星級迷航,TNG和巴比倫5,和很多紀錄片DVD.
TIVTC工具被設計成無損處理混合視頻的,Decomb工具則通過合成來將視頻處理成CFR.
如何分辨VFR視頻(mkv/mp4)
這裡有一些判斷mkv/mp4是否是VFR的方法:
mpeg-2: DGIndex可以檢查Film/Video的比例, 它可以告訴你有多少內容是軟性pulldown的. 它不能處理硬性pulldown, 它也不能準確的識別視頻當視頻中混合著soft pulldown和hard pulldown.
mkv: 用mkv2vfr或mkvtoolnix取出timecodes.txt文件.
mp4: 用mp4dump(from the MPEG4 tools by MPEG4ip package). 打開命令行節目並輸入(使用相對路徑)
mp4dump -verbose=2 holly_xvid.mp4 > log.txt
打開log文件,你會看到類似下面的代碼(看stts部分來找出每一幀的長度):
type stts version = 0 (0x00) flags = 0 (0x000000) entryCount = 41 (0x00000029) sampleCount = 3 (0x00000003) sampleDelta = 1000 (0x000003e8) sampleCount[1] = 1 (0x00000001) sampleDelta[1] = 2000 (0x000007d0) sampleCount[2] = 3 (0x00000003) sampleDelta[2] = 1000 (0x000003e8) sampleCount[3] = 1 (0x00000001) sampleDelta[3] = 2000 (0x000007d0) etc ...
sampleDelta顯示幀frames的長度,sampleCount顯示有多少幀frames. 根據上面的例子我們得到如下數據: 3幀frames顯示長度1000 1幀frames顯示長度2000 3幀frames顯示長度1000 1幀frames顯示長度2000 .......... 顯示長度的值的單位不是秒而是滴答"ticks", 你可以通過時間表"timescale"來計算時間. 時間表"timescale"被存儲在視頻軌track里(確定你看的是正確的軌, 因為每個軌都有它自己的時間表timescale). 找這樣的輸出內容:
type mdia type mdhd ... timeScale = 24976 (0x00006190) duration = 208000 (0x00032c80) language = 21956 (0x55c4) reserved = <2 bytes> 00 00
在本例中時間表timeScale是24976. 大多數幀frames的顯示長度是1000. 1000/24976 = 0.04這意味著前3幀frames每一幀顯示了0.04秒,與25 fps (1/25 = 0.04)是相同的. 下一個幀的顯示長度是2000. 2000/24976 = 0.08這意味著這一幀顯示了0.08秒, 與12.5 fps (1/12.5 = 0.08)是相同的. etc ... 從上面例子中的log文件可以看出這個視頻是混合視頻
在AviSynth中打開MPEG - 2混合視頻並重新編碼
假設你有混合視頻,這裡有列出幾種方法對它進行編碼.第一種方法是將它轉換為cfr視頻(23.976 fps或29.97 fps). 第二中方法是編碼成120 fps的avi並且丟幀dropped frames (其中重複的幀null幀將被丟棄後播放). 第三中方法是使用mkv或mp4容器創建一個真正的vfr.