65.9K
CodeProject 正在变化。 阅读更多。
Home

DirectShow 过滤器 - 它们是什么

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.87/5 (26投票s)

2006年8月10日

CPOL

4分钟阅读

viewsIcon

180209

downloadIcon

5508

本文介绍了 DirectShow 过滤器以及如何创建它们。

引言

DirectShow 是 Windows 平台上的媒体流架构。借助它,您可以完成以下操作:

  • 播放媒体流
  • 捕获媒体流
  • 媒体编辑

构建环境

所有想要使用 DirectShow 的应用程序都必须包含头文件Dshow.h,并使用库Strmiids.lib

首先 - 初始化 COM

DirectShow 基于 COM 模型,因此在使用它之前必须初始化 COM。您可以使用 CoInitialize() 来完成。在使用完 COM 后,您也必须使用 CoUninitialize() 来取消初始化 COM。这意味着所有 DirectShow 调用都夹在 COM CoInitialize()CoUninitialize() 调用之间。

让我们开始 Direct Show

让我们来了解一下 DirectShow 是什么。

DirectShow 的构建块“过滤器”

正如前面所述,DirectShow 基于 COM 架构。DirectShow 由一系列 COM 对象组成,它们执行特定的工作(例如读取数据)。这些 COM 对象在 DirectShow 中被称为“过滤器”。DirectShow 提供了一组标准过滤器,开发人员可以编写自己的过滤器来扩展 DirectShow。作为一个简单的例子,让我们看看如何使用在播放 AVI 文件中发挥作用的过滤器。

  • 文件源过滤器(从文件中读取数据)
  • AVI 分割器过滤器(分离音频和视频)
  • 解码器过滤器(根据使用的压缩方式解码视频帧)
  • 视频渲染过滤器(绘制视频帧)
  • DirectSound 设备过滤器(将音频发送到声卡)

从上面的描述可以看出,DirectShow 由小的组件构成,它们各自独立工作,但又被连接在一起以完成复杂的任务。

引脚

如前所述,这些 COM 组件被连接在一起以执行一项操作,连接点也是 COM 对象,称为“引脚”。

DirectShow 的“过滤器图”

您已经看到,播放一个 AVI 文件大约需要五个过滤器协同工作。所有这些过滤器对于此操作都是必需的。如果缺少任何一个过滤器,文件将无法按预期播放。因此,成功运行一项操作所需的一组过滤器称为“过滤器图”。

如何构建“过滤器图”

构建过滤器图意味着创建适当的过滤器并通过引脚将它们连接起来,以便它们能够成功地执行所需的操作。这听起来像是一项复杂的操作,但 DirectShow 提供了可以帮助我们构建过滤器图的组件。下面列出了一些

  • 过滤器图管理器(用于文件播放和控制过滤器图)
  • 捕获图构建器(用于捕获)
  • DVD 图构建器(用于 DVD 播放)

DirectShow 的骨干“过滤器图管理器”

过滤器图管理器是 DirectShow 的基本组件,几乎在所有 DirectShow 应用程序中都会用到。无论您是想播放文件、通过设备捕获还是想要 DVD 播放,过滤器图管理器都是必须创建的组件。不一定总是需要创建此对象,有时它是由其他对象为我们创建的。过滤器图管理器执行以下操作:

  • 提供构建过滤器图的方法(添加、删除、连接过滤器)
  • 协调过滤器之间的状态更改(播放、暂停、停止、查找)
  • 处理过滤器的同步(使用参考时钟)
  • 进行事件通知(供应用程序了解状态更改和其他事件)

“过滤器图管理器”公开的接口

以下是过滤器图管理器公开的一些重要接口:

  • IBasicAudio(控制音频流的音量和平衡)
  • IBasicVideo(设置视频属性)
  • IGraphBuilder(帮助构建过滤器图)
  • IMediaControl(控制过滤器图中的数据流)
  • IMediaEventEx(用于事件通知和覆盖默认事件处理)
  • IMediaSeeking(用于在流中查找位置)
  • IVideoWindow(设置视频窗口属性)

实际创建“过滤器图管理器”

步骤 1(创建对象)

以下代码创建了一个过滤器图管理器对象,并提供了指向过滤器图管理器对象公开的 IGraphBuilder 接口的接口指针。

    IGraphBuilder *pGB   = NULL;
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                         IID_IGraphBuilder, (void **)&pGB);

在上面的代码中,创建了一个过滤器图管理器的实例。现在,实际工作开始了。您现在必须决定谁将构建图。过滤器图管理器支持以下方式:

  • 过滤器图管理器构建整个图
  • 过滤器图管理器构建部分图
  • 应用程序构建整个图

在这里我将使用第一种方法。

步骤 2(自动构建图)

IGraphBuilder::RenderFile 方法用于为指定文件自动构建过滤器图。通过这种方式,过滤器图管理器会连接指定媒体文件的适当过滤器。这在 DirectShow 中称为“智能连接”。

  // Have the graph builder construct the appropriate graph automatically
        pGB->RenderFile(L"J:\\VIdeo\\ruby.avi", NULL);

步骤 3(一切就绪,只需运行)

IMediaControl::Run 方法用于启动过滤器图中的数据流。IMediaControl 提供了控制过滤器图中数据流的方法,例如运行、暂停或停止。您必须先获取 IMediaControl 接口,然后调用 IMediaControl::Run

    IMediaControl *pMC   = NULL;
    pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);    
    pMC->Run();

步骤 4(我们完成了,调用 Release)

完成后,只需调用应用程序中使用的接口的 Release() 来释放资源。

    pMC->Release();
    pGB->Release();    

祝您好运。在 DirectShow 编程中愉快!

历史

  • 2006 年 7 月 30 日星期日:仅仅是一个最基本的可用模型
© . All rights reserved.