将 DV 捕获到未压缩的 RGB

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

此示例演示如何从摄像机捕获 DV,并在预览时将其保存为未压缩的 RGB 文件。 使用下图中显示的筛选器图。

将未压缩的 rgb 捕获到文件

DV 拆分器筛选器将交错的音频/视频拆分为单独的视频和音频流。DV 编码的视频将进入 DV 视频解码器 筛选器,该筛选器输出未压缩的 RGB 视频。 RGB 视频通过 Smart Tee 筛选器路由到用于捕获) 的 AVI Mux 筛选器 (,视频呈现器 (用于预览) 。 同时,来自 DV 拆分器的音频流通过 Infinite Pin Tee 筛选器传递到 AVI 复用器和音频呈现器。 Filter Graph 管理器使用样本和图形引用时钟上的时间戳使所有这些流保持同步。

此图看起来可能不必要地复杂,但它可确保仅解码一次 DV 编码的视频流,从而最大程度地减少 CPU 要求。 另请注意,视频通过智能 Tee 筛选器,而音频通过无限固定 Tee 筛选器。 Smart Tee 可以删除预览帧以提高捕获性能,这对于视频来说是可取的,但对于音频来说,这是非常明显的。 此外,由于音频所需的带宽比视频低得多,因此在文件中删除音频的可能性相对较小。

必须一次生成此图一个部分,但 RenderStream 方法仍能提供帮助。 使用以下代码:

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

// MSDV to DV splitter.
IBaseFilter *pDVSplit;  // Create the DV Splitter (CLSID_DVSplitter)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pDV, 0, pDVSplit);

// Splitter to DV Decoder to Smart Tee.
IBaseFilter *pDVDec; // Create the DV Decoder (CLSID_DVVideoCodec)
IBaseFilter *pSmartTee; // Create the Smart Tee (CLSID_SmartTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Video, pDVSplit, pDVDec,
    pSmartTee);

// Smart Tee (video) to Avi Mux.
IPin *pPin1;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 0, &pPin1);
hr = pBuilder->RenderStream(0, 0, pPin1, 0, pMux);

// Smart Tee to preview.
IPin *pPin2;
hr = pBuilder->FindPin(pSmartTee, PINDIR_OUTPUT, 0, 0, TRUE, 1, &pPin2);
hr = pBuilder->RenderStream(0, 0, pPin2, 0, pMux);

// DV Splitter (audio) to Infinite Tee to Avi Mux.
IBaseFilter *pTee; // Create the Infinite Pin Tee (CLSID_InfTee)
hr = pBuilder->RenderStream(0, &MEDIATYPE_Audio, pDVSplit, pTee, pMux);

// Infinite Pin Tee to preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);

必须创建 DV 拆分器、DV 视频解码器、Smart Tee 和 Infinite Pin Tee 筛选器,并将每个筛选器添加到筛选器图。 (为简洁起见,上述代码省略了这些步骤。) 此示例使用 ICaptureGraphBuilder2::FindPin 方法在 Smart Tee 筛选器上查找捕获和预览图钉;捕获始终为输出引脚 0,预览版为输出引脚 1。

DirectShow 中的数字视频