[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
此示例演示如何从摄像机捕获 DV,并在预览时将其另存为未压缩的 RGB。 使用下图所示的筛选器图。
DV 拆分器筛选器将交错的音频/视频拆分为单独的视频和音频流,DV 编码的视频将转到 DV 视频解码器 筛选器,该筛选器输出未压缩的 RGB 视频。 RGB 视频通过 Smart Tee 筛选器路由到 AVI Mux 筛选器(用于捕获)和视频呈现器(预览)。 同时,来自 DV 拆分器的音频流通过无限引脚 Tee 筛选器到 AVI Mux 和音频呈现器。 Filter Graph 管理器使用样本上的时间戳和图形引用时钟来保持所有这些流同步。
此图看起来可能不必要复杂,但可确保仅解码一次 DV 编码的视频流,从而最大程度地减少 CPU 要求。 另请注意,当音频通过无限固定 Tee 筛选器时,视频会经过 Smart 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 视频解码器、智能 Tee 和无限固定 Tee 筛选器,并将每个筛选器添加到筛选器图。 (为简洁起见,上述代码中省略了这些步骤。此示例使用 ICaptureGraphBuilder2::FindPin 方法查找 Smart Tee 筛选器上的捕获和预览图钉;捕获始终是输出引脚 0,预览是输出引脚 1。
相关主题
-
在 DirectShow 中 数字视频