分享

DirecShow SDK 下載、安裝

 vcand3d 2013-04-23

以前寫 Blog 想說只寫一些遊記之類的文章,原本有想過要寫些技術,但是寫技術我又沒有探討得很深入,要是寫下去怕誤導別人,不過因為最近手邊有個 case 的關係,光是把環境建構起來就花點時間,乾脆就順便把我走過的路重新整理一次分享出來給大家,讓其他人可以節省些時間。

最近幫忙以前長官做個東西,需要用到 DirectShow,便開始把手邊所有的光碟都拿出來看看,發覺 DirecX SDK 的部分我都沒有,只好上網 Download,以下是幾個相關的下載網址給大家參考一下。

DirectX Software Development Kit (March 2009)

DirectX 9.0 SDK Update - (February 2005)

DirectX 9.0 SDK Update (February 2005) Extras

Windows Media Format 11 SDK

Windows Media Player 10 SDK

Windows Media Format 9.5 SDK

Windows Media Format 9 Series SDK

Windows Media Encoder 9 Series SDK

這邊比較有問題的就是 DirectShow,一般人想的是,只要把 DirectX SDK 下載下來安裝,這樣就全部OK了,因此,一開始是先安裝 DirectX SDK (Mar 2009) 就沒事了,但是,代誌不是憨人所想的這麼簡單,安裝完後發現 \Samples\C++\ 目錄夾裡面竟然沒有 DirectShow的相關資料夾,這實在是太奇怪了。

▲  安裝完 DirectX SDK (March 2009)\Samples\C++ 的目錄夾內容

接著開始上 Google 用力的查了一下,發覺到說原來微軟在 DirectX SDK 2005 之後就將 DirectShow給分離了,真是雪特 !!! 有網友說要安裝 DirectX 9.0b 這個版本才是最完整的,因此,小弟我又去下載了 DirectX 9.0 SDK Update - (February 2005) 來使用,到此想說應該這樣就都裝好了,BUT,事情真的不是憨人所想的那麼簡單,原來這個 DirectX 9.0 SDK Update - (February 2005) 只是 Update 版本,最後在用力 Google 一下,才終於找到 DirectShow 可以用的 SDK - DirectX 9.0 SDK Update (February 2005) Extras


將DirectX 9.0 SDK Update (February 2005) Extras 解開後終於看到 DirectShow 了 !

接著直接進入 DirectShow 目錄夾下,將全部的內容複製到 DirectX SDK (February 2005) 目錄夾,讓 DirectX SDK 合體完成。

事情到了這裡終於有一個進展了,真是讓我太感動了 ,接著要使用 DirectShow 之前還有些工作要做,因為這個 DirectShow SDK 會提供基本的 Library 程式碼,這些程式碼存放在 Samples\C++\DirectShow\BaseClasses 裡面,我們在使用前就必須把 DirectShow 的 Library 給 Build-up 起來,這整個 DirectShow SDK 才算完成,請看以下報導:

1. 開啟 .sln 的專案檔案,並進入 Visual Studio 2005

2. BaseClasses 配置有四種專案組態:Debug、Debug_Unicode、Release、Release_Unidoe,分別將這四種組態都 Build-up 過一次


Visual Studio 2005 對於 C++ 語法支援更齊全,因此會產生 C4430 的錯誤

3. 當你感覺一切都非常順利的時候,這時卻看到 Build 專案時出現了錯誤,看了一下訊息 error C4430: missing type specifier - int assumed, Note: C++ does not support default-int這又是啥小 ....... 朋友來著,於是又請到 Google 大神,原來,是因為 DirectShow Library 當初應該是利用 Visual C++ 6.0 所寫的,如果,沒有宣告資料型別,那麼該變數會預設為 int,可是現在用的是Visual Studio 2005,Visual Studio 2005 對於 C++ 語法的支援更齊全,因此,檢查上就會更為嚴謹,所以這樣的程式碼是不被允許的,需要做點修改。


一樣的問題 C4430,這邊都要把宣告的型別寫清楚才可以

在 for 宣告的變數不可在迴圈內使用,必須宣告在 for 之前才可以


一樣是 for 變數生命週期的問題,要把 Count 往前宣告才行

把這幾個小問題處理掉之後,重新 Build 過一次就沒問題啦 ! Build 完之後在 BaseClasses 目錄夾下會出現四個目錄夾,分別是:Debug、Debug_Unicode、Release、Release_Unicode,這四個目錄夾中會產生出可用的 Library 檔案,Debug\strmbasd.lib、Debug_Unicode\strmbasd.lib、Release\STRMBASE.lib、Release_Unicode\STRMBASE.lib,接著將最常用的 Library 檔案複製到 DirectX SDK\Lib 目錄中,這樣當專案預先 Include DirectX Library 函式庫時就可以直接使用 DirectShow 的 Library 了。

接著在撰寫的過程中需要用到 FreeMdeiaType 這個函式,但是卻引發其他問題,在 Strmbasd.lib 產生了 error LNK2019: unresolved external symbol __imp__timeGetTime@0 referenced in function "void __stdcall DbgInitialise(struct HINSTANCE__ *)" (?DbgInitialise@@YGXPAUHINSTANCE__@@@Z)的錯誤


為了這個 LNK2019 耗費很大的精神在檢查各 Library 的設定

檢查了 Project 組態上面的設定,猜想可能是組態設定的問題,試著調整了幾次卻都還是發生錯誤,再來檢查 BaseClasses 也都沒有辦法 Build 成功,最後上網查詢這個可惡的 LNK2019,發現原來訊息裡面顯示的 __imp__timeGetTime 這個函式裡面需要 winmm.lib 這個函式庫,乖乖的照著加入這個函式庫之後,果然 Project 內的所有錯誤全部清潔溜溜,真是讚啦 !

今日心血來潮把這幾天 DirectShow SDK 安裝的問題整理一次分享出來,希望對大家有幫助,若有任何問題請各位指教,謝謝。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多