共用方式為


將 DV 擷取至未壓縮的 RGB

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

此範例示範如何在預覽時從攝影機擷取 DV,並將它儲存至檔案作為未壓縮的 RGB。 使用下圖所示的篩選圖表。

將未壓縮的 rgb 擷取至檔案

DV 分割器篩選器會將交錯的音訊/視訊分割成不同的視訊和音訊串流:DV 編碼的視訊會移至 DV 視訊解碼器 篩選器,以輸出未壓縮的 RGB 視訊。 RGB 視訊會透過 Smart Tee 篩選準則路由傳送至 AVI Mux 篩選 (,以進行擷取) ,以及用於預覽) 的視訊轉譯器 (。 同時,DV 分割器的音訊串流會通過無限針腳 Tee 篩選器,以傳送至 AVI Mux 和音訊轉譯器。 篩選圖形管理員會使用範例上的時間戳記和圖形參考時鐘,讓所有這些資料流程保持同步。

此圖表看起來可能不必要,但可確保 DV 編碼的視訊串流只會解碼一次,這可將 CPU 需求降到最低。 此外,請注意,視訊會在音訊通過無限釘選播放篩選器時通過 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 視訊解碼器、Smart Tee 和 Infinite Pin Tee 篩選器,並將每一個篩選圖形新增至篩選圖形。 (為了簡潔起見,上述程式碼會省略這些步驟。) 此範例會使用 ICaptureGraphBuilder2::FindPin 方法來尋找 Smart Tee 篩選器上的擷取和預覽釘選;擷取一律為輸出針腳 0,而預覽則是輸出針腳 1。

DirectShow 中的數位視訊