DirectShow开发中的HelloWorld

环境设置... 1

DirectShow编程简介... 1

播放文件例程... 3

一 环境设置

该节介绍如何建立DirectShow应用程序。你可以建立一个控制台程序,或者Visual Studio环境下的其它Visual C++的项目。

头文件

所有DirectShow 程序都使用下表中的头文件。

头文件

    

dshow.h

所有DirectShow 程序。

有些DirectShow接口会要求其他头文件,你可以去查看这些接口的参考手册。

库文件

DirectShow程序要使用的库文件如下:

库文件

           

Strmiids.lib

提供类标识(CLSIDs)和接口表示(IIDs)。所有的DirectShow程序都要求使用该库文件。

Quartz.lib

提供AMGetErrorText函数,如果你不调用这个函数,就可以不加载该库文件。

可以把DirectX SDK Include Lib目录放在Visual Studio的搜索路径的第一位。以确保你可以使用最新的版本!

 

编写DirectShow 程序

在大部分的情况下,DirectShow应用程序必须执行下面3个步骤:

 

  1. 应用程序建立一个Filter Graph Manager的实例。
  2. 应用程序使用Filter Graph Manager 去建立一个filter graph. Filter graph中的过滤器依赖与应用程序的需求。
  3. 应用程序使用Filter Graph Manager 去控制filter graph 并通过过滤器去对数据解析分流。在整个处理过程中,应用程序都将响应Filter Graph Manager的事件。

当处理完成后,应用程序将释放掉Filter Graph Manager和所有的过滤器。

DirectShow 是基于COM的。Filter Graph Manager 和过滤器都是COM对象。你应该对COM编程有全面的了解。

三 播放文件例程

这里提供一个控制台应用程序去播放一个音、视频文件。这个程序只有几行长。

在前面介绍了一个基于DirectShow的应用程序,必须要进行如下几个基本步骤:

  1. 建立一个Filter Graph Manager的实例.
  2. 使用Filter Graph Manager 建立一个filter graph.
  3. 运行这个graph

全部源码如下:

#include <dshow.h>

void main(void)

{

    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;

    }

   // 建立过滤器图表管理器

    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;

    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);

    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // 建立过滤器图表

    hr = pGraph->RenderFile(L"C://Example.avi", NULL);

    if (SUCCEEDED(hr))

    {

      // 播放

        hr = pControl->Run();

        if (SUCCEEDED(hr))

        {

            // 等待播放结束

            long evCode;

            pEvent->WaitForCompletion(INFINITE, &evCode);

        }

    }

    pControl->Release();

    pEvent->Release();

    pGraph->Release();

    CoUninitialize();

}v

你可能感兴趣的:(manager,filter,null,Graph,include,library)