在 DES 中编写 Windows 媒体文件

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

[此 API 不受支持,将来可能会更改或不可用。]

本部分介绍如何使用 DirectShow Editing Services (DES) 编写 Windows 媒体文件。

重要

请勿使用智能呈现引擎来写入 Windows Media 文件。 始终使用基本呈现引擎 (CLSID_RenderEngine) 。

 

若要编写 Windows Media 文件,请执行以下操作:

  1. 使用指向密钥提供程序的指针在呈现引擎上调用 SetSite

  2. 生成图形的前端。 (请参阅 呈现 Project.)

  3. 创建 WM ASF 编写器 筛选器并将其添加到图中。

  4. 使用 WM ASF 编写器筛选器上的 IFileSinkFilter 接口来设置文件名。

  5. 将 WM ASF 编写器配置为使用 Windows 媒体配置文件。 每个配置文件都有预定义的流数。 必须选择与项目中的组匹配的配置文件。

    IConfigAsfWriter 接口包含一些用于设置配置文件的不同方法。 例如, ConfigureFilterUsingProfileGuid 方法将系统配置文件指定为 GUID。 或者,可以使用 Windows Media Format 方法获取 IWMProfile 指针,然后调用 IConfigAsfWriter::ConfigureFilterUsingProfile。 有关详细信息,请参阅 配置 ASF 编写器

  6. 将前端连接到 ASF 编写器。 图形的前端包含每个组的一个输出引脚。 假设你指定了兼容的配置文件,ASF 编写器应具有一组匹配的输入引脚。 将每个输出引脚连接到相应的输入引脚。 执行此操作的最简单方法是使用 ICaptureGraphBuilder2::RenderStream 方法。 首先,创建 捕获图形生成器 的新实例,并使用指向 Filter Graph Manager 的指针对其进行初始化:

    ICaptureGraphBuilder2 *pBuild = 0;
    hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, 0, CLSCTX_INPROC_SERVER,
        IID_ICaptureGraphBuilder2, (void**)&pBuild);
    pBuild->SetFiltergraph(pGraph); 
    

    接下来,通过调用 IRenderEngine::GetGroupOutputPin 方法检索每个组的输出引脚。 调用 RenderStream 以将引脚连接到 ASF 编写器:

    long cGroups = 0;
    hr = pTimeline->GetGroupCount(&cGroups);
    for (long i = 0; i < cGroups; i++)
    {
        IPin *pPin;
        hr = pRenderEngine->GetGroupOutputPin(i, &pPin);
        if (SUCCEEDED(hr))
        {
            hr = pBuild->RenderStream(0, 0, pPin, 0, pASF);
        }
        pPin->Release();
    }
    pBuild->Release
    

将 Windows Media 与 DirectShow 编辑服务配合使用