捕获类型 2 DV 文件

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

类型 2 DV AVI 文件有两个流,一个包含 DV 视频,另一个包含音频。 若要在预览时捕获类型 2 文件,请使用下图中显示的筛选器图。

使用预览版捕获类型 2

此图与类型 1 捕获的图几乎相同 (请参阅 捕获类型 1 DV 文件) 。 但是,捕获流在到达 AVI 复用器筛选器之前会通过 DV 拆分器筛选器。 因此,AVI 复用器接收两个流:一个音频流和一个 DV 编码的视频流。

按如下所示生成此图:

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)
IBaseFilter           *pAviMux    // Avi Mux filter.
IBaseFilter           *pDVSplit;  // DV Splitter

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

// Create the DV Splitter and add it to the filter graph.
hr = CoCreateInstance(CLSID_DVSplitter, 0, CLSCTX_INPROC_SERVER,
    IID_IBaseFilter, reinterpret_cast<void**>)(&pDVSplit));
hr = pGraph->AddFilter(pDVSplit, L"DV Splitter");

// Create the file-writing section of the graph.
hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,
    OLESTR("C:\\Example2.avi"), &pAviMux, 0);

// Connect the capture pin to the DV Splitter, and render one stream from
// the DV Splitter to the AVI Mux. 
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, 
    pDV, pDVSplit, pAviMux);

// Render the other stream from the DV splitter to the AVI Mux.
hr = pBuilder->RenderStream(0, 0, pDVSplit, 0, pAviMux);

// Render the preview stream.
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Interleaved, 
    pDV, 0, 0);

// Remember to release all interfaces.
  1. 创建 DV 拆分器并将其添加到筛选器图。
  2. 调用 ICaptureGraphBuilder2::SetOutputFileName 将 AVI 复用器筛选器连接到文件编写器筛选器。
  3. 调用 ICaptureGraphBuilder2::RenderStream 将 MSDV 捕获筛选器连接到 DV 拆分器。 此调用还会将 DV 拆分器输出引脚之一连接到 AVI 复用器。
  4. 再次调用 RenderStream,将 DV 拆分器的另一个引脚连接到 AVI 复用器。
  5. 第三次调用 RenderStream 以呈现预览流。 如果不想预览视频,请跳过此步骤。

DirectShow 中的数字视频