搜索 社区服务 统计排行 帮助
  • 30779阅读
  • 37回复

[原创]MKV timecodes應用之試驗教學(VFR MKV) ※2/10新增:120fps to VFR MKV譯文 & GUI程式

楼层直达
级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
首先先重提一下一些認知
(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 fps
P.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.avi
P.S. 音訊我們決定在 mkv 時包裝,當然也可以在這裡加上音訊
Streams->stream list->Add source.mp3


4.接下來是.MKV的包裝
首先需做一個 timecodes-v1.txt 文件,其內容如下:
=============================================
# timecode format v1
assume 29.970

0,300,29.970
301,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.970
0,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程式 於下面樓層可以找到

级别: 新手上路
注册时间:
2004-09-27
在线时间:
0小时
发帖:
5693
只看该作者 1楼 发表于: 2005-01-12
赞,学到好东西了~

-=eDtoon=-☆openicq☆㊣POPGO_Fans㊣







__________________

级别: 骑士
注册时间:
2004-09-27
在线时间:
3小时
发帖:
1362
只看该作者 2楼 发表于: 2005-01-12
顶^^

级别: 侠客
注册时间:
2004-08-05
在线时间:
0小时
发帖:
568
只看该作者 3楼 发表于: 2005-01-12
...这个漫漫看。..


★eDtoon☆Comic★[APTX4869]=c2club◎edut=霹雳[CHN][TLF]
背叛了啊……背叛了我的感觉啊!……
大家都背叛我了……所以大家都给我去死把!
大家都不要我了……所以大家都给我去死把!
既然我也没有用了,那不如不存在的比较好,所以我也去死把!
级别: 侠客
注册时间:
2003-12-25
在线时间:
0小时
发帖:
486
只看该作者 4楼 发表于: 2005-01-12
WEILAI兄再次发飙……仔细慢慢看看

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 5楼 发表于: 2005-01-14
Extract .mkv Timecodes tool GUI for mp.exe
file size: 53KB

載點1

ED:
ed2k://|file|vfr.rar|53324|DEE933A16F7D8A6B24FE7C4BC4BA553B|h=GNIXMW4MV4BRXI4GDQER26LXL6YTRLO5|/

一時興起做的,如有問題歡迎提出

聲明:
1.mp.exe 非製作GUI介面之作者寫的,所以有不能解的 .mkv 程式恕不負責解釋
2.此GUI介面用到COMDLG32.OCX系統插件,請確認windows\system(32) 內以安裝之
3.此GUI介面有用到Unicode(NT/2000/XP/2003)語法,如有不該、不可能解不開的 .mkv檔,請改以英文字母取檔名試之

P.S. 此mp.exe只能解.avi視訊及timecodes文件,所以不能解 rm/rmvb等特殊視訊及音訊檔

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 6楼 发表于: 2005-01-15
沒什麼人問到
靠上面得到的Timecodes如何壓製 rm/rmvb ...等
那就自己出題
Q:提出來timecode之後又如何來使用它將VFR的MKV壓成RMVB呢?
A:待續~ (沒人問就表示不重要)

级别: 版主
注册时间:
2002-12-02
在线时间:
0小时
发帖:
3002
只看该作者 7楼 发表于: 2005-01-15
先貼第一部份自己做的檔案之試驗
P.S. 第二部份是針對漫遊的 [POPGO][Air][01][CHS_JAP][XVID_MP3][CRC_A793C29C].mkv 來做 (實際上以證實可行,有人有興趣的話再貼出第二部份,不過聰明的讀者因該看了第一部份就可以自己做了)

因為需要成品解說就引用上面的試驗
先複習一下各檔案的內容
s1.avi + s2.avi = 1+2-s.avi (未合成mkv)播放看看,得到片長 1:14
P.S. 這裡的s1 及 s2 是用AVI Frame Rate Changer更改過後的檔案

1+2-s.avi=>1+2.mkv再用mp.exe解出成1+2.avi播放看看,得到片長 1:33 (1:30才是正確的時間=mkv的片長)
=====timecodes.txt=====
Assume 23.976
0,300,29.9711
301,2232,23.9699
=======================

而1+2.mkv播放看看,得到片長為 1:30
=====timecodes.txt=====
assume 29.970
0,300,29.970
301,2232,23.970
=======================

從上面得到一個訊息解出的Timecodes與原本的Timecodes不太一樣
但其實捨去小數點的話,發現主要是Assume值不同
接著請看下一帖....待續~


補充一下:前面1+2-s.avi(裝入mkv前的) 大小會比 1+2.avi(解出來的) 大一點
在講解AVS腳本前先試著分析一下為何前後兩者的Assume值會不同
用播放器放映1+2.mkv看看,可發現 FPS 越接近後面會越趨向 23.976
所以大膽推測 mp.exe 對Assume值是取最後的 FPS (last.Framerate)
但好在Assume值對以下的腳本不據參考所以就不再去深入探討了
(或許不同的mkv其情況會不同,所以不能斬釘截鐵的說"Assume值不據參考價值")

回到實做,AVS腳本如下
########################################
C= AVISource("1+2.avi")
a=C.trim(0,300).AssumeFPS(29.9711)
b=C.trim(301,2232).ChangeFPS(29.9711)
# 這裡做rm/rmvb的AVS腳本的話要記得用mkvtoolnix提出音訊
return AudioDub(a+b,mpaSource("source.mp3"))
########################################

解說:
第二行為何多此一舉.AssumeFPS(29.9711),
答案很簡單 避免不必要的問題產生
(與之前的原始s1及s2都需與AVI Frame Rate Changer應用一樣道理)

第三行使b片段與a片段用一樣的FPS,如此才能加在一起
(使用了.ChangeFPS會增加實體Frame,是與.AssumeFPS最主要的不同點)

那為何最終FPS是用29.9711而不是23.9699呢?
答案也很簡單 取最大值可避免 Frame的損失
(這裡為什麼不是取什麼 最大公倍數 呢?因為是用Avisynth作業,無關Null Frame之理念)

最後一行就是合成兩片段及音訊,這裡的音訊最後才合成而不是一開始就合成
※開始就合成的話這麼寫 C= AudioDub(AVISource("1+2.avi")),mpaSource("source.mp3")
原因有二:1.trim對音訊的分割沒這麼準確 2.作業都是視訊的處理,音訊沒必要這麼快就加入戰局

到此腳本是解說完了
但真的所有的情況都可用此腳本延伸(修改)嗎?
答案是否的
這裡是針對 "不同FPS合成的mkv" 分解後做處理
假如是 "mkv之視訊成員,是用Encoder的VFR功能做成的視訊" 的話那這裡因為還未試驗(沒試驗品 ^^||)
所以到此就此打住

最後強調於壓製前一定要試著播放看看是否與 mkv 一樣沒有不同步
否則壓製完成後才發現就太慢了
P.S. 特別是FPS不同的交界處,比如此例就是第300號Frame之後的轉接處,換算時間就是大約10秒的地方

级别: 侠客
注册时间:
2004-02-23
在线时间:
0小时
发帖:
561
只看该作者 8楼 发表于: 2005-01-15
未來兄雄才偉略。。。
繁體中文語法實在是看得小弟的腦袋一團是一團的漿糊。
慢慢看。。慢慢看。。。

电脑影音、美术爱好者技术交流QQ群:7414375

级别: 侠客
注册时间:
2003-12-25
在线时间:
0小时
发帖:
486
只看该作者 9楼 发表于: 2005-01-15
。。。。。楼上的看繁体吃力???

ME正常……

级别: 工作组
注册时间:
2004-07-03
在线时间:
0小时
发帖:
146
只看该作者 10楼 发表于: 2005-01-15
汗。。正在愁這個問題orz
謝謝weilai老大的帖子 搬凳子做筆記
级别: 新手上路
注册时间:
2003-10-27
在线时间:
0小时
发帖:
99
只看该作者 11楼 发表于: 2005-01-18
正在发愁的问题 这里看到教程了

来听讲了~~~~~

多谢大大~~~

上帝遗弃之仔の幻影—怪盗KID流星
级别: 小荷初露
注册时间:
2003-05-30
在线时间:
0小时
发帖:
124
只看该作者 12楼 发表于: 2005-01-18
好象比较难!!头痛呀!!

级别: 骑士
注册时间:
2003-04-17
在线时间:
0小时
发帖:
1338
只看该作者 13楼 发表于: 2005-01-18
这个当然要顶,支持WAILAI兄!

EMULE ID:yzj[eDtoon][CHN][lh.2y.net][VeryCD]这个现在比较少用
AMULE ID:yzjamule[CHN][TLF][eDtoon][VeryCD] 持续运行中
级别: 侠客
注册时间:
2003-12-25
在线时间:
0小时
发帖:
486
只看该作者 14楼 发表于: 2005-01-18
引用
最初由 岚轩 发布
这个当然要顶,支持WAILAI兄!


:eek: 楼上的老兄好久没有出现了吧……貌似

:rolleyes: 最近有没有什么新学问问世啊