DirectShow开发基础( 二 )------简单的DirectShow程序

DirectShow开发基础( 二 )------简单的DirectShow程序
编写一个DirectShow应用程序大体需要3个步骤
  1. 创建一个Filter Graph Manager的实例
  2. 使用Filter Graph Manager创建一个filter graph,此时需要必备的filter
  3. 使用Filter Graph Manager控制filter graph和通过这些filter的流,在这个过程中,应用程序会收到Filter Graph Manager发送的事件
   DirectShow开发基础( 二 )------简单的DirectShow程序_第1张图片
  完成上述几步后,最后需要释放这个Filter Graph Manager和所有的Filter资源。
示例(头文件和库文件已在安装vs2008时配置好了,在$(FrameworkSDKDir)include,即C:\Program Files\Microsoft SDKs\Windows\v6.0A里):                                  
#include  " stdafx.h "

#include 
< DShow.h >                    // 引入DirectShow头文件
// 引入DirectShow库文件,这里采用从源程序引入,也可以配置开发环境来引入
#pragma comment(lib, " strmiids.lib "
int  _tmain( int  argc, _TCHAR *  argv[])     
{
    IGraphBuilder 
* pGraph  =  NULL;          // 图表管理器接口
    IMediaControl  * pControl  =  NULL;        // 媒体控制接口
    IMediaEvent  * pEvent  =  NULL;            // 媒体事件接口
    
// 初始化COM库
    HRESULT hr  =  CoInitialize(NULL);
    
if  (FAILED(hr))
    {
        printf(
" ERROR - Could not initialize COM library. " );
        
return   - 1 ;
    }
    
// 创建滤波器链表管理器
    hr  =  CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder,( void ** ) & pGraph);
    
if  (FAILED(hr))
    {
        printf(
" ERROR - Could not create the Filter Graph Manager. " );
        
return   - 1 ;
    }
    
// 查询媒体控制和媒体事件接口
    hr  =  pGraph -> QueryInterface(IID_IMediaControl,( void ** ) & pControl);
    hr 
=  pGraph -> QueryInterface(IID_IMediaEvent,( void ** ) & pEvent);
    
// 建立链表
    hr  =  pGraph  -> RenderFile(L " E:\\MicroMouse\\MicroMouse615走迷宫演示.WMV " ,NULL);
    
if  (SUCCEEDED(hr))
    {
        
// 运行链表
        hr  =  pControl -> Run();
        
if  (SUCCEEDED(hr))
        {
            
// 等待回放结束事件
             long  evCode;          // 事件码
            pEvent -> WaitForCompletion(INFINITE, & evCode); // 无限时间的等待,直到媒体播放结束
        }
    }
    
// 释放所有资源和关闭COM库
    pControl -> Release();
    pEvent
-> Release();
    pGraph
-> Release();
    CoUninitialize();

    
return   0 ;
}
                           

你可能感兴趣的:(DirectShow开发基础( 二 )------简单的DirectShow程序)