首先要解決「起始性誤差」,同上面所述,設定 DelayAudio(XXXX) 參數。這部份已經是常數了,所以不用再修改了。
「累積性誤差」往往可由 VirtualDub.File.File Information 的 Video stream length
時間部份參數與 Audio stream length 時間部份參數看出端倪。如果這兩個參數的秒差不少,那影片快結束時應該有很明顯的不同步。使用這個方法的前提是,「累積性誤差」必須為常數,也就是一個平均值,每台電腦搭配的捕捉卡與捕捉程式,都會有不同的常數
(當然也會有不同的起始性誤差值);如果「累積性誤差」值飄忽不定,甚至伴隨著 Drop Frame,那請用「分段同步法」。
藉由計算影像部分時間與聲音部分時間的差距值,換算出對應的 tempo 參數,這個方法上面已經說過了,原理也大致說明了,只是上面的方法必須自行取得時間值,再自行計算出對應的
tempo,再自行修改 script,有點給他麻煩,所以現在要大量運用 AviSynth 的 script 語言,做出一個自動會抓參數的
script,自動算出 tempo 並且載入不同的影像檔。
首先,請注意題目是「VirtualDubMod」而非「VirtualDub」。這兩者的差異在 mod 版是修改原始版本的程式碼,加上很多強力的新功能,如
mod 版允許直接修改並載入 AviSynth script 的 template(模板)、mod 版還允許聲音串流加入 AC3, MP3(CBR,VBR),OGG,
DTS, SRT 等等多種主流的格式,mod 版的影音輸出格式還支援很熱門的新興影音容器→Matroska (MKV) 與 OGG Media
(OGM),這些都是 mod 版本強力的地方。只要是原始版本 (v1.5.10) 有的能力,一樣也沒縮水,再外加很多強力且實用的功能,所以筆者已經不知道多久沒用
VirtualDub 這個原始版本了。(目前 VirtualDub 已經出至 v1.6.3, 不過原作者不斷的提醒說那是「實驗版」,不要用來真的輸出成品,優點是
64-bit 原生版本也已經出現了,看來不久之後等原始版本成熟後,K8 64-bit 狂壓檔案的時代也來臨了)
首先 AviSynth 內部定義了一些參數,筆者將幾個重要的列出來,她們是:
- FrameCount (影像格數目)
- FrameRate (影像播放速率)
- AudioLength (聲音取樣長度)
- AudioRate (聲音取樣速率)
有了這四個參數,就能變出一些花樣了→
- 影像播放時間 = FrameCount 除 FrameRate
- 聲音播放時間 = AudioLength 除 AudioRate
這樣就輕鬆的取得了影音兩者的關係,然後將他轉為 tempo 值輸出給 TimeStretch 函數即可。但是筆者發現了一個有趣的現象,就是這個自動計算的
tempo 值,必須加上一些「經驗常數」 ,也就是說當 tempo 值被轉換出來以後,「大體上來說」已經是「自動對嘴了」,但仍覺得聲音有一點延遲或提前,必須要自行試驗幾段不同長度的影像後,找出符合所有不同影像的共用「經驗常數」,然後就可以得到完美的「自動影音同步
Script」了!經歷過一點時間的調較以後的 AviSynth [Auto-AV-Sync] Script,保證讓每一次錄影後的結果,都是自動影音同步的狀態。
說了這麼多,看倌們趕緊自行製造您專屬的 script 吧。 |