DirectShow環境配置

來源:互聯網
上載者:User

最近有一個C++視頻開發項目,寫個心得稍稍記錄一下,以免以後忘記了。本文雖然是原創,但是整合了網上所有遇見的情況做了一個中和以及個人的一些經曆寫了這篇,請閱讀者多多指教。

  1.簡介:

  DirectShow是一個windows平台上的流媒體架構,提供了高品質的多媒體流採集和回放功能。它支援多種多樣的媒體檔案格式,包括ASF、MPEG、AVI、MP3和WAV檔案,同時支援使用WDM驅動或早期的VFW驅動來進行多媒體流的採集。DirectShow整合了其它的DirectX技術,能自動地偵測並使用可利用的音視頻硬體加速,也能支援沒有硬體加速的系統。

  2.環境安裝:

  因為我系統比較多,所以我在三個系統上做了個簡單的配置,我每套系統的配置都寫下來,以方便讀者自己參考:

  1.Windows XP x32下:(中文)

OS版本:Windows XP SP3 Professional

Windows SDK版本:Windows XP SP2 FULL版

DirectX SDK:DirectX 9.0 SDK Update - (Summer 2004)

  2.Windows Vista x64:(英文)

OS版本:Windows Vista x64 SP1 Ultimate

Windows SDK版本:Windows 2003 SP1 RTM版

DirectX SDK:DirectX 9.0 SDK Update - (Summer 2004)

  3.Windows Server 2008:(英文)

OS版本:Windows Server 2008 Enterprise Edition x32:

Windows SDK版本:Windows SDK for Windows 2008 and .NET Framework 3.5 SP1

DirectX SDK:DirectX 9.0 SDK Update - (Summer 2004)

  註:這裡選擇DirectX 9.0 SDK Update - (Summer 2004)的版本是因為這個版本是DirectX SDK中最後一個整合了DirectShow的版本,我個人覺得這個版本配置稍稍簡單,其他版本我沒有嘗試過,應該問題不會太大。

  還有,開發平台都是VC6.0,這個平台我測試過,在Windows XP,Windows Vista,Windows Server 2008以及Windows 7下邊都可以安裝,只是有一點需要注意,在下邊三個系統安裝的時候需要注意一點:

  Windows Vista,Windows 2008,Windows 7

  在安裝VC6.0的時候需要讓你選擇需要安裝的組件,在選擇安裝組件的時候,有一個選項是“企業工具”

(英文“Enterprise Toos”),選中過後點擊右邊的“修改選項”或者“Change Option”,裡面有一個項是:Visual Studio Analyzer,去掉這個選項就可以在這三個平台安裝VC6.0了。當然一般不會有人在這三個系統安裝VC6.0,但對於懷念這個平台的人可以試試,嘿嘿,僅作為參考。

  3.編譯BaseClasses:

  單獨提取編譯BaseClasses的章節,希望對所有編譯BaseClasses的兄弟有協助。

  1)首先開啟VC6.0,建立一個項目,項目類型選擇Win32 Static Library,這裡需要說明一下,如果要使用VC6.0的來編譯BaseClasses,因為該版本下邊沒有VC6.0的工程檔案,所以最好自己建立工程檔案,來完成編譯過程,建立一個Win32 Static Library項目;

  2)設定相關參數:

  這裡應該是不需要,為了保證編譯好的Lib的名字和網上大部分配置相同,點擊Project->Settings,在Library標籤裡面設定相關的輸出,Output file name:預設是項目名稱,本人是這樣修改的:

  Debug版本:Debug/strmbasd.lib

  Release版本:Release/strmbase.lib

  然後就可以編譯了!!興奮中,期待的版本吻合的baseclasses的lib快出來了。

  3)錯誤資訊:

  別高興太早,這裡會有一個編譯錯誤,錯誤資訊如下:

  wxutil.cpp(277) : error C2065: 'COINIT_DISABLE_OLE1DDE' : undeclared identifier

  這個問題我搜了網上很多地方,後來發現了一個替代解決方案,變數未定義,但是有辦法解決,找到原始碼wxutil.cpp的277行:

  hr = (*pCoInitializeEx)(0,COINIT_DISABLE_OLE1DDE );

  將變數COINIT_DISABLE_OLE1DDE改成整數4;

  hr = (*pCoInitializeEx)(0,4);

  這樣就可以編譯通過了,在編譯的時候記得編譯兩個版本,版本的切換在菜單Build->Set Active Configuration裡面可以切換啟用版本,就可以編譯兩個不同的版本到項目對應的目錄下。然後把編譯好的兩個檔案夾Debug和Release放到對應的BaseClasses檔案夾下邊:

  DirectX SDK安裝目錄/Samples/C++/DirectShow/BaseClasses下邊就可以了。

  4.配置DirectShow針對所有項目的環境:

  因為有些標頭檔是Windows SDK下邊的,所以建議最好裝一個Windows SDK,否則缺少標頭檔會在Link過程報錯。

  開啟Tools->Option…->Directories裡面:

  首先選擇Include files

  DirectX SDK安裝目錄/Include

  DirectX SDK安裝目錄/Samples/C++/Common

  DirectX SDK安裝目錄/Samples/C++/DirectShow/BaseClasses

  Windows SDK安裝目錄/Include

  VS6.0 安裝目錄/VC98/INCLUDE

  VS6.0 安裝目錄/VC98/MFC/INCLUDE

  VS6.0 安裝目錄/VC98/ALT/INCLUDE

  然後選擇Library files

  DirectX SDK安裝目錄/Lib

  DirectX SDK安裝目錄/Samples/C++/DirectShow/BaseClasses/Debug

  DirectX SDK安裝目錄/Samples/C++/DirectShow/BaseClasses/Release

  Windows SDK 安裝目錄/LIB

  VS6.0 安裝目錄/VC98/LIB

  VS6.0 安裝目錄/VC98/MFC/LIB

  網上很多文章都寫了這段,但是我不清楚Debug版本和Release版本為什麼都要放上去,索性就和他們一樣放了兩個版本的目錄。

  註:順序不能錯,藍色部分是原來就有的,紅色是添加的,Include中第二項Common那個好像可以不需要,我只是一個個例,做參考,所以寫上去。

  5.項目設定 

  建立一個項目過後,首先要引入項目所需要的庫檔案:

  選擇Project->Settings->Link標籤,然後在選項Object/library modules:中輸入以下的幾個Lib

  Debug:strmbasd.lib strmiids.lib quartz.lib

  Release:strmbase.lib strmiids.lib quartz.lib

  註:網上參考資料如果要引用標頭檔streams.h才需要BaseClasses相關內容,如果不引用不需要前面兩個庫,我沒有驗證過,而且如果引入標頭檔streams.h,還需要另外兩個庫uuid.lib和winmm.lib,我的基本配置:strmbasd.lib strmiids.lib quartz.lib uuid.lib winmm.lib幾個庫檔案

  然後隨便找個例子試試,我使用的例子是一個採集網路攝影機視頻資料的例子,如果編譯通過可以運行就證明環境沒有問題。

  6.遇到的問題

  1)winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'

  2)error C4430: missing type specifier - int assumed. Note: C++ does not support

default-int:

  3)error C2065: 'Count' : undeclared identifier

  這三個問題是在VS2005中編譯的時候遇到的,這個參考BLOG:

  http://hi.baidu.com/jsufcz/blog/item/f2bfb18f9f2bddfc503d92ee.html

  第一類問題的解決:project->BaseClasses properties->configuration->C/C++ -> General-

>Additional Include Directories裡面的內容(.,../../../../include)刪掉,重新編譯,

PVOID64的錯誤消失,原因如下:

POINTER_64 是一個宏,在64位編譯下起作用,它包含在SDK目錄下的BASETSD.H中(Microsoft Visual Studio 8/VC/PlatformSDK/Include/basetsd.h(23):#define POINTER_64 __ptr64),但

DXSDK自己也帶了一個basetsd.h,裡面沒有定義POINTER_64,從而導致出錯,只需要改變include

files的優先順序即可。。當然,也可以改寫winnt.h中的代碼,將

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

改成

typedef void *PVOID;

typedef void * POINTER_64;

typedef void * PVOID64;

  第二類問題的解決:錯誤發生在:operator=(LONG);函數定義中,這是因為在VC6中,如果沒有顯示的指定傳回值類型,編譯器將其視為預設整形;但是vs2005不支援預設整形,解決這個問題不能修改每個沒有顯示指示傳回值類型的函數地方,可以用wd4430來解決;具體的在工程選項中的c++/Command Line中添加/wd4430即可。

  第三個錯誤發生在for迴圈中,vc6中for迴圈中定義的變數相當於在for外面定義,可以在for之外地方使用;但是vs2005for迴圈中定義變數相當於域{}變數,只能在for迴圈中使用。要解決這個問題,可以通過修改vs2005的工程選項:”Project Option”——“ C++ ”——“Language”——“Force Comformance in For Loop Scrope” 設定為No即可。完成上面的設定,BaseClass工程基本可以編譯通過了。

  4)wxutil.cpp(277) : error C2065: 'COINIT_DISABLE_OLE1DDE' : undeclared identifier,

    此問題見上邊的解決方案,是使用VC6.0在編譯BaseClasses的時候遇到的錯誤。

  本人在配置過程是以AVChat例子來進行的環境測試:

  5)uuid.lib(objidl_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module

  這個問題是因為兩個uuid.lib的衝突

  解決:

  把WindowsSDK的uuid.lib移除並備份,註:不要移錯了,DirectXSDK下的uuid.lib不要移除,否則編譯又會有錯,移除或者重新命名uuid.lib,改掉其尾碼名,反正使得uuid.lib檔案不在Windows SDK下邊就可以了。

  6)註:這是警告資訊,不是錯誤:

  LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library

  總結一下,消除這種警告資訊就在同樣的位置:

  選擇Project->Settings->Link標籤,下拉選擇Input在ignore libraries中加上警示告的lib名稱。

  7)strmif.h(1018) : error C2146: syntax error : missing ';' before identifier 'HSEMAPHORE'

  此問題比較常見,此問題是Include配置的時候的順序問題,如果把Windows SDK的順序配置到了前邊那麼這個問題就會存在,如果順序嚴格按照上邊的配置順序來,此問題就有可能沒有了,這個問題會導致編譯通不過,是一個很常見的問題。

  8)error LNK2001: unresolved external symbol _CLSID_FilterGraph

  此問題是因為連結下邊缺少庫檔案:strmiids.lib和quartz.lib,這個問題追溯到上邊引入標頭檔streams.h的時候沒有添加此庫就可能出現此問題。

  9)error LNK2001: unresolved external symbol "class ATL::CAtlBaseModule ATL::_AtlBaseModule" (?_AtlBaseModule@ATL@@3VCAtlBaseModule@1@A)

  此問題是因為標頭檔#include 過後,缺少了包atls.lib,把atls.lib包引入就應該可以編譯通過。

  另編譯時間出現了DWORD_PTR或者其他什麼類型未定義之類的錯誤,是因為微軟把BASETSD.H從DirectX SDK發行包裡拿掉了,這個檔案在Platform SDK裡有,在VC的Include路徑中把Platform SDK的include路徑提到最前面就可以了。Platform SDK,最後一個支援VC6的Platform SDK是February 2003 Edition。

  7.總結:

  此篇為本人在配置DirectShow裡面的全過程,希望對大家有協助,裡面的錯誤,有些錯誤是我自己碰到的,有些錯誤是我自己碰到的,有些錯誤是在別人BLOG裡面看到了過後做了個實驗。如果還有些什麼問題或者其他錯誤的話希望大家發我郵件:silentbalanceyh@126.com

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.