从类型 1 文件传输

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

若要在预览文件时传输类型 1 文件,请使用下图中显示的筛选器图。

带有预览类型 1 传输

此图中的筛选器包括:

  • AVI 拆分器 分析 AVI 文件。 对于类型 1 DV 文件,输出引脚提供交错的 DV 样本。
  • 无限 Pin Tee 筛选器将交错的 DV 拆分为传输流和预览流。 这两个流都包含相同的交错数据。 (此图使用 Infinite Pin Tee 而不是 Smart Tee,因为从文件读取时没有删除帧的危险,因为存在实时捕获。
  • DV 拆分器 将交错流拆分为 DV 视频流,该流由 DV 视频解码器解码,以及音频流。 这两个流都呈现为预览版。

生成此图,如下所示:

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)

// Initialize pDV (not shown). 
// Create and initialize the Capture Graph Builder (not shown).

// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");

// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
    L"C:\\YourFileNameHere.avi",
    L"Source", 
    &pFileSource);

// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");

// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
    // This is not an AVI file. 
}

// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
    // This is not a type-1 DV file.
}

// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);

// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
  1. 调用 IGraphBuilder::AddSourceFilter 将源筛选器添加到筛选器图。
  2. 创建 AVI 拆分器和无限 Pin Tee,并将其添加到图形。
  3. 调用 ICaptureGraphBuilder2::RenderStream 将源筛选器连接到 AVI 拆分器。 指定MEDIATYPE_Interleaved以确保如果源文件不是类型 1 DV 文件,该方法将失败。 在这种情况下,可以回退并尝试生成类型 2 传输图形。
  4. 再次调用 RenderStream,将交错的流从 AVI 拆分器路由到无限 Pin Tee
  5. 第三次调用 RenderStream,将一个流从 Infinite Pin Tee 路由到 MSDV 筛选器,以便传输到设备。
  6. 上次调用 RenderStream,以生成图形的预览部分。

如果不想预览,只需将文件源连接到 MSDV 筛选器:

hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);

在 DirectShow 数字视频