擷取 Type-2 DV 檔案

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

type-2 DV AVI 檔案有兩個數據流,一個包含 DV 視訊,另一個包含音訊。 若要在預覽時擷取 type-2 檔案,請使用下圖所示的篩選圖表。

具有預覽的 type-2 擷取

此圖表與類型 1 擷取的圖形幾乎相同 (請參閱 擷取 Type-1 DV 檔案) 。 不過,擷取資料流程會在到達AVI Mux篩選器之前通過DV 分割器篩選。 因此,AVI Mux 會收到兩個數據流:音訊資料流程和 DV 編碼的視訊串流。

建置此圖表,如下所示:

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)
IBaseFilter           *pAviMux    // Avi Mux filter.
IBaseFilter           *pDVSplit;  // DV Splitter

// Initialize pDV (not shown). 
// Create and initialize the Capture Graph Builder (not shown).

// Create the DV Splitter and add it to the filter graph.
hr = CoCreateInstance(CLSID_DVSplitter, 0, CLSCTX_INPROC_SERVER,
    IID_IBaseFilter, reinterpret_cast<void**>)(&pDVSplit));
hr = pGraph->AddFilter(pDVSplit, L"DV Splitter");

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

// Connect the capture pin to the DV Splitter, and render one stream from
// the DV Splitter to the AVI Mux. 
hr = pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, 
    pDV, pDVSplit, pAviMux);

// Render the other stream from the DV splitter to the AVI Mux.
hr = pBuilder->RenderStream(0, 0, pDVSplit, 0, pAviMux);

// Render the preview stream.
hr = pBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Interleaved, 
    pDV, 0, 0);

// Remember to release all interfaces.
  1. 建立 DV 分割器,並將它新增至篩選圖形。
  2. 呼叫 ICaptureGraphBuilder2::SetOutputFileName ,將 AVI Mux 篩選器連線到檔案寫入器篩選器。
  3. 呼叫 ICaptureGraphBuilder2::RenderStream ,將 MSDV 擷取篩選器連線到 DV 分割器。 此呼叫也會將其中一個 DV 分割器的輸出針腳連接到 AVI Mux。
  4. 再次呼叫 RenderStream,將 DV 分割器的其他針腳連接到 AVI Mux。
  5. 第三次呼叫 RenderStream 來轉譯預覽資料流程。 如果不想預覽影片,請略過此步驟。

DirectShow 中的數位影片