(转)DirectShow9在VS2005或vc6.0下编译出现问题的解决方法
1。我用的版本是DirectX9.0b ,沒有安裝,直接解壓后放到一個文件夾里用
2。我按照以下的步驟操作成功。明天試著做個播放器。
?
VFW(Video for Windows)是Microsoft推出的關于數字視頻的一個軟件開發包;
DirectShow是微軟公司在VFW的基礎上推出的新一代基于COM的流媒體處理的開發包,在視頻開發中,不論從效率還是實用性上都明顯好于VFW。
著名的OpenCV由于時間太早,其視頻部分就是基于VFW做的,這點可以說是OpenCV的一個瑕疵;
DirectX8.0 至 DirectX9.0b 此其間的DirectX版本集成了DirectShow,DirectX9.0c以后DirectShow被集成在微軟的其它SDK開發包中。
在學習和開發中,可直接下載DirectX9.0b(大約218M),沒有其它辦法,從微軟官方或迅雷的gougou下載DirectX9.0b都可以
第一步:安裝DirectX9.0b,要分2步走,最后得到目錄比如: C:\DXSDK
第二步:DirectShow日常開發中最常用到的<strmbasd.lib>此文件并沒有直接給出,需要我們手動編譯,方法如下:
用vc6.0(不要管你以后用什么工具,這步最好用vc6.0)打開C:\DXSDK\Samples\C++\DirectShow\BaseClasses\baseclasses.dsw
好像能直接編譯通過,編譯設置win32 debug(先不要管那個win32 debug unicode),最后得到文件
C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug\strmbasd.lib
如果這步編譯不過去不要急,往下看......做完第三步定能編譯過去,哈哈
第三步:不要想像別的SDK一樣,只把用到的.h提出來就可以了,開發和學習過程中只能配置vc目錄選項以找到相應的調用文件,
配置方法:vc6.0和vc2005相同,以vc6.0為例:工具-選項-目錄
include files
C:\DXSDK\Include???? //一定放在最上面,切記
C:\DXSDK\Samples\C++\DirectShow\BaseClasses //一定放在最上面,切記
library files
C:\DXSDK\Lib?????? //順序隨意
C:\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug //順序隨意
第四步前傳:第二步的strmbasd.lib一定要存在
第四步:vc6.0使用過程
在stdafx.h文件加入以下二行代碼:
#pragma comment(lib, "strmbasd.lib")
#include <Streams.h>
F7編譯,如果通過,vc6.0的DirectShow環境已OK
第五步:vc2005使用過程
在stdafx.h文件加入以下二行代碼:
#pragma comment(lib, "strmbasd.lib")
#include <Streams.h>
F7編譯,不通過,主要有2個錯誤
第1個錯誤:error C2146: syntax error : missing ';' before identifier 'PVOID64'
轉到錯誤文件:winnt.h找到如下兩行代碼:
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;
在這兩行代碼前加上這行#define POINTER_64 __ptr64可解決//只改一處喲,
再F7編譯:提示:conversion from 'LONG' to 'PVOID' of greater size,這是第2個錯誤,注意這次是"PVOID"非上次的'PVOID64'
這個就不能一個一個地改了,因為有很多地方。這是因為在VC6中,如果沒有顯示的指定返回值類型,編譯器將其視為默認整形;但是vs2005不支持默認整形,解決這個問題不能修改每個沒有顯示指示返回值類型的函數地方,可以用wd4430來解決;具體的在vs2005項目/屬性/ C++/命令行/附加選項中添加/wd4430即可。
再F7編譯:通過
vc2005的DirectShow環境已OK
第六步前傳:用DirectShow編寫1個播放avi視頻文件的程序并運行,
做準備工作如下,一定要在網上下個ffShow解碼器安裝后才可以;不下我也不知道行不行,反正我是下完了運行沒問題
關于ffShow解碼器愿意看的本文最下面有個題外話
第六步:vc6.0或vc2005在Dialog上任意放個按鈕,添加如下代碼,編譯,運行就可以了
view plaincopy to clipboardprint?
void CShow1Dlg::OnButton1()???
{??
// COM庫初始化??
CoInitialize(NULL);??
?
?
// 創建組件對象 Graph(圖表,可理解為一個Filter鏈表)??
IGraphBuilder?? *pGraph;???
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,??
?? IID_IGraphBuilder, (void **)&pGraph);??
?
?
// 查詢得到組件對象上的接口??
IMediaControl?? *pMediaControl;???
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);???
IMediaEvent?????? *pEvent;???
pGraph->QueryInterface(IID_IMediaEvent,?? (void?? **)&pEvent);??
?
??????
// 創建 Graph 從一個硬盤文件??
pGraph->RenderFile(L"d:\\kk4.mpg",?? NULL);??
?
??????
// 調用接口方法 運行圖表???
pMediaControl->Run();????
?
??????
// 調用接口方法 等待圖表結束???????
long?? evCode;?????
pEvent->WaitForCompletion(INFINITE,?? &evCode);??
?
??????
// 釋放調用的對象及其接口??
pMediaControl->Release();?????
pEvent->Release();?????
pGraph->Release();??
?
?
// 釋放COM庫所使用的資源??
CoUninitialize();??
?
?
}?
轉載于:https://www.cnblogs.com/seacode/archive/2010/07/14/1777505.html
總結
以上是生活随笔為你收集整理的(转)DirectShow9在VS2005或vc6.0下编译出现问题的解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在欲而无欲,居尘不染尘
- 下一篇: 【摘录】BREW应用的c++实现注意点