从类型 2 文件传输

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

若要在预览时传输 type-2 文件,请使用下图所示的筛选器图。

带预览版的 type-2 传输

类型 2 文件有两个流,一个音频流和一个 DV 编码的视频流。 此图使用 DV 复用器 筛选器来组合音频和视频流。 它将交错的流发送到 MSDV 筛选器,但会再次拆分流以供预览。

按如下所示生成此图:

// Add the DV Mux filter to the graph.
IBaseFilter *pDVMux;
hr = CoCreateInstance(CLSID_DVMux, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pDVMux));
hr = pGraph->AddFilter(pDVMux, L"DV Mux");

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

hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pDVMux);

// 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");

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

此代码对 RenderStream 进行多次调用:

前两个将源筛选器连接到 AVI 拆分器,将 AVI 拆分器连接到 DV 复用器。 在第一次调用中,捕获图形生成器会自动将 AVI 拆分器添加到图形,并将 AVI 拆分器输出引脚之一连接到 DV 复用器。 第二次调用中,捕获图形生成器会查找 AVI 拆分器的第二个输出引脚,并将其连接到 DV 复用器。

RenderStream 的第三次调用将 DV 复用器连接到 Infinite Pin Tee 筛选器。 下一次调用将无限固定 Tee 中的一个流连接到 MSDV 捕获筛选器。 此流将传输到设备。 最后一次调用 RenderStream 将生成图形的预览部分。

如果在传输时不想预览,可以省略 Infinite Pin Tee,只需将 DV 复用器连接到 MSDV 筛选器:

hr = pBuilder->RenderStream(0, 0, pDVMux, 0, pDV);

DirectShow 中的数字视频