ffdshow開發筆記——從安裝到構建成功第一個FilterGraph(一)

     ffdshow是Windows平臺上的一個支持多種視頻格式的開源解碼器。它包含一系列的DirectShow Filter,用來對各種視頻流格式做編解碼。
因爲最近想做個用於項目測試的視頻解碼器,所以才嘗試對ffdshow做一些瞭解,但是初次接觸這個功能強大的解碼器,從安裝到構建成功第一個FilterGraph,我用了一個星期的時間!這期間遇到過很多的問題,也浪費了我相當多的時間。爲了讓更多的朋友少走彎路,我把這個從安裝到構建的過程大致記錄下來,供你們參考。

一、下載、編譯、安裝
    首先,下載ffdshow的源碼。通過ffdshow的項目主頁(http://ffdshow-tryout.sourceforge.net/)找到源碼的SVN地址:https://ffdshow-tryout.svn.sourceforge.net/svnroot/ffdshow-tryout,下載一份最新的源碼。我機器上下載的速度還是可以的,一共10多M的源碼,我看會資料的時間就完成了,具體時間我倒沒有計算,不過速度大概有20K以上。不過,我看到網上看到很多朋友編譯源碼的時候出現問題,而且我剛開始編譯的時候也是一樣,爲了這部分朋友着想,如果您實在在編譯上花了太多功夫了,那麼您可以跳過這一步,直接下載網站上的安裝包進行安裝。但是這樣的話就得不到一些頭文件,一些能夠通過代碼進行的比較高級的設置您就無法進行了。但是,這並不影響我們構建FilterGraph的初級目標。

    源碼下載完成後,就要開始艱難地編譯旅程了。我最開始的時候用的是VC6.0 SP6, 但是發現編譯過程中源碼中竟然需要包含高版本Studio SDK中的頭文件,正好我的電腦上有VC2005 Express,所以就搬出來試驗了,不過結果還是行不通,因爲我沒裝Platform SDK :(,最後我決定下載VC2003,因爲我參考的一篇文章(http://www.yesure.com/storm/print.php?articleid=15)中就是以2003爲例介紹編譯的。同時,我也建議您看一下這篇文章。

    還有一件同樣非常重要的事情,ffdshow的編譯除了C++源文件外,還有彙編源文件,所以,你的機器上需要安裝一個彙編編譯器。nasm是官方使用的編譯器,可以從(http://sourceforge.net/projects/nasm/)下載。同樣,nasm也是一個非常棒的開源軟件。下載nasm後,解壓出的文件中有一個nasm.exe,如果想偷懶的話可以把它直接複製到系統目錄中去(比如C:\windows)。如果您比較勤快的話,也可以把nasm的路徑放到系統的PATH環境變量中。最後,請把nasm.exe改名爲nasmw.exe。

    接下來,我就以VC2003爲工具,介紹整個編譯的過程。

    下載下來的源碼中,根文件夾有個ffdshow.dsp工程文件,不過,編譯完這個工程文件並不意味着萬事大吉,因爲在它的子目錄中,還有幾個工程是需要編譯的!當然,這幾個額外需要編譯的工程在我上面提到的那篇文章裏是講到的,只不過是在它的最後,而我在編譯完ffdshow.dsp之後,就只顧興奮而全然不管那篇文章的後半段了,因此,這也是我把這個注意事項寫到真正開始編譯之前的原因,希望那些同樣容易被喜悅衝暈頭腦的傢伙不要錯過這幾個關鍵的工程。

    先把這幾個同樣需要編譯的工程文件列出來:
D:\ffdshow\src\ffmpeg\libavcodec.vcproj
D:\ffdshow\src\mplayer\libmplayer_dll.vcproj
D:\ffdshow\src\codecs\x264\ff_x264.vcproj
D:\ffdshow\src\codecs\libmpeg2\libmpeg2_ff.vcproj
(注:應該是由於版本演進的原因,我所參考的那篇文章中列的幾個工程文件和我新下的代碼已經不太對應了,同樣發生改變的還有版本管理庫,我參考的文章中所使用的還是CVS,而現在ffdshow項目已經使用SVN了)

    在編譯ffdshow之前,請確認您安裝了directx SDK(即DXSDK),可以在MSDN下載最新的版本(http://msdn.microsoft.com/en-us/directx/aa937788.aspx),當然,沒有必要非得使用最新版本,9.0以上的版本應該都可以(不過我沒試過,我安裝的是9.0c)。下載並安裝DXSDK後,還需要將該SDK中的BaseClasses工程進行編譯,我想看這篇文章的朋友應該不對會此感到陌生,我也就不詳細介紹了。最後別忘了將DXSDK的Include、Lib目錄和BaseClass的源文件目錄、生成Lib文件目錄加入到VC2003的搜索路徑中,同樣,做爲一個DirectShow開發者,您肯定已經完成這一步了。如果您在這一步上有問題,請參考DirectShow的相關資料。

    先來編譯ffdshow.dsp工程文件,其實這個文件編譯通過後,另外幾個工程應該就不會有障礙了。用VC2003打開ffdshow.dsp,會發現有幾個編譯配置:Debug、Release,我們就直接選擇Release吧,除非你想對ffdshow進行調試。

幾個編譯配置

    現在,在解決方案上點擊右鍵,執行“生成解決方案”。編譯過程中如果上報找不到nasmw.exe,請檢查是否將它放到了系統目錄中,或是將它所在的路徑添加到了Path變量。還有一個錯誤,也是發生在nasmw身上,不過是我在使用VC2005的時候遇到的,就是上報nasmw.exe找不到輸入文件。當時這個問題困擾了我相當長時間,最後從網上終於搜索到了一篇文章,其中講到了解決辦法,不過很不幸,那篇文章的鏈接我找不到了:(。不過,錯誤的原因我是記得的,就是VC2005在轉換VC6的dsp工程文件時,有一個錯誤,如果您也遇到了這個問題,請打開VC2005轉換後生成的sln文件,在其中執行nasmw,會發現這個命令行中的輸出文件路徑中,加了很多的雙引號(在項目文件中顯示爲"),可以試着把這些多餘的雙引號去掉,再編譯一次試試,如果它對應的asm文件這次編譯通過了,就說明是這個問題,您就可以通過“搜索”+“替換”的方式將工程中的相應地方都進行更改了,不過千成別忘了,雙引號要寫成",而不是直接畫個引號上去,否則在打開解決方案的時候會出錯的:)

生成解決方案

    說來也怪,在完成上面的步驟後,我在機器上編譯的過程就一帆風順,除了一堆警告,沒有任何error,這讓我史料未及。

編譯完成

    別忘了另外幾個工程,用同樣的步驟,把它們也編譯完成。

    話說回來,網上看到的那麼多朋友在編譯過程中出現了問題,雖然我沒有遇到,但是我覺得大部分應該都是環境的問題,就像我剛開始用VC6和VC2005一樣。如果您還沒能通過編譯這個過程,而且又不想直接拿安裝包來用,只能請您仔細查檢一下您的機器環境,實在不行也換成VC2003來試一下,雖然它不及VC6經典,也沒有2005強大,但至少編譯沒有出錯。

    好了,編譯通過了,下面該到安裝了。可以看到在工程根文件夾下的bin目錄中,現在已經生成了一堆dll和一個ffdshow.ax文件,我最初直接用 regsvr32 ffdshow.ax 來註冊控件,雖然可以註冊成功而且在graphedit中也可以看到ffdshow相關的filter,但是都是不可用的,原因就是ffdshow還需要一堆註冊表信息來支持運行,這就是爲什麼我們需要來製做安裝包了。

    製作安裝包的過程其實很簡單,ffdshow是通過NSIS來打包的,NSIS可以通過(http://nsis.sourceforge.net/Main_Page)來下載。下載並安裝後,可以到ffdshow的bin\distrib目錄中,直接雙擊ffdshow.nsi來執行打包過程,不過也可以通過運行該目錄下的ffdshow-core.bat或ffdshow-core-dec.bat來執行打包,這兩個bat文件有什麼區別我還不太清楚。打包完成後,在我的機器上會生成ffdshow-core-20051216.exe安裝文件,接下來就可以執行這個文件來安裝ffdshow的組件了。

    如果您已經順利完成了這些,那麼恭喜您已經具備了開發ffdshow應用程序的一切了!現在就讓我們一起開始構建第一個FilterGraph吧!不過,今天寫了不少了,構建的過程,留給下一篇吧:)

發佈了33 篇原創文章 · 獲贊 7 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章