从类型 2 文件传输

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

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

带有预览类型 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 筛选器。 下一次调用将一个流从 Infinite Pin Tee 连接到 MSDV 捕获筛选器。 此流将传输到设备。 上次调用 RenderStream 将生成图形的预览部分。

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

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

在 DirectShow 数字视频