共用方式為


從 Type-1 檔案傳輸

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

若要在預覽檔案時傳輸 type-1 檔案,請使用下圖所示的篩選圖表。

具有預覽type-1 傳輸

此圖表中的篩選包括:

  • AVI 分割器 剖析 AVI 檔案。 針對 type-1 DV 檔案,輸出針腳會傳遞交錯的 DV 範例。
  • Infinite Pin Tee 篩選器會將交錯的 DV 分割成傳輸數據流和預覽串流。 這兩個數據流都包含相同的交錯數據。 (此圖表使用 Infinite Pin Tee 而非 Smart Tee,因為從檔案讀取時沒有卸除框架的危險,因為有實時擷取。
  • DV 分割器 會將交錯的數據流分割成 DV 視訊串流,由 DV 視訊譯碼器和音訊串流譯碼。 這兩個數據流都會轉譯以供預覽。

建置此圖表,如下所示:

ICaptureGraphBuilder2 *pBuilder;  // Capture graph builder.
IBaseFilter           *pDV;       // DV capture filter (MSDV)

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

// Add the Infinite Pin Tee filter to the graph.
IBaseFilter *pTee;
hr = CoCreateInstance(CLSID_InfTee, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pTee));
hr = pGraph->AddFilter(pTee, L"Tee");

// Add the File Source filter to the graph.
IBaseFilter *pFileSource;
hr = pGraph->AddSourceFilter(
    L"C:\\YourFileNameHere.avi",
    L"Source", 
    &pFileSource);

// Add the AVI Splitter filter to the graph.
IBaseFilter *pAviSplit;
hr = CoCreateInstance(CLSID_AviSplitter, 0, CLSCTX_INPROC_SERVER
    IID_IBaseFilter, reinterpret_cast<void**>)(&pAviSplit));
hr = pGraph->AddFilter(pAviSplit, L"AVI Splitter");

// Connect the file source to the AVI Splitter.
hr = pBuilder->RenderStream(0, 0, pFileSource, 0, pAviSplit);
if (FAILED(hr))
{
    // This is not an AVI file. 
}

// Connect the file source to the Infinite Pin Tee.
hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pAviSplit, 0, pTee);
if (FAILED(hr))
{
    // This is not a type-1 DV file.
}

// Render one stream from the Infinite Pin Tee to MSDV, for transmit.
hr = pBuilder->RenderStream(0, 0, pTee, 0, pDV);

// Render another stream from the Infinite Pin Tee for preview.
hr = pBuilder->RenderStream(0, 0, pTee, 0, 0);
  1. 呼叫 IGraphBuilder::AddSourceFilter,將來源篩選新增至篩選圖形。
  2. 建立 AVI 分隔器和無限針腳 Tee,並將其新增至圖形。
  3. 呼叫 ICaptureGraphBuilder2::RenderStream,將來源篩選連接到 AVI 分割器。 指定MEDIATYPE_Interleaved以確保如果來源檔案不是 type-1 DV 檔案,則方法會失敗。 在此情況下,您可以反轉並嘗試建置 type-2 傳輸圖表。
  4. 再次呼叫 RenderStream,將交錯數據流從 AVI 分割器路由傳送到無限針腳 Tee
  5. 第三次呼叫 RenderStream,將一個串流從 Infinite Pin Tee 路由傳送至 MSDV 篩選器,以傳輸至裝置。
  6. 呼叫 RenderStream 一次,以建置圖形的預覽區段。

如果您不想要預覽,只要將檔案來源連線到 MSDV 篩選:

hr = pBuilder->RenderStream(0, &MEDIATYPE_Interleaved, pFileSource, 0, pDV);

DirectShow 中的數位視訊