从类型 2 文件传输

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

type-2 transmit with preview

type-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 复用器。 在第一次调用中,捕获Graph生成器会自动将 AVI 拆分器添加到图中,并将其中一个 AVI 拆分器输出引脚连接到 DV 复用器。 第二次调用中,捕获Graph生成器找到 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中的数字视频