DirectShow 过滤器 - 它们是什么






2.87/5 (26投票s)
本文介绍了 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 日星期日:仅仅是一个最基本的可用模型