首先先重提一下一些認知
(1)
24fps 的 A片段 要與 30fps 的 B片段 連接
又不希望造成不順暢或frame的損失
此時
就使用插入 Null frame 的方式,取兩者的FPS之最小公倍數 120fps
來達成
(2)
AviSynth 的 AssumeFPS filter 是一個不影響frame數目 及 改變FPS速率 的濾鏡
P.S. 可以實驗一下證實AssumeFPS的效果,腳本如下
=============================================
AVISource(FileName).trim(301,0).changeFPS(23.970)
# 總共得到 1933個frame
AVISource(FileName).trim(301,0).changeFPS(23.970).AssumeFPS(29.970)
# 總共亦得到 1933個frame
# 證實AssumeFPS如同 AVI Frame Rate Changer工具,不會改變視訊的frame數目
=============================================
(3)
VirtualDubMod 的 Append segment 視訊檔案連結功能所需的條件是 FPS、水平垂直解析、code及colorspace需一樣
P.S. 這裡不討論音訊部分接著回到主題 "如何利用MKV來達成不同FPS視訊片段的無損連結" ※且與音訊同步
1.首先先解析各片段的檔案
======
s1.avi=====
檔案 : 1.48 MB (1.48 MB), 持續時間 0:00:10, 類型 AVI, 0 音訊資料流, 品質 72 %
視訊 : 1.47 MB, 1226 Kbps,
29.969 fps, 解析度 640*480 (4:3), XVID = XVID Mpeg-4, 已支援
======
s2.avi=====
檔案 : 18.3 MB (18.2 MB), 持續時間 0:01:20, 類型 AVI, 0 音訊資料流, 品質 73 %
視訊 : 18.2 MB, 1889 Kbps,
23.969 fps, 解析度 640*480 (4:3), XVID = XVID Mpeg-4, 已支援
=====
source.mp3==(這個是VBR-MP3所以時間測不出,實際是1:30)
檔案 : 1.84 MB (1.84 MB), 持續時間 0:00:00, 類型 MP3, 1 音訊資料流, 品質 72 %
音訊 : 1.83 MB, 128 Kbps, 48000 Hz, 2 聲道, 0x55 = Mpeg-1 audio Layer 3 (MP3), 已支援
2.以上可得知兩片段 FPS 不同因此不能用VDM做Direct stream copy連接
所以這裡要決定改變誰的 FPS紀錄,此例我們決定將 s2.avi改成
29.970 fpsP.S. 使用到AVI Frame Rate Changer這個工具,這裡雖然s1.avi不用改,但發現VDM會不允許
所以就連s1.avi一起予AVI Frame Rate Changer應用之3.接著就可以用VirtualDubMod先開啟 s1.avi緊接著File->Append segment開啟 s2.avi
最後確認使用Direct stream copy模式後,Save as 成
1+2.aviP.S. 音訊我們決定在 mkv 時包裝,當然也可以在這裡加上音訊
Streams->stream list->Add source.mp34.接下來是.MKV的包裝
首先需做一個 timecodes-v1.txt 文件,其內容如下:
=============================================
# timecode format v1
assume
29.9700,300,
29.970301,2232,
23.970=============================================
5.再來用 mkvtoolnix 的 mmg.exe 來製作包裝 (1+2.mkv)
P.S. 這裡不要忘了加入音訊 source.mp3以上就是 VFR video MKV 的一種應用
比之前利用AVI60(120、60 FPS Changer)的 120FPS做法多了幾個步驟
但得到的好處是成品檔案小及無損frame製程
P.S. 當然也有不便之處,比如要做 mkv->rm/rmvb 的壓製就可能有不少困擾接著補充一下 timecodes-v1.txt 的編寫解說
assume 是假定的運作 FPS 值,因為最後我們都設定成同一個值,所以很容易理解就是
29.9700,300,
29.970表示第0號到300號Frame間 原本的運作FPS是
29.970那 301,2232,
23.970 為何是 23.970呢?
就可以了解了吧,因為 s2.avi 原本的 FPS是 23.970(23.969) (事後才利用工具強制成 29.970)
至於301,2232及0,300這個範圍是怎麼來的,我們這裡用 VDM的 File->Information來得知
最後要提到的是
1.VFR video的應用不止於此,還有兩種層次上的分界應用
其一是Encoder的 VFR功能應用
這類工具說多不多說少不少
比如 Windows Media 9 編碼器 的 VFR WMV製作、RealProducer Plus(以致於其他rm製作)
又auoenc.exe + vfrout.auo/wmvout_vfr.auo
P.S.(
http://bbs.irradiance.net/txtVersion/boards/animation/M.1102772189.A.html)(auoenc.exe 可在Avisynth的warpsharp Ex'filter內找到,但是日文介面..)
...等等
雖然這個才是比較多人想知道的實做辦法,但純屬單一工具的使用這裡就不多說了
另一個是Avisynth script encode + VFR MKV 的應用
比如:
http://forum.doom9.org/showthread.php?s=&threadid=64314舉一個類似 s1.avi + s2.avi 的實例:
假設 s1.avi與s2.avi 同上例是FPS不同的檔案
在 AVS裡要如何合併呢?腳本如下:
=============================================
a=AVISource("s1.avi")
b=AVISource("s2.avi").AssumeFPS(a.framerate)
a++b
=============================================
最後再用Encoder重新編碼及同上例方法包裝成 .MKV
2.貼出上面實驗的成果數據
1+2.avi: 19.4 MB (20,436,992 位元組)
1+2.mkv: 21.3 MB (22,344,138 位元組) ※結合了source.mp3及1+2.avi
重複提一下之前的
s1.avi: 1.47 MB (1,542,144 位元組)
s2.avi: 18.0 MB (18,905,088 位元組)
source.mp3: 1.82 MB (1,918,320 位元組)
解Timecodes文件GUI程式於下面樓層可以找到P.S. 這個的作用是
解出來的Timecodes可用來配合上面Avisynth script encode + VFR MKV中的AVS腳本用來壓製
或
重新包裝mkv
120fps to VFR MKV譯文 & GUI程式 於下面樓層可以找到