共用方式為


將 DV 擷取至未壓縮 RGB

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

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

將未壓縮的 rgb 擷取至檔案

DV 分隔器篩選器會將交錯的音訊/視訊分割成不同的視訊和音訊串流。DV 編碼的視訊會移至 DV 視訊譯碼器 篩選,以輸出未壓縮的 RGB 視訊。 RGB 視訊會透過Smart Tee篩選器路由傳送至 AVI Mux 篩選器(用於擷取)和視訊轉譯器(預覽)。 同時,DV 分隔器的音訊串流會通過 Infinite Pin Tee 篩選器到 AVI Mux 和音訊轉譯器。 Filter Graph 管理員會使用範例和圖形參考時鐘上的時間戳,讓所有這些數據流保持同步。

此圖表看起來可能不必要複雜,但可確保 DV 編碼的視訊串流只會譯碼一次,這可將 CPU 需求降到最低。 此外,請注意,視訊會經過Smart 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 中的數位視訊