Friday 19 January 2007

Solo codec 與 codec pack 之關係

PCDVD 上有人問...
想想打這一篇還真久,拿來 blog 充數也不錯 :P
俺對 XviD 比較熟,其他部份有錯別拖我自己轉學到加拿大就好

一.
先來說明 decoder 的部份 - 以 koepi's XviD 為例

在 Windows下若要播放 XviD 影片時,此時 Windows 的播放程式會去尋找、並呼叫 Xvid Decoder 以要求解碼
通常這時的 Decoder 會是由已安裝 koepi's XviD 放出來的 xvid.ax 所管轄
而這個 xvid.ax 則會去調用真正的 XviD 的核心,也就是 xvidcore.dll
你可以把它理解成 xvid.ax 只是 XviD 的 interface
而 xvidcore.dll 則是它名字的意思


當然,這是電腦內只安裝了單一 decoder 的狀況
假設在同個系統內加裝了 Divx 與 XviD decoder 時,
由於 FourCC support 讓 XviD decoder 也可播放 Divx 格式
解碼的優先順序這類旁支末節就暫且不提

可以想見的,兩個 decoder 在極端狀態下就會打架
各自的 interface 會為了同一格式的檔案搶著作解碼
這也是為什麼會有人提出安裝多個 codec 會不穩的原因之一

當然造成不穩的原因還不止這些,我在文後會稍作解釋


二.
再來談到這如 ffdshow 這類整合 cdoec pack
是由於上述狀況其實還蠻常發生的,尤其在 WIN98 那個年代
嚴重一點就只能砍掉重練
所以 milan_cutka 為了解決這類問題
開發了 ffdshow

這類整合 code pack 最主要的目的,不僅僅是為了節省各自安裝 codec 的時間與精力
更重要的是,這類 codec pack 將會用

"獨立且單一的介面去調用電腦內的 codec"

如 ffdshow 的 ffdshow VFW
(Xvid 的 VFW component 則是 xvidvfw.dll ,之前這個檔案只是 core suffix)
由於調用的方式與編排在程式編寫時就已納入考量,所以解決了不同 codec 打架的問題


像 MPlayer 也是基於同一個原理,將大部份 codec 包在一起
並由自己開發的播放器調用,不向 Windows 內呼叫 decoder

與 MPlayer 方式完全相反的
則是 gabest 開發的 Media player classic
蠻有趣的狀況是,這兩種極端類型的播放器都有一定的佔有率(順帶一提,我是用MPC)
也沒啥誰好誰不好的,看自己習慣而定


三.
最後來談談 encoder

其實 endoer 與 decoder 的狀況類似
只是由 "將影片 decompress 輸出至顯卡" 換成 "轉換影片格式" 而已
方式大同小異。所以也同樣會遇到 encoder 打架的問題

拿 TMPGEnc 做轉檔為例
一般獨立安裝 codec 的狀況,轉換不同格式的影片
將由 TMPGEnc 內部設定,決定調用 encoder 的優先順序
VirtualDubMod 我記得也是同樣可以設定

早期有些轉檔程式則沒有這個設定,將由程式自己去做判斷
所以才會發生轉檔失敗的狀況


至於ffdshow與K-Lite這類 code pack 之間...
只是容納程度上的差異而已
K-Lite 求精 K-Lite 求量,有用到的與沒用到的就自己選邊站吧

註:
有些人裝完 K-Lite 這類東西,又回去裝了獨立的 decoder
或是裝了獨立的 decoder , 在K-Lite再加裝一樣的東西上去
造成 encoder 與 decoder 兩邊支援度不一
原本被統一的狀況又變得混亂,因此系統不穩定是一定會的

而且會這麼做的人還真的很多....

No comments: