• (转)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();  
     
     

  • 相关阅读:
    数据库设计
    企业Logo的发展趋势
    把握面试关键点才是上策
    关注程序员健康之——保护你的腰椎
    常见病的中医药诊治胃痛,呕吐,腹痛,泄泻,分型论治
    孕妈咪 只要恭喜 不要害喜
    职业程序员培养之道
    呕吐、哕、下利病
    脾胃系病证便秘,痢疾,泄泻,腹痛,呃逆。。。。。。。。
    Oracle数据库DBA原文经典书籍
  • 原文地址:https://www.cnblogs.com/seacode/p/1777505.html
Copyright © 2020-2023  润新知