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