DirectShow+VS2005配置日记

由于需要进行视频采集,昨天开始搜索资料,发现现在流行的是DirectShow来进行开发,昨天下载安装了个DirectX 9.0 SDK,于是痛苦的配置旅程开始了。现在我们来重温一下这个痛苦的历程吧。先介绍下我的配置吧:

Microsoft DirectX 9.0 SDK + Microsoft Visual Stiduo 2005

我的Microsoft DirectX 9.0 SDK 安装在D盘根目录,进入这个目录D:/DXSDK/Samples/C++/DirectShow/Capture里面有几个项目文件,我们拿AMCap这个项目来用,首先我们拷贝一个副本AMCap1(为了保险起见!),要想看看AMCap最终的运行效果,我们可以进入这个目录:D:/DXSDK/Samples/C++/DirectShow/Bin第一个应该就是它了,相信你能找到的(就是那个叫AMCap.exe的!)

用Microsoft Visual Stiduo 2005打开工程,可能需要转换下,转换就是了,先什么也别做,开始编译工程(默认的配置管理器中的活动解决方案配置Debug Unicode活动解决方案平台Win32),我得到了下面的错误:

amcap.cpp
C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(222) : error C2146: syntax error : missing ';' before identifier 'PVOID64'
C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(222) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C2146: syntax error : missing ';' before identifier 'Buffer'
C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/include/winnt.h(5940) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
d:/DXSDK/include/uuids.h : warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss
./amcap.cpp(2787) : error C2065: 'i' : undeclared identifier


 

双击输出窗口中的错误到错误发生处,上图中蓝色部分第一个错误的解决办法是在winnt.h文件中将( 附1
typedef  void   * PVOID;
typedef  void   *  POINTER_64 PVOID64;
修改为

#define POINTER_64 __ptr64 //加上这一行
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;

对于第二个错误改成:int i 就可以了。

修改完错误继续编译,发现编译已经没有错误了,只有一些警告,可以不去管它,但是有这样的一个错误:

LINK : fatal error LNK1104: 无法打开文件“../../baseclasses/debug_unicode/strmbasd.lib”

看错误的意思是缺少了一个库文件,于是在网上找了一下,原来需要先编译baseclasses,打开你的dx的sdk安装目录,本例为:
D:/DX90SDK/Samples/C++/DirectShow/
这里就有一个叫baseclasses的工程,为安全起见,请先备份此工程,然后打开该工程。转换后开始编译,我们收到了下面的错误:

./wxdebug.cpp(567) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
./winutil.cpp(2104) : error C2065: 'Count' : undeclared identifier
./winutil.cpp(2106) : error C2228: left of '.peRed' must have class/struct/union
./winutil.cpp(2106) : error C2228: left of '.peRed' must have class/struct/union
./winutil.cpp(2107) : error C2228: left of '.peGreen' must have class/struct/union
./winutil.cpp(2107) : error C2228: left of '.peGreen' must have class/struct/union
./winutil.cpp(2108) : error C2228: left of '.peBlue' must have class/struct/union
./winutil.cpp(2108) : error C2228: left of '.peBlue' must have class/struct/union
./winutil.cpp(2124) : error C2228: left of '.peFlags' must have class/struct/union
./outputq.cpp(664) : error C2065: 'iDone' : undeclared identifier

真正需要解决的是上面蓝色部分的三个错误,我们现在来开始解决(这里我们还是直接修改代码吧,通过修改配置也可以完成【 附2】不过我们一会还需要编译其他三个版本,为了免去后面还要继续设置,这里直接通过修改代码解决)。
对于前一个错误

//将
static g_dwLastRefresh = 0;
//修改为
int static g_dwLastRefresh = 0;

第二个错误【 附3】,在Count前面加上int就可以了(修改后编译后面还会出现类似的错误,照这样修改就是了!)
第三个错误,在出错的文件中会看到下面的代码,修改办法一并在下面列出,注释里有说明。

        LONG iLost = 0;
        LONG iDone = 0;      //这是我们修改的地方,加入这一行代码
        for (long iDone = 0;
             iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);
            ) {

//pragma message (REMIND("Implement threshold scheme"))
            ASSERT(m_nBatched < m_lBatchSize);
            if (iDone < nSamples) {
                m_ppSamples[m_nBatched++] = ppSamples[iDone++];
            }
            if (m_nBatched == m_lBatchSize ||
                nSamples == 0 && (m_bSendAnyway || !m_bBatchExact)) {
                LONG nDone;
                DbgLog((LOG_TRACE, 4, TEXT("Batching %d samples"),
                       m_nBatched));

                if (m_hr == S_OK) {
                    m_hr = m_pInputPin->ReceiveMultiple(m_ppSamples,
                                                        m_nBatched,
                                                        &nDone);
                } else {
                    nDone = 0;
                }
                iLost += m_nBatched - nDone;
                for (LONG i = 0; i < m_nBatched; i++) {
                    m_ppSamples[i]->Release();
                }
                m_nBatched = 0;
            }
        }
        *nSamplesProcessed = iDone - iLost; //这是编译报错误的地方

OK,修改完了,我们进行编译,这下成功了。你会发现在目录 D:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug_Unicode下有了一个库文件 strmbasd.lib
现在我们来得到其他三个库文件,打开配置管理器,我们上面的配置是这样的:
活动解决方案配置Debug Unicode活动解决方案平台Win32
分别修改如下的三种模式分别编译:
活动解决方案配置Debug活动解决方案平台Win32                                            
活动解决方案配置
Release Unicode活动解决方案平台Win32                          
活动解决方案配置
Release活动解决方案平台Win32                                          
这样我们就得到了4个库文件。
D:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug下有了一个库文件 strmbasd.lib
D:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug_Unicode
下有了一个库文件 strmbasd.lib
D:/DXSDK/Samples/C++/DirectShow/BaseClasses/Release下有了一个库文件 STRMBASE.lib
D:/DXSDK/Samples/C++/DirectShow/BaseClasses/Release_Unicode下有了一个库文件 STRMBASE.lib
现在大家再看看上面的那个红色的链接错误,知道怎么回事了吧。

好了,我们现在回去编译AMCap这个工程吧,怎么样,搞定了吧!

附1:
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,从而导致出错。

方法1:
在Tools -> Options -> Projects and Solutions -> VC++ Directories -> Include Files里确保系统包含目录(以S打头的)在最前面,同时在 project properties下面的“C/C++ -> General”中确保“Additional Include Directories”为空(因为它会被优先编译,这样就轮不到VC/PlatformSDK/Include/basetsd.h),所有的包含目录都应该在上面的include里面。这种方法不用改代码。

方法2:
在DXSDK自己的basetsd.h里自己定义#define POINTER_64 __ptr64

附2:
打开project->BaseClasses properties->configuration->C/C++ ->Command Line,增加/wd4430选项

附3:
C++标准语法的问题,因为在之前在for循环内定义的变量可以在for之外的地方使用,即在第一个for里for(int i,...),以后的for再使用i不必再声明,解决方法也很简单,打开project->BaseClasses properties->configuration->C/C++->Language->Force Comformance in For Loop Scrope设置为No即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VS2019和DirectShow是Windows平台下常用的开发工具和多媒体框架,而OpenCV是一个图像处理和计算机视觉库。 VS2019是由微软开发的集成开发环境(IDE),主要用于Windows上的应用程序开发。它提供了丰富的开发工具和功能,可以方便开发者进行代码编辑、编译、调试和部署等工作。对于DirectShow,它是一个面向Windows平台的多媒体框架,提供了在应用程序中捕获、处理和展示音视频数据的功能。通过DirectShow,我们可以开发各种多媒体应用,包括视频播放器、视频会议软件等。 而OpenCV是一个开源的图像处理和计算机视觉库,它可以用于处理图像、视频和三维点云等数据。OpenCV提供了各种各样的图像处理算法和函数,包括图像滤波、特征检测、相机标定等。通过OpenCV,我们可以方便地进行图像和视频处理,同时还能实现计算机视觉相关的任务,如目标检测、人脸识别等。 在VS2019中,我们可以使用DirectShow来进行音视频的捕获和处理,同时结合OpenCV库,可以对捕获的音视频进行图像处理和计算机视觉相关的任务。通过这样的组合,我们能够开发出更加强大和丰富的多媒体应用程序,尤其在需要对图像和视频进行处理的场景中,可以发挥其优势。 总的来说,VS2019作为IDE提供了开发多媒体应用所需的开发工具和环境,而DirectShow和OpenCV作为框架和库,提供了处理音视频和计算机视觉相关任务的功能和算法。它们之间的结合可以帮助开发者更好地实现多媒体应用的开发。 ### 回答2: VS2019是微软开发的集成开发环境,而DirectShow是微软开发的用于多媒体处理的API。OpenCV是一款开源的计算机视觉库。 在使用VS2019进行开发时,可以使用DirectShow来实现多媒体处理相关的功能,例如音视频播放、视频采集、图像处理等。通过DirectShow,可以方便地处理多种格式的音视频数据,并进行各种需要的操作。VS2019提供了DirectShow的相关支持,可以通过安装DirectX SDK来获取DirectShow的开发包。 而OpenCV则是一款强大的计算机视觉库,其中包含了许多图像处理、计算机视觉和机器学习相关的功能和算法。在使用VS2019进行开发时,可以通过集成OpenCV来实现各种图像处理和计算机视觉相关的功能,如图像读取、图像处理、特征提取、目标检测等。通过OpenCV,可以快速地实现各种计算机视觉应用,并且OpenCV还提供了丰富的文档和示例供开发者参考。 总之,VS2019可以与DirectShow和OpenCV结合使用,通过DirectShow实现音视频处理相关的功能,通过OpenCV实现图像处理和计算机视觉相关的功能。这样可以方便地进行多媒体和视觉应用的开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值